Slackメッセージを時間気にせず送りたいので、chat.scheduleMessage APIを使ってメッセージ送信予約機能を試してみた

本記事要約

  1. Slackでメッセージを後で送りたいことはありませんか?
  2. chat.scheduleMessage APIを使うと指定時刻にメッセージを送信できます
  3. Chrome拡張機能でUIを作ってみました

はじめに

Slackを使っていて
「今日は佐藤さんお休みだからメンションするの止めておこうかな?後で送ろう。」
「朝早いしメッセージ送るのは後にしよう」
「夜遅いしメッセ...(以下同文)」
「土曜だしメッセ...(以下同文)」
というようなケースありませんか?

こんなとき、送り手は気を使わずにメッセージを送れて、受け手は通知を受けたくない時間帯を「Do Not Disturb」で設定しておく運用なら、変に気を使わなくて済んで助かります。

おやすみモードによる通知の一時停止
https://get.slack.help/hc/ja/articles/214908388

さらに「伊藤さん、今忙しそうだからメッセージ送っても埋もれて忘れられそう。後で送ろう。」のようなケースも含めて、良い方法は無いでしょうか?

明日の午前11時にメッセージを送れば何の問題もないと仮定したとき、どういう手段が考えられるでしょうか?

A. 該当時間にリマインダーをセットしておき、自分で @伊藤さん にメッセージを送る
/remind me 伊藤さんにメッセージを送る at 10:55 tomorrow

B. @伊藤さん宛のリマインダーをセットしてしまう(この場合、リマインダーをセットしたときにも通知されるので受けてとしては遠慮したい) /remind @伊藤さん 飛信隊がついに中央軍のところまで来てましたが今週どうなったか教えてください at 11:00 tomorrow

リマインダーを設定する
https://get.slack.help/hc/ja/articles/208423427

Slackのメッセージ送信をスケジューリングするAPI

chat.scheduleMessage API
https://api.slack.com/methods/chat.scheduleMessage

こちらのAPIを使うと、宛先チャンネル(channel)、メッセージ(text)、投稿日時(post_at)を指定してメッセージの送信が可能です。実際にSlack上にメッセージが現れるのは投稿日時(post_at)の時間なので、気を使わずに好きな時間にメッセージを送れます。

OAuth Access Token入手のためのSlack Apps準備

chat.scheduleMessage APIを使うために、まずはSlack Appsを作り、OAuth Access Tokenを取得します。

Slack Appの作成はこちらのURLから行います。
https://api.slack.com/apps

  1. Create New Appを選択します

  2. App Nameとインストール先のSlackワークスペースを選択します。ここではApp NameをSlack Send Laterとしています

  3. Basic InformationのPermissionsを選択します

  4. Select Permission Scopes欄に chat:write:user を指定します。これによりこの後で発行されるOAuth Access Tokenを使うと本人の代理でメッセージが送れるようになります

  5. OAuth Tokens & Redirect URLsのInstall App to Workspaceを選択します

  6. 確認画面でAllowを選択します

  7. Tokens for Your WorkspaceアイテムにOAuth Access Tokenが表示されているのでCopyします

これでSlack Appsの準備は完了です。
このOAuth Access Tokenは代理メッセージ投稿ができるので、他の人に共有したりしないように注意してください。

chat.scheduleMessage APIを試す

Slack API Testerを使うとchat.scheduleMessage APIを簡単に試せます。
https://api.slack.com/methods/chat.scheduleMessage/test

※一部実際のものから変更しています

なお、curlコマンドの場合はこのようになります。※一部実際のものから変更しています

$ curl -XPOST 'https://slack.com/api/chat.scheduleMessage' -H 'Authorization: Bearer xoxp-123456789012-123456789012-123456789012-xxx' -H 'Content-Type: application/json; charset=utf-8' --data-binary '{"channel":"#prj-slack-send-later","post_at":1568361672.602,"text":"Hello World"}'

{"ok":true,"scheduled_message_id":"QNAHTH123","channel":"C3M5AA123","post_at":1568361672,"message":{"bot_id":"BNBVC3123","type":"message","text":"Hello World","user":"U3M5AA123","team":"T3LCQU123"}}$ 

このようにpost_atで指定した時間にメッセージが代理投稿されます。

chat.scheduleMessage APIを使ったChrome拡張機能

chat.scheduleMessage APIを、都度curlコマンドなどで実行するのが煩わしいので、Slack Send LaterというシンプルなChrome拡張機能を作ってみました。

https://chrome.google.com/webstore/detail/slack-send-later/nnbmbbhkagnhjimdegagnoebeijljbci

Slack Send Laterの使い方

  1. メッセージ送信予約のために、Slackアプリを作成しOAuth Access Tokenを取得します。(Permissions - Select Permission Scopes - chat:write:usersを付与)

  2. ブラウザアクションのオプションからOAuth Access Tokenを設定する

  3. ブラウザアクションから投稿先の「チャンネル」、「メッセージ」、「送信予定日時」を入力して「送信予約」ボタンを押下する

すると先にも紹介したように、このように指定時刻になるとメッセージが代理投稿されます。

さいごに

メッセージの送信予約は、cronのようなスケジューラー無しでもchat.scheduleMessage APIを使うと容易に実現できました。

今回紹介したchat.scheduleMessage APIを使ったメッセージの送信予約ですが、Slackクライアントで機能提供されたらSlack Send Laterは不要になるので、短命なChrome拡張機能になるかもしれません。
(私が気付いてないだけで、既にメニューがある?)

補足

SlackのTipsで、KyberというSlack Appsを使ったSlashコマンドによるメッセージ予約が紹介されています。

Send a message later
https://slack.com/intl/ja-jp/slack-tips/send-a-message-later