概要
Slackアプリでチャンネルにメッセージを送信する方法は主に以下の3つがあります。
- Incoming Webhooksを使う
- Bot TokenでSlack API (
chat.postMessage
) を叩く - User TokenでSlack API (
chat.postMessage
) を叩く
それぞれのやり方を説明します。
メッセージ送信
事前準備としてどれもSlackアプリを使うので、あらかじめ作成しておきます。
Slack API: Applications | Slack
分かり易さのためDisplay Informationを設定しておくと良いです。
1. Incoming Webhooksを使う
設定
以前はカスタムインテグレーションとして使われていたIncoming Webhookですが、現在カスタムインテグレーションは非推奨となり、Slack Appから設定する必要があります。
Incoming Webhooksの設定に飛び
Activateします。
Add New Webhook to Workspaceでチャンネルを指定して連携します。
するとWebhook URLが登録され、
チャンネルにもintegration通知が飛びます。
動作検証
Webhook URLに対してリクエストを投げると、
$ curl -X POST -H 'Content-type: application/json' \ --data '{"text":"Hello, World!"}' \ https://hooks.slack.com/services/xxx/yyy/zzz
メッセージを送信できます。
2. Bot TokenでSlack API (chat.postMessage
) を叩く
次はBot Tokenを使った方法です。
設定
OAuth & Permissionsの
Bot Token Scopesで、chat:write
の権限を付与します。
Reinstallすると
認可処理が走ります。
xoxb-xxx
というトークンが生成されます。
アプリの追加
チャンネルの詳細からアプリを追加します。
以下のようなメッセージが表示されたらOKです。
動作検証
トークンを使って送信します。
パラメータなど詳細はAPIドキュメントを参考にしてください。
$ curl -X POST 'https://slack.com/api/chat.postMessage' \ -d 'token=xoxb-xxx' \ -d 'channel=#slack-app-public-test' \ -d 'text=*Bot Token*'
送信できました。
3. User TokenでSlack API (chat.postMessage
) を叩く
最後にUser Tokenを使った方法です。
Bot Tokenとの違いは?
Tokenが2つもあってややこしいのですが、こちらはBotユーザとしてでなく、連携した人としてメッセージを送信できる点が異なります。
またトークンのprefixも
- Bot Token:
xoxb-
- User Token:
xoxp-
と異なります。
設定
OAuth & PermissionsのUser Token Scopesでchat:write
の権限を付与します。
同じようにReinstallすると認可処理が走ります。
許可するとトークンが生成されます。
チャンネルに参加
ユーザに成り代わってメッセージを投稿するので、本人がそのチャンネルに参加している必要があります。
動作検証
トークンを使って送信します。
$ curl -X POST 'https://slack.com/api/chat.postMessage' \ -d 'token=xoxb-xxx' \ -d 'channel=#slack-app-public-test' \ -d 'text=*User Token*'
送信できました。
その他
やってて地味にハマったことを書いていきます。
SlackアプリはWorkspaceのApp管理からでは編集できない
SlackアプリはWorkspaceと独立しているので、WorkspaceのApp管理からでは編集できません。
から編集する必要があります。
OAuth & Permissionsで権限変更したらReinstallが必要
上にデカデカと書かれるんですが、ちゃんと読んでなくてハマりました。
Bot Token型はチャンネルにアプリを追加しないと送信できない
チャンネルにアプリの追加を忘れていると(privateチャンネル、publicチャンネル関係なく)
$ curl -X POST 'https://slack.com/api/chat.postMessage' \ -d 'token=xoxb-xxx' \ -d 'channel=#slack-app-public-test' \ -d 'text=*Bot Token*' {"ok":false,"error":"not_in_channel"}
not_in_channel
となりコケます。
User Token型は連携した人がチャンネルにいないと送信できない
例えばチャンネルから抜けると
$ curl -X POST 'https://slack.com/api/chat.postMessage' \ -d 'token=xoxp-xxx' \ -d 'channel=#slack-app-public-test' \ -d 'text=*User Token*' {"ok":false,"error":"not_in_channel"}
not_in_channel
となりコケます。
トークンをRevokeした後のレスポンスが異なる
トークンの種類 | 状態 | エラーレスポンス |
---|---|---|
Bot Token | 全トークンを削除後、古いトークンでリクエスト | account_inactive |
Bot Token | トークンをローテート後、古いトークンでリクエスト | invalid_auth |
User Token | 全トークンを削除後、古いトークンでリクエスト | token_revoked |
User Token | トークンをローテート後、古いトークンでリクエスト | token_revoked |
まとめ
Slackアプリでチャンネルにメッセージを送信する3通りの方法を紹介しました。