人生ずっと勉強

人生ずっと勉強ですね。 https://twitter.com/KiyotakaGoto

Bing API on Ruby

気をつけること

  • Bing Search API – Quick Start and Code Samples に載ってるサンプル php コードで指定している Authorization ヘッダの指定の仕方は間違っているので真似しない。実際はアカウント名は空文字列、パスワードに accout_key を使う。
  • なぜかクエリはシングルクォーテーションで囲まないと認識されない
  • net/http, net/https のどちらでも叩ける
  • HTTP メソッドは POST でも GET でもどちらでもよいっぽい

Sample code

net/http, Net::HTTP::Get ver.

require 'net/https'

class BingWrapper

  def initialize( account_key )
    @account_key = account_key
    @uri_base    = 'https://api.datamarket.azure.com/Bing/Search/Image?$format=json&Query='
  end

  def get( unencoded_query )
    # I don't know why, but single quotaition is needed to specify a Query.
    uri = URI.parse( "%s'%s'" % [@uri_base, URI.encode( unencoded_query )] )

    req = Net::HTTP::Get.new( uri.request_uri )
    req.basic_auth( '', @account_key)
    res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https'){ |http|
      http.request(req)
    }

    return res.body
  end
end

net/https, Net::HTTP::Post ver.

require 'net/https'

class BingWrapper

  def initialize( account_key )
    @account_key = account_key
    @uri_base    = 'https://api.datamarket.azure.com/Bing/Search/Image?$format=json&Query='
  end

  def get( unencoded_query )
    # I don't know why, but single quotaition is needed to specify a Query.
    uri = URI.parse( "%s'%s'" % [@uri_base, URI.encode( unencoded_query )] )

    https = Net::HTTP.new( uri.host, uri.port )
    https.use_ssl = true
    https.verify_mode = OpenSSL::SSL::VERIFY_NONE

    req = Net::HTTP::Post.new( uri.request_uri )
    req.basic_auth( '', @account_key )
    res = https.request( req )
    return res.body
  end
end

余談

    res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https'){ |http|
      http.request(req)
    }

この書き方いいなぁと思った。