MAGAZINE

ルーターマガジン

Python

Pythonで作るslack chatbot

2022.09.02
Pocket

学生エンジニアの福島です。

本記事ではPythonを使ったSlack Chatbotの実装をご紹介します。

目標物

Echoサーバーのようなchat botを作成します。
送られてきたメッセージをそのまま返すのではなく、文字列を逆順にして返すようにし、
もう一つの機能として、メッセージ内に"hello"が含まれていたら"Can I help you?"と返すようにします。
紹介が目的なので、簡単な実装に留めますが、データベースと接続したり、他のAPIサービスと連携させることで
webアプリのフロントエンドのように扱うことができます。

使用ライブラリ

slackの公式が開発しているslack boltを使用します。
https://github.com/slackapi/bolt-python

$ pip install slack_bolt

Python以外にもJavascriptやJavaで使用できる同様のライブラリが用意されています。

環境

version 3.6以上のPythonが動作する環境を用意してください。

前準備

web上でslackアプリの作成やアクセス権限の設定、キーの発行を行います。

https://api.slack.com/apps?new_app=1

from scrach を選択後、App Nameとworkspaceを入力し、Create Appを押します。その後、左のサイドバーからOAuth & Permissionsページに移動しScopeの設定を行います。

scopeの追加

Bot Token ScopesへOAuth scopeを追加します。追加するscopeは以下の3つです。

  • app_mentions:read
  • chat:write
  • group:history

プライベートチャンネルへ追加して動作させることを想定した場合のscopeになっています。パブリックチャンネルでの使用の際は下記を参考に適宜scopeを設定してください。
https://api.slack.com/scopes
scopeが追加できたら、ページの最上部へ移動しinstall to workspaceをクリック。リダイレクト後、許可をクリックすると再度リダイレクトし、Bot User OAuth Tokenが発行されます。

発行されたtokenは環境変数として保持しておきましょう。後ほど使用します。

$ export SLACK_BOT_TOKEN="xoxb-xxxx"

次はApp-Level Tokensを取得します。Basic Informationのページへ移動し、App-Level TokensのセクションからGenerate Token and Scopesをクリックし`connections:write`を付与します。

ここでは、token名をapp revel tokenとしています。作成されたxappを環境変数として宣言します。

$export SLACK_APP_TOKEN="xapp-xxx"

最後にサイドメニュー内Socket Modeのページへ移動し、Socket Modeを有効化後、Event subscriptionsを有効にするためにページ下部のEvent Subscriptionsをクリック。Enable EventsをOnにし
Subscribe to bot eventsの項目のEventsへ

  • app_mention
  • message:group

を追加します。

実装

ここからは実際にPythonスクリプトを書いていきます。

$ touch chatbot.py

プログラム上部

先程宣言した環境変数をスクリプト内で取得し、Appクラスのインスタンスを作成しています。

import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN")
SLACK_APP_TOKEN = os.environ["SLACK_APP_TOKEN"]

app = App(token=SLACK_BOT_TOKEN)

プログラム中部

メンション付きのメッセージを逆順にして返すハンドラと
"hello"という文字列が含まれているメッセージが送信されたときに、"Can I help you?"と返信をするハンドラの
2つが実装されています。

@app.message("hello")  # 送信されたメッセージ内に"hello"が含まれていたときのハンドラ
def ask_who(say):
    say("can I help you?")


@app.event("app_mention")  # chatbotにメンションが付けられたときのハンドラ
def respond_to_mention(event, say):
    message = re.sub(r'^<.*>', '', event['text'])
    say(message[::-1]) # 文字列を逆順


@app.event("message") # ロギング
def handle_message_events(body, logger):
    logger.info(body)

プログラム下部

SocketModeHandler(app, SLACK_APP_TOKEN).start()

動作確認

作成したアプリをチャンネルに追加して実際に動かしてみましょう。

Pythonアプリを起動します。

$ python chatbot.py

次にプライベートチャンネルを作成し、作成したslack app をチャンネルに追加します。

チャンネルに追加できたら、メンションを付けずに"hello"と送信してみましょう。

私が送信した"hello"をトリガーに、"can I help you?"と返してくれました。

今度はメンションを付けてメッセージを送信してみます。

期待通り逆順にしてくれました!

最後に

今回はslackで動作するchatbotの作成方法を紹介しました。

httpメソッドのGETやPOSTに相当するロジックが容易に実装できるため、WEBアプリにするほどの工数はかからず、手軽に実装できるのが良いところだと思います。是非実際に手を動かしてみていただけると嬉しいです。

参考

https://slack.dev/bolt-python/ja-jp/tutorial/getting-started

https://api.slack.com/authentication/token-types

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから