SlackBotを作ってみる
💯 できるようになること
Section titled “💯 できるようになること”- Slackのチャンネルに好きなメッセージを送信するBotが作成できる
- Pythonを使ったHTTPリクエストの送信プログラムが作成できる
- 便利なHTTPクライアントツールであるPostmanが使えるようになる
🤖 メッセージ送信Botを作成しよう!
Section titled “🤖 メッセージ送信Botを作成しよう!”参考:https://qiita.com/odm_knpr0122/items/04c342ec8d9fe85e0fe9
Slackでは、Slackアプリの操作を外部から行うためのAPIが提供されています。
これから行うのは、自分たちの代わりにメッセージ送信を行ってくれるBotの作成です。
Botに適切な権限を付与してチャンネルに招待すると、APIを介したメッセージ送信を行うことができます。
僕たちがアプリに対して行っている動作(例えば、テキストを送信するボタンをクリックする動作)をプログラムが行えるようにするものがAPIのイメージです。
APIにも様々な種類があり、様々な動作をプログラムで実現できます。今回は、「メッセージ送信」を行うAPIを用いてチャンネルにメッセージを送信してみましょう。
Slack APIにアクセスする
Section titled “Slack APIにアクセスする”Create New App(緑色のボタン)からAppを作成できます。
From scratchを押して、Appの名前と追加したいworkspaceを選択します。
Create AppをクリックするとAppが作成されます。以下では、このAppのことをBotと呼ぶことにします。
Botの権限を設定する
Section titled “Botの権限を設定する”OAuth & Permissions欄からBotの権限を追加できます。Botに書き込み権限を渡すことで、チャンネルへのメッセージ投稿が可能になります。
ScopesブロックからBotに付与する権限(スコープ)を選択できます。
Bot Token Scopes
とUser Token Scopes
がありますが、今回はBot Token Scopes
に権限を追加していきます。
実は、Slack AppはBotではなく、ユーザーそのものとして振る舞うものを作成することもできます。
たとえば、自分のSlackステータスアイコンを自動で変更するようなものを作りたいときは、ユーザーとして振る舞うAppを作成する必要があります。
実際に東京科学大のメンバーは、自分のステータスアイコンを位置情報やWifiの接続状況に応じて自動で変更できるAppを使っています。
これにより、大岡山と田町どちらの居室にいるのかをアイコンで識別できるようになりました。結構便利です。
さて、話を戻します。Bot Token Scopes
に権限を付与すればよいのですが、必要以上に権限を付与するのはセキュリティ的によくありません。
誤って大事なメッセージやチャンネルを削除してしまったりする可能性すら存在します。
これらの過ちを防ぐためには、自分が行いたいことには何の権限が必要なのかを理解する必要があります。
今回であればチャットメッセージを送信したいだけなので、chat:write
の権限だけを付与します。
必要な権限の考え方としては、
- 実現したいBotの動作に必要なAPIを確認する
- そのAPIを実行するために必要な権限を調べてBotに付与する
という順番です。
今回であれば、
- メッセージの送信を行うためには
chat.postMessage
のAPIを使えば良い chat.postMessage
のAPIが要求しているBotのスコープはchat:write
であることを調べる
といった感じです。参考:Slackが公開しているAPIの一覧のページ:https://api.slack.com/methods
chat.postMessageのAPI仕様が書かれてあります。サンプルコードが掲載されているものもあります。
必要な権限がわかったらBotに付与しましょう。基本的にはこれで準備は完了です。
Botのトークンを取得する
Section titled “Botのトークンを取得する”プログラムとしてBotを動かす場合、そのBotの情報をプログラムに渡す必要があります。
なぜなら、Slack APIは全世界に公開されているものであり、そのAPIを利用しているのが誰なのかを識別する必要があるためです。
Slack Appであれば、Bot User OAuth Tokens
という情報を使って、HTTPリクエストを送信してきたBotを識別しています。
スコープを追加した後に、OAuth TokensブロックのInstall to Altema222
をクリックするとBot User OAuth Tokens
が発行されます。
xoxb-
から始まる文字列がBotのトークンです。このトークンを悪用されると危険なので、外部に漏らさないよう十分に注意して取り扱いましょう。
Botをチャンネルに招待する
Section titled “Botをチャンネルに招待する”特定のチャンネルにメッセージを送信することが目的なので、そのチャンネルにBotを招待する必要があります。
インテグレーションの「アプリを追加する」からBotをチャンネルに招待できます。
HTTPリクエストを送信する
Section titled “HTTPリクエストを送信する”Bot側の準備は整いました。HTTPリクエストを送信してみましょう。
HTTPリクエストの送信方法はいくつかあります。今回は以下の3つで説明します。
- curlコマンドを使う
- Pythonのライブラリ(requests, httpxなど)を使う
- requestsは同期リクエストのみ対応
- httpxは同期、非同期リクエストに対応
- PostmanなどのHTTPクライアントを使う
HTTPリクエストを送信するには、
- メソッドの指定(GET, PUT, POST, DELETE)
- リクエストの送信先(URL)の指定
- ヘッダーの指定(トークンの情報など)
- データの指定(どのチャンネルに、どういうメッセージを送信するかなど)
を行う必要がありますが、それぞれの詳しい説明が必要ならばネットで調べてください。
curlコマンドを使う
Section titled “curlコマンドを使う”コマンドラインから実行できます。
curl -X POST "https://slack.com/api/chat.postMessage" \ -H "Authorization: Bearer xoxp-111111111111-111111111111-11111111111-awdawajifjfawawf" \ -H "Content-Type: application/json" \ -d '{"channel": "#zzz-sandbox", "text": "Slack APIのテストです。"}'
Pythonを使う
Section titled “Pythonを使う”requestsパッケージやhttpxパッケージでHTTPリクエストが送信できます
import requests
token = "xoxp-111111111111-111111111111-11111111111-awdawajifjfawawf"channel = "#zzz-sandbox"text = "Slack APIのテストです。"url = "https://slack.com/api/chat.postMessage"
headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json"}
data = { "channel": channel, "text": text}
r = requests.post(url, headers=headers, json=data)
print(r.json()) # APIレスポンスを表示
Postmanを使う
Section titled “Postmanを使う”試行錯誤する際にはPostmanを使うと便利だと思います。