Herokuで始めるSlackBot
PythonでSlackBotを記述して, Herokuで動かすところまで.(健忘録)
今回は以下のライブラリを使う.
Slack Web API と Real Time Messaging (RTM) が使えるらしい.
ちなみに, ローカル環境はmacOS High Sierraです.
SlackのAPIトークン取得
SlackAPIからアプリを作成して, APIトークンを取得する.
Slack API | Slack
SlackAPIのトップから Start Building >> Create an App と移動する.
アプリ名と運用するワークスペースが選択するとアプリが作成される.
サイドメニューからBot Usersを選択し, Add Bot Userを押す.
アプリをインストールするためには, スコープを設定する必要がある.
サイドメニューから OAuth & Permissions に移動, Scopesからbotの使用する権限を選ぶ.
今回はとりあえず, 以下の権限を付与した.
SaveChangesを押し, 上の方のInstall App to Workspaceを押す.
インストールが完了すると, Bot User OAuth Access Tokenにトークンが表示される, これを後々使用する.
Slack上でbotを動かしたいチャンネルに招待しておく.
これでbotの基本的な準備は完了.
ローカル環境設定
Githubで適当にリポジトリを作ってクローンする.
クローンしたディレクトリに入り, virtualenvを使ってpythonの仮想環境を構築する.
virtualenvでPython仮想環境作成
# virtualenvのインストール pip install virtualenv # 仮想環境の作成 virtualenv app_env # 仮想環境の有効化 source app_env/bin/activate # (仮想環境の無効化) deactivate # (仮想環境の消去) rm -rf app_env
次にbotライブラリをpipでインストールする.
botライブラリのインストール
pip install slackclient
トークンの設定
export SLACK_API_TOKEN='(先ほどのTOKEN)'
とりあえず, channelリストを取得するAPIを叩いてみる.
getChannel.py
import os from slackclient import SlackClient slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) response = sc.api_call("channels.list") print(response)
実行するとワークスペース内のチャンネル情報が取得できる.
次にgeneralチャンネルにメッセージを投稿してみる.
postTest.py
import os from slackclient import SlackClient slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) sc.api_call( "chat.postMessage", channel="(先ほど取得したチャンネルのID)", text="Hello from Python!", reply_broadcast=True )
generalチャンネルにメッセージが投稿されていれば, 成功.
次にReal Time Messaging APIの動作を確認してみる.
以下のソースコードはRTMで取得したイベント結果をそのまま標準出力に出力するプログラムである.
ちゃんと, slackに接続できれば, helloイベントが出力される.
rtmTest.py
import os import time from slackclient import SlackClient slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) if sc.rtm_connect(): while sc.server.connected is True: request = sc.rtm_read() print(request) time.sleep(1) else: print("Connection Failed")
次にユーザの投稿をそのままオウム返しするようなbotを書いてみる.
今回は対象のユーザのIDを直打ちした.
rtmReturn.py
import os import time from slackclient import SlackClient slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) if sc.rtm_connect(): while sc.server.connected is True: request = sc.rtm_read() for event in request: if 'user' in event: if event['user'] == (対象ユーザのID) and event['type'] == 'message': sc.api_call( "chat.postMessage", channel="(先ほど取得したチャンネルID)", text=event['text'], reply_broadcast=True ) time.sleep(1) else: print("Connection Failed")
実行してslack上でメッセージを送ると, botからオウム返しが返ってくる.
Herokuの設定
Herokuのアカウントを作成し, ログインするとパーソナル画面に移動する.
Create New Appを選択する.
App nameとregionを選択する.
Add to pipelineを押すとパイプラインを追加できる.
Pipelineを追加することで, Githubのリポジトリにpushした時に自動的にherokuの方にも反映してくれるようになる.
pipelineを追加して進む.
Appの作成が完了すると, Appの設定画面が開く.
Deployタブを開いて, Deployment methodからGithubを選ぶ.
自分のGithubアカウントと紐付けすると, 自分のGithubリポジトリから検索できるので, 紐付けたいリポジトリを選択する.
Automatic deploysでEnbale Automatic Deploysを押す.
Settingsタブを開いて, Config Variablesから環境変数をセットする.
ブラウザ上での設定は以上で終了.
Herokuへのデプロイ
次にローカルでheroku向けのファイルを作成する.
HerokuではProcfile, runtime.txt, requirements.txtの3つのファイルがルートディレクトリ以下にある必要がある.
Procfile
実行するコマンドを設定する
woker: python rtmReturn.py
runtime.txt
実行中のpythonのバージョンの定義
python-3.6.0
requirements.txt
Pythonの依存ライブラリを記述する.
以下のコマンドで生成できる.
pip freeze > requirements.txt
以上の3つのファイルを追加して, リモートリポジトリへgit pushする.
HerokuのページのOverviewタブからデプロイに成功したかどうか見れる.
ページをリロードすると, Dyno formationにProcfileで定義したコマンド名が現れる.
Configure Dynosに移動して, 選択したappをonにする.
ローカル環境と同様に, slackでメッセージを送信すると, botがオウム返しするようになる.