こうりんのブログ

主に勉強した事を書いていくつもり

Herokuで始めるSlackBot

PythonでSlackBotを記述して, Herokuで動かすところまで.(健忘録)
今回は以下のライブラリを使う.
Slack Web API と Real Time Messaging (RTM) が使えるらしい.

github.com

ちなみに, ローカル環境は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の使用する権限を選ぶ.
今回はとりあえず, 以下の権限を付与した.

  • Access information about user’s public channels
  • Send messages as (app名)
  • Add a bot user

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がオウム返しするようになる.

参考

qiita.com
www.utali.io