iOS

Pythonista3でホーム画面から1タップで乗換情報や家までのルートを開く

乗換アプリが不便。現在時刻でのいつものルートを検索するのにアプリ立ち上げて行先指定するのはだるい。ルート登録はあってもそれを呼び出すのもだるい。目が悪すぎて駅ホームの電光掲示板は読めない。

Google Mapsでは通勤情報がすぐ呼び出せるのは便利なんだけど、これでも2タップいる。ホーム画面から今この瞬間の乗り換え情報を秒速で開きたい。ということでその辺をいじる。

Pythonista3のスクリプトをホーム画面に登録

最初iOSのショートカットでやろうと思ってたんだけど、普通にpython書いてPythonista3で走らせた方が楽なのでやめた。何もかもPythonでやる人なので。ホーム画面から直に特定ルートの現在時刻の乗り換えに飛べるURLを書いてホーム画面に登録すればいい。

まずジョルダンの乗換案内をブラウザで開き、現在時刻(2019年12月19日 16時46分)での本山→塩釜口のルート検索をすると、URLは https://www.jorudan.co.jp/norikae/cgi/nori.cgi?Cmap1=&rf=nr&via_on=1&pg=0&eok1=R-&eki1=本山(愛知)&eok3=&eki3=&eok4=&eki4=&eok5=&eki5=&eok6=&eki6=&eok2=R-&eki2=塩釜口&Cway=0&Dym=201912&Ddd=19&Dhh=16&Dmn=46&Cfp=1&C2=0&C4=0&C3=0&C6=2&C1=0&S=検%E3%80%80索 って感じになる。

めちゃくちゃわかりやすいURLですね。ただ現在時刻みたいな指定ではなく絶対時間での指定になっている。これを検索した時間から考えて、 Dym=201912&Ddd=19&Dhh=16&Dmn=46 という文字列が 2019年12月19日 16時46分 に対応しているのがわかる。

ちなみに最後の S=検%E3%80%80索 を切ると検索前の画面になる。ここカテゴリカルに数字指定とかにしときゃいいのに。バグの温床になりそうな気しかしない。

ということで余計な引数を削ぎ落として動くか確認。

https://www.jorudan.co.jp/norikae/cgi/nori.cgi?eki1=本山(愛知)&eki2=塩釜口&Dym=201912&Ddd=19&Dhh=16&Dmn=46&S=検%E3%80%80索

あとはこのURLに現在時刻を取得して流し込めば終わる。ただしPythonista3では2バイト文字が入っているとURLとして認識されないっぽいのでエンコードしておくこと。もちろんスクリプト内でエンコードすることは可能だけど、一瞬で乗り換えを確認したいという関係上動作は極力早くないと困るので、スクリプト内での処理はなるべく少なくエンコード後の文字列を使う。

ちなみにobjc_utilからUIApplicationを呼び出せば作成したURLをopenURLでSafariに渡せる。

できたのが、

# coding: utf-8
from datetime import datetime
from objc_util import UIApplication, nsurl

def main(route=1):
    t = datetime.now()
    dest = [
        '%E6%9C%AC%E5%B1%B1%EF%BC%88%E6%84%9B%E7%9F%A5%EF%BC%89', 
        '%E5%A1%A9%E9%87%9C%E5%8F%A3'
        ]
    url = 'https://www.jorudan.co.jp/norikae/cgi/nori.cgi?eki1='+dest[0+1*route]+'&eki2='+dest[1-1*route]+'&Dym='+str(t.year)+str(t.month)+'&Ddd='+str(t.day)+'&Dhh='+str(t.hour)+'&Dmn='+str(t.minute)+'&S=%E6%A4%9C%25E3%2580%2580%E7%B4%A2'
    UIApplication.sharedApplication()._openURL_(nsurl(url))
    
if __name__ == '__main__':
    main()

iCloud上に新規スクリプトを作成して、それをMacのVSCodeで開いて編集すれば保存するたびにhands offで更新されていく。劇的に便利。

ちなみにUIApplicationではなくwebbrowserを使うとPythonista 3上のウェブUIで開く形になる。

import webbrowser as wb
wb.open_new(url)

とはいえわざわざPythonistaで開く必然性もない。

これをあとはホーム画面に追加する。

んでこれをタップすると即座にSafariが立ち上がってジョルダンの乗換案内の結果が表示される。めっちゃ簡単。

…てかよく考えたら別にSafariで開く必要ないじゃん。タブ閉じるのめんどいし。ジョルダンの乗換案内のURIスキーム(NrkjFree://)使って呼べばよかったんじゃん。とは思っているものの、スキーマの中身を調べるのが面倒なのでまた今度にする。

そしてこの感じなら同じような感じで現在地から自宅までのルートをGoogle Mapsで1タップ秒速で表示するショートカットとかも作れる。Google MapsのURIスキームはcomgooglemaps:// で、中身は普通にQiitaとかに落ちてるので、こっちはスキーマでやってみることに。ということで、

# coding: utf-8
from objc_util import UIApplication, nsurl

def main():
    dest1 = '%E7%8F%BE%E5%9C%A8%E5%9C%B0' #現在地
    dest2 = '%E8%87%AA%E5%AE%85' #自宅
    url='comgooglemaps://?saddr='+dest1+'&daddr='+dest2+'&directionsmode=transit'
    UIApplication.sharedApplication()._openURL_(nsurl(url))
    
if __name__ == '__main__':
    main()

Googleマップは緯度経度指定が一番正確だけど、あらかじめマップに「自宅」「職場」とか追加さえしておけば、あとはルート検索時に「現在地」から「自宅」とかやるだけでいい感じにしてくれる。

便利だ。知っているとは素晴らしい。