西武バスの経路検索サイトは、乗車駅、降車駅を毎回設定してから検索ボタンを押します。通勤経路のように毎回同じ駅で乗り降りする場合に、自宅で検索する時は自宅近くの駅から会社近くの駅まで、会社で検索した場合はその逆、で検索するショートカットを作りました。このショートカットのボタンをホーム画面に作っておけば、毎回1クリックで会社までや自宅までのバス時間が検索できます。
西武バスの経路検索サイトは入力ページのフォームに入力した乗車駅、降車駅、乗車日時をURLの形で検索サイトに投げることでバスの検索を実現しています。このURLのフォーマットをハックして知りたい区間や時間を設定したURLを作れば、それに従って検索結果を表示してくれます。
処理の流れは、
- バス停名とバス停コードの設定
- 現在地の取得
- 現在時刻の取得
- 現在地に従った乗車駅降車駅駅までの所用時間の設定
- バス停名からバス停コードの取得
- 現在時刻を年月日時分に分割
- バス停と時刻の情報をURLのフォーマットに設定
- SafariにURLを渡して検索表示
となります。
以下の説明では、自宅の近くのバス停は自宅のすぐ前(徒歩0分)で「自宅近くのバス停」と言う名前、会社近くのバス停は会社から徒歩13分で「会社近くのバス停」と言う名前とし、自宅住所は「中野区」とします。
*サイトの仕様が変更になったらしく、iPhoneでエラーになっていた部分を修正しました(2020.7.24)
# アクションと解説
バス停名とバス停コードの設定
バス停の名前を変数に設定して、対応するバス停コードを辞書のフォーマットで設定します。バス停のコードは西武バスの経路検索サイトで検索すると出力されるページのURLから読み取ります。バス停の名前も(カッコやスペース等も含めて)この出力で使われている文字列を使ってください。
現在地と時刻を取得して、乗車、降車駅とバス停到着時刻を設定
現在位置を取得します。「天気」アクションを用いているのは反応を速くするためで、詳しくは “iosのショートカットTips” を見てください。現在位置の情報からは郵便番号や住所などさまざまな要素が選べるので、自宅と会社を区別できる要素を使って、乗車駅、降車駅、乗車駅の自分の到着時刻設定します。ここでは自宅は中野区にあり、会社は別の住所だとして、「市区町村」文字列に「中野区」が含まれるかどうかで判断しています。
「カレンダー」アクションは現在時刻の取得とその時刻に対する計算もしてくれるので、会社でこの検索を行ないバス停まで徒歩で13分かかるという場合のバス停の到着時刻を1アクションで設定できます。
駅名から駅コードの取得と現在時刻を年月日時分に分割
辞書に登録しているバス停コードを駅名から取りだします。
「調整済みの日付」(乗車バス停への到着時刻のマジック変数名)から年月日、時、分、を後のURLに使えるフォーマットで取り出します。取り出し方の詳細は “iosのショートカットTips” を見てください。
カスタムフォーマットは次の表のとおりです
フォーマット | 例 | |
---|---|---|
年月日 | yyyyMMdd | 20200709 |
時 | HH | 08 |
分 | mm | 03 |
バス停と時刻の情報をURLのフォーマットに設定しSafariに渡して検索結果を表示
ここまでで設定したバス停名と乗車時刻の情報を西武バスの検索サイトのフォーマットに合わせてURLの文字列を作り、2バイト文字列の処理のためURLエンコードを行ない、エンコードした文字列を使ってSafariで表示します。図ではURL切れていますが、全文は以下の文字列です
https://transfer.navitime.biz/seibubus-dia/smart/transfer/TransferSearch?targetstart=&roughEstimate=co2&startName=乗車駅&start=&start=&orvCode=0.0.乗車駅コード.乗車駅&orvAdd=...&startPosType=&orvPosType=4&goalName=降車駅&goal=&goal=&dnvCode=0.0.降車駅コード.降車駅&dnvAdd=...&goalPosType=&dnvPosType=4&day=年月日&hour=時&minute=分&year=&month=&basis=1&sort=2&wspeed=standard&method=2&useRouteMethodDefault=2&type=
思った通りに動作しましたでしょうか? 結果が思い通りでない場合やエラー表示になる場合は、アクションが出力するURL文字列と、通常通りにマニュアル入力で検索した場合の結果表示のURLとの違いからデバッグしてみてください。
Good luck !