ヴァル研究所 Advent Calendar 2016、5日目はRubyから駅すぱあとWebAPIを使ってみる話を書こうと思います。
1日目の記事でご紹介した、駅すぱあとWebサービスのフリープランで利用できる機能に駅すぱあと for web URL生成があります。
これは探索結果を駅すぱあと for webのURLの形で取得できるAPIとなっています。今回はこの機能を例にして、Rubyから駅すぱあとWebAPIを使ってみます。
Rubyから駅すぱあとWebAPIを呼び出してみる
利用形態として、端末(Macのターミナルとか)から出発駅と到着駅を指定すると、探索結果URLを取得するという形のスクリプトにしてみます。
URLのリクエストを送るところをはプロキシを考慮した冗長な処理になっていますが、基本的にはURLリクエスト→JSONをパースしたハッシュから必要な要素を取り出す、というシンプルな処理になるかと思います。
WebAPIのアクセスキーは環境変数EKISPERT_ACCESS_KEY
(任意の名前でOKです)から取得する形で利用しています。駅名については3日目の記事で解説しているように、駅コードに変換して利用しています。
#!/usr/bin/env ruby
# coding: utf-8
require 'net/http'
require 'uri'
require 'erb'
include ERB::Util
require 'json'
# URLリクエストを投げる
def request(url_str)
url = URI.parse(url_str)
req = Net::HTTP::Get.new(url.request_uri)
if ENV['http_proxy'] != nil
ENV['http_proxy'] =~ /http:\/\/(.*?):(.*?)\//
proxy = Net::HTTP::Proxy($1, $2)
res = proxy.start(url.host, url.port) {|http|
http.request(req)
}
else
Net::HTTP.start(url.host, url.port) {|http|
http.request(req)
}
end
end
exit(1) if ARGV.length < 2
# アクセスキー
key = ENV['EKISPERT_ACCESS_KEY']
# 出発駅の駅コードを得る
url_str = "http://api.ekispert.jp/v1/json/station/light?key=#{key}&name=#{url_encode(ARGV[0])}"
from_code = JSON.parse(request(url_str).body)["ResultSet"]["Point"][0]["Station"]["code"]
# 到着駅の駅コードを得る
url_str = "http://api.ekispert.jp/v1/json/station/light?key=#{key}&name=#{url_encode(ARGV[1])}"
to_code = JSON.parse(request(url_str).body)["ResultSet"]["Point"][0]["Station"]["code"]
# 探索結果を駅すぱあと for webのURLとして取得する
url_str = "http://api.ekispert.jp/v1/json/search/course/light?key=#{key}&from=#{from_code}&to=#{to_code}"
puts JSON.parse(request(url_str).body)["ResultSet"]["ResourceURI"]
ドキュメントの"response"の項目をみると、ResultSet/ResourceURI
で探索結果へのURLが取得できることがわかります。
実行例は以下のようになります。
$ ./SearchCoursePlain.rb 東京 高円寺
http://roote.ekispert.net/result?arr=%E9%AB%98%E5%86%86%E5%AF%BA&arr_code=22671&connect=true&dep=%E6%9D%B1%E4%BA%AC&dep_code=22828&highway=true&hour&limitedExpress=true&liner=true&local=true&minute&plane=true&shinkansen=true&ship=true&sleep=false&sort=time&surcharge=3&type=dep&via1=&via1_code=&via2=&via2_code=
実際に使ってみる
Rubyスクリプトから取得した探索結果のURLをopen(1)コマンドに渡すと、Webブラウザで駅すぱあと for webのサイトを開いてくれます。
端末から探索実行→結果はWebブラウザで確認、というちょっと便利な使い方ができます。
(あくまでもサンプル的な位置付けて作成していたスクリプトですが、個人的には地味に便利だと思っています...)
$ open `./SearchCoursePlain.rb 東京 高円寺`
まとめ
Rubyから駅すぱあとWebAPIを呼び出す例を紹介してみました。今回のサンプルでは、駅名の候補の中から完全に一致するものを用いる形になっていますが、複数の候補から対話的に駅名を選択したり、探索条件を指定できるようにするとより便利になるかと思います。