現在地の頭痛ーる情報を教えてくれるiOSショートカットを作る
完成イメージ
ショートカットをタップすると、こんな通知が表示されます。
概要
低気圧で頭痛がひどいのでslackで頭痛ーるを表示するappをlambdaで作った
という記事に、同じ頭痛持ちとして大変感銘を受けました(頭痛ーるなんて初めて知った…!)。
素晴らしい記事をありがとうございます。
真似しようと思いましたが頭痛であまり気力も出ず、「もっと楽に実装したいなぁ」
ということでiOSのショートカット機能を使って現在地の頭痛予報を一言で通知してくれるショートカットを作成しました。
本記事では元記事に+αという形で
- 頭痛ーるAPI(地名検索)の使い方
- ショートカットを使った実装
について説明します。
頭痛ーるAPI(地名検索)の使い方
頭痛ーるAPIでは市区町村名に対応したidが振られています。これは以下のように頭痛予報をリクエストする際に必要となるため、市区町村名からidを受け取るメソッドを使ってから投げることにします。
https://zutool.jp/api/getweatherstatus/<id>
ブラウザの検証から調べた結果、地名検索のメソッドは以下のURLから使用できるようです。
https://zutool.jp/api/getweatherpoint/<市区町村名>
試しに千代田区のidを調べてみます。
レスポンスresult
内のcity_code
が今回必要となるidになります。元記事で得られている結果と同様となっていますね。
$ curl https://zutool.jp/api/getweatherpoint/千代田区 | jq
<中略>
{
"result": "[{\"city_code\":\"13101\",\"name_kata\":\"\\uff81\\uff96\\uff80\\uff9e\\uff78\",\"name\":\"\\u6771\\u4eac\\u90fd\\u5343\\u4ee3\\u7530\\u533a\"}]"
}
ショートカットを使った実装
ショートカットではAppやアクション(変数設定や場所取得など)をうまく組み合わせながら実現したい機能を作成していきます。
今回は、以下の手順をiPhoneを使って実装してみます。
- 地名検索メソッドでid取得
- 得られたidを用いて現在地の頭痛予報を取得
- 現在時刻の気圧レベルに基づきプッシュ通知
ショートカットを開き、右上の「+」ボタンを押してショートカットを新規作成します。
1. 地名検索メソッドでid取得
現在地(市区町村名)の取得には、iOSで提供されたアクションを利用します。
「場所」カテゴリの「場所」を挿入し、入力値に「現在地」を選択します。
(「現在地を取得」というアクションもありますが、住所の形で返されるのでパースが必要です)
右下の再生ボタンを押すとショートカットのテストができます。
また、APIリクエストは「URLの内容を取得」を使います。
地名検索のURLを入力し、末尾に現在地の「市区町村」を追記します。
2. 得られたidを用いて現在地の頭痛予報を取得
頭痛予報の取得も「URLの内容を取得」アクションを利用することで可能です。
1で得られた結果(JSON)は辞書として変数に格納されます。ここからcity_code
を抜き出すには変数.city_code
のようにドットでつなげていきます。これを頭痛予報APIのURLに追記しましょう。
頭痛予報から現時刻の気圧レベルをtoday.(hour+1).pressure_level
で抜き出します。
hour
は予め「現在の日付」アクションからHH
のフォーマットで変数として格納し、「計算」でインクリメントしておきます。
3. 現在時刻の気圧レベルに基づきプッシュ通知
気圧レベルは頭痛ーるで以下のように定義されています。
-
0,1
: 通常 -
2
: やや注意 -
3
: 注意 -
4
: 警戒
2で受け取った値にしたがってif文で条件分岐を設け、「通知」アクションで「地名+テキスト」の形で一言で頭痛予報を表示させます(スクショが異常に多くなるので省略)。
現在地名を入力するには、下画面の○部分「マジック変数」をタップしてショートカット中の参照したいアクションを選択します。
さいごに
正直iPhoneをポチポチするだけでここまでできるとは思っていませんでした。。
恐るべしショートカット機能。
ただif文が煩雑になりやかったり、細かい操作ができなかったりはコーディングとトレードオフだったりするのでしょうか。うまく使い分けたいですね。
実際のところ、自分の頭痛は気圧が原因なのかどうかがわからないところもあるので、今後はこれを使って関連を記録していこうと思います。
Discussion