LoginSignup
3
3

More than 5 years have passed since last update.

Ruby で Yahoo!ローカルサーチAPI をコールするサンプルコード

Posted at

ソースコード

require 'json'
require 'net/http'
require 'resolv-replace'
require 'uri'

class LocalSearch

  def initialize(appid)
    @appid = appid
  end

  private

  def get(url, headers)
    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.open_timeout = 3
    http.read_timeout = 3
    res = http.start do |http|
      http.get(uri.request_uri, headers)
    end
    # 左辺にクラス、右辺にインスタンス
    if Net::HTTPSuccess === res
      res.body
    else
      res.value # 例外を発生させる
    end
  end

  def json2pois(json)
    result = []
    data = JSON.parse(json)
    data['Feature'].each do |f|
      if f['Geometry']['Type'] == 'point'
        ll = f['Geometry']['Coordinates'].split(',')
        result << {'name' => f['Name'], 'lat' => ll[1], 'lon' => ll[0]}
      end
    end
    result
  end

  public

  def search(query)
    base_url = 'https://map.yahooapis.jp/search/local/V1/localSearch'
    params = {
      'query' => query,
      'output' => 'json',
      'results' => '3',
      'sort' => 'score'
    }
    url = base_url + '?' + URI.encode_www_form(params)
    headers = {'User-Agent' => "Yahoo AppID: #{@appid}"}
    json = get(url, headers)
    json2pois(json)
  end
end

begin
  appid = 'YOUR APPLICATION ID' # アプリケーションIDを指定
  query = '東京タワー'
  pois = LocalSearch.new(appid).search(query)
  pois.each do |p|
    puts "#{p['name']}\n #{p['lat']}, #{p['lon']}\n\n"
  end
rescue Exception => e
  puts "ERROR: #{e.message}"
end

実行結果

$ ruby localsearch.rb 
東京タワー大展望台 club333特設ステージ
 35.65870316, 139.74540779

東京タワー
 34.729707500000, 136.519455833333

マザー牧場CAFE東京タワー店
 35.658703055556, 139.745407777778

参考資料

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3