2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ヴァル研究所Advent Calendar 2016

Day 5

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

Last updated at Posted at 2016-12-05

ヴァル研究所 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を呼び出す例を紹介してみました。今回のサンプルでは、駅名の候補の中から完全に一致するものを用いる形になっていますが、複数の候補から対話的に駅名を選択したり、探索条件を指定できるようにするとより便利になるかと思います。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?