Carpe Diem

備忘録

Slackアプリでチャンネルにメッセージを送信する方法

概要

Slackアプリでチャンネルにメッセージを送信する方法は主に以下の3つがあります。

  1. Incoming Webhooksを使う
  2. Bot TokenでSlack API (chat.postMessage) を叩く
  3. User TokenでSlack API (chat.postMessage) を叩く

それぞれのやり方を説明します。

メッセージ送信

事前準備としてどれもSlackアプリを使うので、あらかじめ作成しておきます。

Slack API: Applications | Slack

f:id:quoll00:20210507004052p:plain

分かり易さのためDisplay Informationを設定しておくと良いです。

f:id:quoll00:20210507004246p:plain

1. Incoming Webhooksを使う

設定

以前はカスタムインテグレーションとして使われていたIncoming Webhookですが、現在カスタムインテグレーションは非推奨となり、Slack Appから設定する必要があります。

Incoming Webhooksの設定に飛び

f:id:quoll00:20210507004334p:plain

Activateします。

f:id:quoll00:20210507004512p:plain

Add New Webhook to Workspaceでチャンネルを指定して連携します。

f:id:quoll00:20210507004727p:plain

するとWebhook URLが登録され、

f:id:quoll00:20210507004910p:plain

チャンネルにもintegration通知が飛びます。

f:id:quoll00:20210507004901p:plain

動作検証

Webhook URLに対してリクエストを投げると、

$ curl -X POST -H 'Content-type: application/json' \
  --data '{"text":"Hello, World!"}' \
  https://hooks.slack.com/services/xxx/yyy/zzz

メッセージを送信できます。

f:id:quoll00:20210507004956p:plain

2. Bot TokenでSlack API (chat.postMessage) を叩く

次はBot Tokenを使った方法です。

設定

OAuth & Permissions

f:id:quoll00:20210507005718p:plain

Bot Token Scopesで、chat:writeの権限を付与します。

f:id:quoll00:20210507005808p:plain

Reinstallすると

f:id:quoll00:20210507010113p:plain

認可処理が走ります。

f:id:quoll00:20210507013350p:plain

xoxb-xxxというトークンが生成されます。

f:id:quoll00:20210507010202p:plain

アプリの追加

チャンネルの詳細からアプリを追加します。

f:id:quoll00:20210507010427p:plain

以下のようなメッセージが表示されたらOKです。

f:id:quoll00:20210507010456p:plain

動作検証

トークンを使って送信します。
パラメータなど詳細はAPIドキュメントを参考にしてください。

$ curl -X POST 'https://slack.com/api/chat.postMessage' \
  -d 'token=xoxb-xxx' \
  -d 'channel=#slack-app-public-test' \
  -d 'text=*Bot Token*'

送信できました。

f:id:quoll00:20210507010711p:plain

3. User TokenでSlack API (chat.postMessage) を叩く

最後にUser Tokenを使った方法です。

Bot Tokenとの違いは?

Tokenが2つもあってややこしいのですが、こちらはBotユーザとしてでなく、連携した人としてメッセージを送信できる点が異なります。

f:id:quoll00:20210507003827p:plain

またトークンのprefixも

  • Bot Token:xoxb-
  • User Token:xoxp-

と異なります。

設定

OAuth & PermissionsUser Token Scopeschat:writeの権限を付与します。

f:id:quoll00:20210507011140p:plain

同じようにReinstallすると認可処理が走ります。

f:id:quoll00:20210507011347p:plain

許可するとトークンが生成されます。

f:id:quoll00:20210507011422p:plain

チャンネルに参加

ユーザに成り代わってメッセージを投稿するので、本人がそのチャンネルに参加している必要があります。

f:id:quoll00:20210507011530p:plain

動作検証

トークンを使って送信します。

$ curl -X POST 'https://slack.com/api/chat.postMessage' \
  -d 'token=xoxb-xxx' \
  -d 'channel=#slack-app-public-test' \
  -d 'text=*User Token*'

送信できました。

f:id:quoll00:20210507011548p:plain

その他

やってて地味にハマったことを書いていきます。

SlackアプリはWorkspaceのApp管理からでは編集できない

SlackアプリはWorkspaceと独立しているので、WorkspaceのApp管理からでは編集できません。

https://api.slack.com/apps

から編集する必要があります。

OAuth & Permissionsで権限変更したらReinstallが必要

上にデカデカと書かれるんですが、ちゃんと読んでなくてハマりました。

f:id:quoll00:20210507002441p:plain

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型は連携した人がチャンネルにいないと送信できない

例えばチャンネルから抜けると

f:id:quoll00:20210507002709p:plain

$ 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通りの方法を紹介しました。

ソース