ヴァル研究所が提供している、公共交通機関の乗り換え検索アプリケーション「駅すぱあと」のREST APIを呼び出して、駅名称から「駅すぱあと」内部で利用している駅コードを検索するAppleScriptです。
(「47都道府県鉄道路線図」より引用)
「駅すぱあと」はほぼ日本人なら(とくに首都圏に住んでいると)誰でも知っている、電車をはじめとする公共交通機関の乗り換え情報を検索するアプリケーションです。
本来、AppleScriptと相性の良い処理のはずなのですが、Mac版のアプリケーションが最近は提供されておらず、さらに昔のMac版のアプリケーションもAppleScriptに対応していなかったので、長らく接点がありませんでした。
そんな中、「駅すぱあと」のREST APIが試用できるようになっていることを知り、さっそくサインアップして「駅すぱあとWebサービス スタンダードプラン」90日試用コードを取得してみました。掲載の本Scriptをためしてみる場合には、かならずご自分で試用コードを取得してScript末尾にあるハンドラに記入してから実行してください。そのまま実行するとエラーになります。
ドキュメントもよく整備されており、首をひねるような仕様もなく、日本国内で提供されているREST APIとしては非常によく整理されているといえます。
本来はいきなり経路検索を行いたかったのですが、経路検索を行うのに、駅固有のユニークコードである「駅コード」を調べられないと困るので、まずは駅コードから駅名称を調べたり、駅名称から駅コードを調べるAppleScriptを書いてみました(羽田空港からの帰りのバスの中で)。
これで、MacのExcelやFileMaker Pro、Numbersといったアプリケーションの書類上に入れたデータから経路検索を行なってこれらのアプリケーションのデータに返すことができるようになったわけで、応用範囲はきわめて広いといえます。
AppleScript名:(GET)駅すぱあとAPIで駅コード検索 |
— Created 2018-03-16 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" –macOS 10.11 or later use scripting additions use framework "Foundation" set aURL to "https://api.ekispert.jp/v1/json/station/light" set apiKey to retAccessToken() of me set aRec to {|key|:apiKey, |name|:"羽田空港国内線ターミナル", type:"train"} set reqURLStr to retURLwithParams(aURL, aRec) of me set aRes to callRestGETAPIAndParseResults(reqURLStr) of me set aRESCode to (responseCode of aRes) as integer if aRESCode is not equal to 200 then return false set aRESHeader to responseHeader of aRes set aRESTres to (json of aRes) –NSDictionaryで返ってくる set staCode to (aRESTres’s valueForKeyPath:"ResultSet.Point.Station.code") as list of string or string –as anything –> 22854 –GET methodのREST APIを呼ぶ on callRestGETAPIAndParseResults(aURL) set aRequest to current application’s NSMutableURLRequest’s requestWithURL:(current application’s |NSURL|’s URLWithString:aURL) aRequest’s setHTTPMethod:"GET" aRequest’s setValue:"gzip" forHTTPHeaderField:"Content-Encoding" set aRes to current application’s NSURLConnection’s sendSynchronousRequest:aRequest returningResponse:(reference) |error|:(missing value) set resList to aRes as list set bRes to contents of (first item of resList) set resStr to current application’s NSString’s alloc()’s initWithData:bRes encoding:(current application’s NSUTF8StringEncoding) set jsonString to current application’s NSString’s stringWithString:resStr set jsonData to jsonString’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set aJsonDict to current application’s NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) –Get Response Code & Header set dRes to contents of second item of resList if dRes is not equal to missing value then set resCode to (dRes’s statusCode()) as number set resHeaders to (dRes’s allHeaderFields()) as record else set resCode to 0 set resHeaders to {} end if return {json:aJsonDict, responseCode:resCode, responseHeader:resHeaders} end callRestGETAPIAndParseResults on retURLwithParams(aBaseURL, aRec) set aDic to current application’s NSMutableDictionary’s dictionaryWithDictionary:aRec set aKeyList to (aDic’s allKeys()) as list set aValList to (aDic’s allValues()) as list set aLen to length of aKeyList set qList to {} repeat with i from 1 to aLen set aName to contents of item i of aKeyList set aVal to contents of item i of aValList set the end of qList to (current application’s NSURLQueryItem’s queryItemWithName:aName value:aVal) end repeat set aComp to current application’s NSURLComponents’s alloc()’s initWithString:aBaseURL aComp’s setQueryItems:qList set aURL to (aComp’s |URL|()’s absoluteString()) as text return aURL end retURLwithParams on retAccessToken() return "xxxx_XXxxXXXxxXX" –API Key end retAccessToken |