阪神バス神戸西宮線の接近情報のリンク集を作った
- 投稿日:
Webツール置き場に阪神バス神戸西宮線の接近情報のリンク集を作った。
阪神バスに乗るときに時刻表代わりに接近情報を見ることが多いのだが、この接近情報は開くのに非常に手間がかかる難点があり、パッと開ける仕組みが欲しかった。
ブックマークできることからURLが存在することは知っていたので全部網羅したリンク集を作っておけば困ることが減るのでは?と思い、作ることにした。
URLフォーマットの解析
しかしURLのフォーマットが難儀でやや苦労した。フォーマットは以下のような感じだ。可読性のためURL Encodeは外してあるが、実際にはURL Encodeされている。
https://rosen.hanshin-bus.co.jp/busstatedtl?mode=4&fr=<バス停名>&frsk=B&tosk=&dt=<yyyymmdd0000>&dgm=<バス停名>:&dgmpl=<バス停名>:<上下コード>:1&p=0,8,9&IncludeHankyu=0&pole_station_code=<バス停コード>
各パラメーターの役割について、値とパラメーター名から幾らか推定はできたが、幾らか消したり足したりしながら試行錯誤していても、正直よくわからない部分が多かった。
例えばfr
とdgm
はなくても動くっぽいので最悪削ってもいいのだが、dgmpl
が曲者で、ここに正規のバス停名が入ってないとサーバーから応答が来なくなる。またfr
とdgm
をhoge
にして、dmgpl=hoge:2:1
みたいにするとバス停検索画面に遷移し機能しなくなった。また、dt
は数年前の日付をしても動くので恐らく機能には深く関わってなさそうだった。
恐らくこういった挙動からして、裏側でバス停名による検索を走らせてるのではないか?と考えたり、まぁ色々ありそうな気もしたのだが、面倒なのでパラメーターは全部残すことにした。
バス停の特定なんか、pole_station_code=<バス停コード>
で全部やればいいじゃんとも思うのだが、恐らく歴史的経緯で複数のサブシステムが関連しており、上手く整合が取れていないのだろう。
正規バス停名の取得
しかし、こうなると正規のバス停名を取得するのが手間だった。何せ文字列で一気に取れる一覧がないのだ。悩みつつ何かないか探しているとバス停コードからバス停名を取得できる便利なAPIを見つけたので、これを使うことにした。
次のようなスクリプトを書くとバス停名が取れたため、適当にバス停コードに1~500辺りを設定し流してみると上手いこと行った。
curl 'https://rosen.hanshin-bus.co.jp/listrosenzucode' -H 'user-agent: hoge-bot' --data-raw 'qry=<バス停コード>' | perl -ne '/"name": "(.+?)"/; print "$1"'
HTMLの生成とリンク集の作成
ここまでくれば後は簡単だ。この結果からリンク集を作るためのHTMLを生成すればいい。そして出来たのが記事先頭で紹介した阪神バス神戸西宮線の接近情報のリンク集だ。これでどのバス停にいるときでも瞬時に接近情報を開くことができるようになった。
ろくにCSSを書いていないので見た目が簡素だが、気が向いたら調整しようとは思う。
あとがき
バス停コードからバス停名を取得するためのhttps://rosen.hanshin-bus.co.jp/listrosenzucode
というAPIを見たとき、これを呼んでいるのがJavaScriptだったので、JSにハードコードしておくか、マッピングを書いたJSONなりXMLを転がしておけば一々APIを作らずともよく、サーバーのCPU時間や帯域も使わずに済むので良くないか?とか思ったが、きっと色々あるのだろうと思い、深く気にしないことにした。