コンテンツにスキップ

SlackBotを作ってみる

  • 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を用いてチャンネルにメッセージを送信してみましょう。

https://api.slack.com/apps

Create New App(緑色のボタン)からAppを作成できます。

image.png

From scratchを押して、Appの名前と追加したいworkspaceを選択します。

image.png

image.png

Create AppをクリックするとAppが作成されます。以下では、このAppのことをBotと呼ぶことにします。

OAuth & Permissions欄からBotの権限を追加できます。Botに書き込み権限を渡すことで、チャンネルへのメッセージ投稿が可能になります。

ScopesブロックからBotに付与する権限(スコープ)を選択できます。

Bot Token ScopesUser Token Scopes がありますが、今回はBot Token Scopes に権限を追加していきます。

実は、Slack AppはBotではなく、ユーザーそのものとして振る舞うものを作成することもできます。

たとえば、自分のSlackステータスアイコンを自動で変更するようなものを作りたいときは、ユーザーとして振る舞うAppを作成する必要があります。

実際に東京科学大のメンバーは、自分のステータスアイコンを位置情報やWifiの接続状況に応じて自動で変更できるAppを使っています。

これにより、大岡山と田町どちらの居室にいるのかをアイコンで識別できるようになりました。結構便利です。

image.png

さて、話を戻します。Bot Token Scopes に権限を付与すればよいのですが、必要以上に権限を付与するのはセキュリティ的によくありません。

誤って大事なメッセージやチャンネルを削除してしまったりする可能性すら存在します。

これらの過ちを防ぐためには、自分が行いたいことには何の権限が必要なのかを理解する必要があります。

今回であればチャットメッセージを送信したいだけなので、chat:write の権限だけを付与します。

必要な権限の考え方としては、

  1. 実現したいBotの動作に必要なAPIを確認する
  2. そのAPIを実行するために必要な権限を調べてBotに付与する

という順番です。

今回であれば、

  1. メッセージの送信を行うためにはchat.postMessage のAPIを使えば良い
  2. chat.postMessage のAPIが要求しているBotのスコープはchat:write であることを調べる

といった感じです。参考:Slackが公開しているAPIの一覧のページ:https://api.slack.com/methods

chat.postMessageのAPI仕様が書かれてあります。サンプルコードが掲載されているものもあります。

image.png

必要な権限がわかったらBotに付与しましょう。基本的にはこれで準備は完了です。

image.png

プログラムとしてBotを動かす場合、そのBotの情報をプログラムに渡す必要があります。

なぜなら、Slack APIは全世界に公開されているものであり、そのAPIを利用しているのが誰なのかを識別する必要があるためです。

Slack Appであれば、Bot User OAuth Tokens という情報を使って、HTTPリクエストを送信してきたBotを識別しています。

スコープを追加した後に、OAuth TokensブロックのInstall to Altema222 をクリックするとBot User OAuth Tokens が発行されます。

image.png

image.png

xoxb- から始まる文字列がBotのトークンです。このトークンを悪用されると危険なので、外部に漏らさないよう十分に注意して取り扱いましょう。

特定のチャンネルにメッセージを送信することが目的なので、そのチャンネルにBotを招待する必要があります。

インテグレーションの「アプリを追加する」からBotをチャンネルに招待できます。

image.png

Bot側の準備は整いました。HTTPリクエストを送信してみましょう。

HTTPリクエストの送信方法はいくつかあります。今回は以下の3つで説明します。

  • curlコマンドを使う
  • Pythonのライブラリ(requests, httpxなど)を使う
    • requestsは同期リクエストのみ対応
    • httpxは同期、非同期リクエストに対応
  • PostmanなどのHTTPクライアントを使う

HTTPリクエストを送信するには、

  • メソッドの指定(GET, PUT, POST, DELETE)
  • リクエストの送信先(URL)の指定
  • ヘッダーの指定(トークンの情報など)
  • データの指定(どのチャンネルに、どういうメッセージを送信するかなど)

を行う必要がありますが、それぞれの詳しい説明が必要ならばネットで調べてください。

コマンドラインから実行できます。

Terminal window
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のテストです。"}'

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を使うと便利だと思います。

https://www.postman.com/