Slackbotの作成¶
チュートリアルで扱うSlackbotを実装するために、開発環境やSlackのAPI利用方法を説明し、ステップを踏みながらbotを作成していきましょう。
Slackアプリの作成と設定¶
まず初めにBotとなるSlackアプリをSlack上で作成します。
こちらのリンク からアプリ作成画面に進みます。
アプリ名はこの例では pt_slackbot-20200807
としていますが、アプリ名については自由に変更可能です。
アプリが作成できたら、「OAuth & Permissions」の「Scopes」>「Bot Token Scopes」にスコープの設定を行います。
「Bot Token Scope」はBotとなるSlackアプリがSlackワークスペースに利用できる権限の範囲(スコープ)です。
この時点では chat:write
のみで、botがSlackへメッセージを送るためのスコープのみを設定していますが、後ほどの設定で、いくつか追加されます。
追加したら、ページの上にある「Install App to Workspace」をクリックし、SlackアプリをSlackワークスペースへ追加します。
追加が終わると、「Bot User OAuth Access Token」が表示されます。このトークンをまず控えてください。
次に、右上の「Basic Information」へ戻り、「App Credentials」の中にある「Signing Secret」を控えます。
先程集めた2つのトークンをローカル開発環境の環境変数として登録します。
# Windows10: PowerShell
> $env:SLACK_BOT_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXX"
> $env:SLACK_SIGNING_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
# macOS
> export SLACK_SIGNING_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX
> export SLACK_BOT_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXX
注釈
Windows10はスタートメニューから「環境変数を編集」と検索するとGUIから設定可能です。コマンドプロンプトの場合はSETコマンドを利用してください。
次にngrokコマンドを使い、SlackBotを外部公開します。
まずは以下のngrokコマンドを実行して、内部では3000ポートのhttpサービスをngrokの公開URLへ登録します。
# Windows 10の場合
(.venv) pycon-jp-2020-tutorial$ ngrok.exe http 3000
# macOSの場合
(.venv) pycon-jp-2020-tutorial$ ngrok http 3000
ngrokコマンドを起動すると以下のような情報が表示されます。ngrokのサービスへサインアップしていない場合は外部公開のセッションは8時間の限定公開になります。
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 7 hours, 58 minutes
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://df702078ccde.ngrok.io -> http://localhost:3000
Forwarding https://df702078ccde.ngrok.io -> http://localhost:3000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
Web InterfaceのURLへアクセスすると、公開したURLのアクセス履歴が見れるようになります。
次にslackbotを起動します。チュートリアル開始当初は、pt_slackbot
ディレクトリには botrun.py
ファイルのみがあります。こちらをpythonコマンドで実行します。
このときにngrokコマンドを実行しているターミナルとは別のターミナルを使い起動してください。
python ./pt_slackbot/botrun.py
SlackBotがSlackワークスペースへのやりとりをおこなうURLを生成して、bot側と連携させたので、Slackアプリの設定を続けます。
Slack Events APIを使い、Slackワークスペース上に起きたイベントを、Slackbotが動作するサーバー(ここではngrokで公開しているローカル環境)へ伝えることができます。ここで2つの設定を行います。
- Slack Event APIがイベント情報を送る先となるエンドポイントURL
- イベントの種類
Slack Events APIが起きたイベントをサーバーに伝えるためのエンドポイントURLを設定します。
(このEvents APIのエンドポイントURLについての説明は後半で後述します)
「Event Subscriptions」ページの「Enable Events」にある、右上のボタンをOnにします。
「Request URL」にエンドポイントURLを設定します。ngrokのアプリ上でbotアプリが待機しているアドレスを入力します。
https://[ngrokが自動的に割り振るランダムな文字列].ngrok.io/slack/events
次に、イベントの種類を登録します。イベントには種類があり、あらかじめアプリで取得したいイベントの種類を登録する必要があります。
Slackアプリのスコープを扱ったときに、イベントによるスコープの決定もあると書きましたが、このイベントを登録することでスコープの変化があります。
「Event Subscriptions」の「Subscribe to bot events」内に message.channels
イベントを登録します。
登録後はSlackワークスペースへアプリの再インストールを指示されるので行います。
再インストール時の認証画面を見ると、権限が追加されていることがわかります。先ほどはチャンネルにメッセージを送信するだけでしたが、それに加えてチャンネル内のメッセージを見ることができます。
デプロイとSlackアプリの権限の設定が終わると、Slackbotが利用できます。最後にSlackワークスペース上でbotを呼び出してみます。
最初に、チャンネルにbotユーザーを追加します。
ここまででSlackBotを動作させる準備が整いました。
SlackBotのフロー¶
ここでは、SlackBotがどのようにslackワークスペースとやり取りを行うか解説します。
SlackbotはWEBで扱われている技術でサービスとbotのアプリがやり取りを行います。今回のはSlack公式で提供されているEvents APIとWeb APIの2つを利用します。
Events APIはSlack側がbotアプリに声をかけるイメージで、Slackワークスペース内で起きたイベントを伝えます。
Web APIはSlackワークスペースに対して何らかのアクションを起こすために使います。botならbot側が何らかのメッセージを送ります。
PythonではEvents API, Web APIどちらとも対応した公式パッケージがあります。チュートリアルではどちらとも利用しています。
- Events API: https://github.com/slackapi/python-slack-events-api
- Web API: https://github.com/slackapi/python-slackclient
またBotはSlack側からのイベント内容をEvents API経由で随時受け取るためにAPIサーバーのような挙動を取ります。そのためWEBフレームワークのFlaskもインストールされます。
Slackbotのコード内ではFlaskのインスタンスを作成して、サーバーとして動作するようになり、Slack側にはエンドポイントURLを教えることで、botがSlackのイベントを知ることができるようになります。
注釈
SlackのAPIはほかにもあります。 代表例はincoming webhook(URLにパラメーターを付与するとslackワークスペースにメッセージを送れる), RealTime Messeging API(websocketを利用したリアルタイムにSlackワークスペースとアプリがやり取り可能)になります。
今回はそれらについては解説しませんが、参考情報を残します。
注釈
8/7にSlackの新しいAPIライブラリとして、 Bolt for Pythonがアルファバージョンとしてリリースされています。 bolt-js というnode.jsで動作するライブラリのPythonバージョンとなります。
アルファバージョンのライブラリであるためチュートリアルでは扱いませんが、最新のAPI仕様にも対応していくようなのでSlackbotを扱うときやSlackbotを作るサードパーティライブラリで使われるようになるのではと思います。
slackapi/bolt-python: WIP: A framework to build Slack apps using Python (still in alpha)
休憩1🍪¶
このあたりで休憩しましょう。休憩のお菓子はありますか?無ければ急いで用意しましょう! 長いチュートリアルなので、無事に作業が終わったら自分へご褒美を!
チュートリアルで実装するSlackBotについて¶
このチュートリアルでは、3つのSlackBotを実装します。人工無能な挨拶を返すbotから、APIを利用してインタラクティブな結果を返すようにします。
世界の挨拶をランダムで返す wgreet bot¶
このbotは定義した挨拶情報をランダムに返すbotです。よく言われる人工無能をまずは試してもらいます。
このbotの趣旨は以下になります。
- 国旗、挨拶の言葉、のテーブルを用意してテーブルからランダムに挨拶をかえす
- 英語、中国、など5つぐらいの言語の挨拶をコメントアウトで用意。参加者に選んで実装してもらう
- もちろん自由に言葉を変えてもらっても良し
挨拶botの実装ステップ¶
- slackevetsapiのexampleをそのまま乗せておいて、そのbotで受け答えできるか確認します。
- 次に、その中でテーブルを作って、ランダムで返す関数を用意
- 最後に挨拶をかえす部分をモジュール化する
利用する資料:
connpass APIを利用してオンラインイベントを検索する connpassonline bot¶
ここではconnpassを例にイベント検索用のREST APIを使ってイベントの検索を行います。
チュートリアルでは「Python」と「オンライン」というキーワードを元に検索をした結果を20件一覧に表示する機能を実装しています。
コマンドの実行方法は connpassonline [yyyymm]
と入力します。yyyymmは年月の意味で、 connpassonline 202008
と入力すると、2020年8月に関係する、Python, オンラインをキーワードにした検索結果が表示されます。
このbotの趣旨は以下になります。
- requests + jsonでAPIから取得したjsonのパースを体験する
connpassonlinebotの実装ステップ¶
- 共通化した手法を元に、connpassonline botを作る。最初は1関数に処理をすべて入れています。
- APIリクエストとbotの答えを返す関数をそれぞれで呼び出せるように分離します。
利用する資料:
気象庁のXML電文を使って地域の天気を返す tenki bot¶
最後にスマートスピーカーでも尋ねる率が高い機能でもある、天気予報を教えてくれるbotを作りましょう。
今回は誰でも無料で利用可能な、気象庁のXML電文を利用した週間天気予報を返すbotを作ります。XMLを扱うため、XMLのパーサーを使いながら、知りたい地域の週間天気予報を実装しましょう。
このbotは tenki [地域名]
と入力します。 tenki 静岡
と入力すると、静岡県気象台発表の週間天気予報を表示します。
このbotの趣旨は以下になります。
- BeautifulSoup4を使ってxmlを取得しパースを体験する
tenkibotの実装ステップ¶
- BeautifulSoup4を使ってxmlのパースをする
- 対応地域を追加してbotの拡張をしてもらう
利用する資料:
注釈
今回の天気情報の元は気象庁が無料で公開しているxmlファイルを利用しました。 当初はLivedoor 天気から提供されている REST APIを用いる予定でしたが、 2020/7/31にサービスが終了となったため、急遽気象庁XMLサービスを利用しています。
気象庁XMLサービスは天気予報以外にも、多数の予報や災害情報の提供もされているので、より多彩なbot作成ができると思います。 ただxmlを扱うのは少し複雑です。
先端IT活用推進コンソーシアム が公開している 気象庁防災情報 XML 検索 API では気象庁のXMLデータを元にしたREST APIを公開しています。このAPIはxmlではなくjson形式が扱えます。
休憩2🍱¶
このあたりでお昼しましょう。この章でSlackbotの作成はひと段落です。この先はPythonで扱われる開発を便利にするツールを紹介します。
まだまだ半分を過ぎたところです。お昼🍱休憩にして後半も頑張りましょう👍