Rubyから駅すぱあとWebAPIを使ってみる話。

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)、5日目はRubyから駅すぱあとWebAPIを使ってみる話を書こうと思います。

[1日目の記事](http://qiita.com/valsitoh/items/37e18cb76944cc7d05fe)でご紹介した、[駅すぱあとWebサービス](https://ekiworld.net/service/sier/webservice/index.html)の[フリープラン](https://ekiworld.net/free_provision/index.php)で利用できる機能に[駅すぱあと for web URL生成](http://docs.ekispert.com/v1/le/api/search/course/light.html)があります。

 * [駅すぱあとWebサービス - フリープラン Documents](http://docs.ekispert.com/v1/le/)

これは探索結果を[駅すぱあと for web](http://roote.ekispert.net)のURLの形で取得できるAPIとなっています。今回はこの機能を例にして、Rubyから駅すぱあとWebAPIを使ってみます。

## Rubyから駅すぱあとWebAPIを呼び出してみる

利用形態として、端末(Macのターミナルとか)から出発駅と到着駅を指定すると、探索結果URLを取得するという形のスクリプトにしてみます。
URLのリクエストを送るところをはプロキシを考慮した冗長な処理になっていますが、基本的にはURLリクエスト→JSONをパースしたハッシュから必要な要素を取り出す、というシンプルな処理になるかと思います。

WebAPIのアクセスキーは環境変数`EKISPERT_ACCESS_KEY`(任意の名前でOKです)から取得する形で利用しています。駅名については[3日目の記事](http://qiita.com/valsitoh/items/ebd0d279a13fd21cbfec)で解説しているように、駅コードに変換して利用しています。

```ruby
#!/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"]
```

[ドキュメント](http://docs.ekispert.com/v1/le/)の"[response](http://docs.ekispert.com/v1/le/api/search/course/light.html#response)"の項目をみると、`ResultSet/ResourceURI`で探索結果へのURLが取得できることがわかります。
実行例は以下のようになります。

```shell-session
$ ./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)](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/open.1.html)コマンドに渡すと、Webブラウザで[駅すぱあと for web](http://roote.ekispert.net)のサイトを開いてくれます。
端末から探索実行→結果はWebブラウザで確認、というちょっと便利な使い方ができます。
(あくまでもサンプル的な位置付けて作成していたスクリプトですが、個人的には地味に便利だと思っています...)

```shell-session
$ open `./SearchCoursePlain.rb 東京 高円寺`
```

## まとめ

Rubyから駅すぱあとWebAPIを呼び出す例を紹介してみました。今回のサンプルでは、駅名の候補の中から完全に一致するものを用いる形になっていますが、複数の候補から対話的に駅名を選択したり、探索条件を指定できるようにするとより便利になるかと思います。