🍏

Siri から「ごはんですよ」と呼びかけて Slack ステータスと DND を設定する

2024/09/26に公開

お昼休みの時間は固定化されていないフレキシブルなフルリモート環境で働いています。

お昼休憩は仕事の通知を忘れてご飯を楽しみたい!ある程度早い反応を期待されるチャットにおいて 1 時間ほど反応できないことはチャット上で周知しておきたい!

毎日お昼休憩のたびにポチポチ UI を触ってステータスや DND を変更するのが手間なため、「Hey Siri! ごはんですよ」と音声入力するだけでお昼休憩をチャットで表明しておけるようにしました。

今回 Slack API を使って Apple のショートカットアプリを呼び出すのに苦労したため、手順を残しておきます。

Slack ユーザートークンを発行する

アプリを作成する

自分自身のステータスや DND を変更するために Slack ユーザートークンを発行するアプリを作成します。
https://api.slack.com/concepts/token-types#user

アプリページを開き、 Create New App > From scratch からアプリを新規に作成します。

https://api.slack.com/apps

スコープを追加する

サイドバーにある OAuth & Permission を開いて User Token Scopes までスクロールします。
Add an OAuth Scope から users.profile:writednd.write スコープを追加します。

アプリから API を使ってステータスと DND を書き換えられるようになります。

アプリを組織にインストールする

サイドバーにある Install App を開き、アプリを利用するワークスペースにインストールするための Slack OAuth 確認画面へ進みます。

インストールを承認すると User OAuth Token が発行されトークンを利用する準備が整います。

Slack API を呼び出すショートカットを作成する

Shortcuts アプリを開いて + ボタンから新規ショートカットを作成します。
Title は ごはんですよ にします。このタイトルが Siri に呼びかける魔法の言葉になります。

ランチごはんなどの名詞をタイトルに設定しても Map アプリが優先的に呼ばれるようでした。

実行現在日時を取得するアクションを登録する

アクション一覧から Date を選択して開きます。
実行する現在日時を取得するため、初期値の Current Date のままにします。

実行現在日時に 1 時間追加するアクションを登録する

アクション一覧から Adjust Date を選択して開きます。
Add 60 minutes to Date に変更します。

UNIX エポックの日時を取得するアクションを登録する

アクション一覧から Date を選択して開きます。
Specified Date に変更し 1970/01/01 09:00 を設定します。

Slack のステータスに期限を設ける時間には UNIX 時間が要求されます。
https://api.slack.com/apis/presence-and-status#writing-custom-statuses

UNIX 時間とは協定世界時 (UTC) での 1970 年 1 月 1 日午前 0 時 0 分 0 秒(UNIX エポック)からの経過秒数です。まずはこの日時を取得するアクションを登録します。

日本は UTC より 9 時間進んでいるため、1970 年 1 月 1 日午前 0 時 0 分 0 秒に 9 時間追加した時間を指定しています。

休憩終了秒数を取得するアクションを登録する

アクション一覧から Get Time Between Dates を選択して開きます。
Get Seconds between Date and Adjusted Date に変更します。

休憩終了時間と UNIX エポックの秒数を計算します。この秒数を API パラメーターの status_expiration に渡します。

Date は UNIX エポック、 Adjusted Date は実行現在日時に 1 時間追加したものを参照しています。 Shortcuts (v7.0 時点) は変数に名前をつけられないため混乱しやすいです。

ステータスを更新する API を呼ぶ

アクション一覧から Get Contents of URL を選択して開きます。
Get Contents of https://slack.com/api/users.profile.set に変更します。

Show More を押して Method を POST に変更します。
Headers に以下の 2 項目を追加します。

Key Value
Content-type application/json; charset=utf-8
Authorization Bearer xoxp-****-****-****

Bearer のあとの xoxp-****-****-**** には、アプリをインストールしたときの User OAuth Token を入力します。

Request BodyJSON を指定し、以下の項目を設定します。

Key Type Value
profile Dictionary

さらに Dictionary に指定した profile 変数にパラメーターを追加していきます。

Key Type Value
status_text Text Lunch
status_emoji Text :rice_ball:
status_expiration Number Time Between Dates

status_textstatus_emoji はお好みのメッセージ、絵文字を設定できます。
status_expiration は休憩終了秒数が格納されている Time Between Dates を指定します。

DND を 1 時間有効にする API を呼ぶ

アクション一覧から Get Contents of URL を選択して開きます。
Get Contents of https://slack.com/api/dnd.setSnooze に変更します。

Show More を押して Method を POST に変更します。
Headers にステータスと同じ項目を入力します。

Request BodyJSON を指定し、以下の項目を設定します。

Key Type Value
num_minutes Number 60

Siri に呼びかける

お疲れ様でした。以上で完了です!

完成したショートカット

Siri に向かって「Hey Siri!」と声を出して呼び出してみましょう。

「はい」と Siri が聞いてくるので「ごはんですよ」と声を出して返信するだけで、 Slack のステータスや DND を更新できるようになりました。

PC やスマホをポチポチいじらずに、声だけで昼休みに入れる革命が起こせました。

Discussion