この記事はTakumi Akashiro ひとり Advent Calendar 2020の21日目の記事です。
##初めに
今年はSlackのBotを作らないとなーと思う場面が少し多い一年でしたが、
今後マシンがぶっ壊れたときに、環境構築をまた1からやるのも面倒ですし、
引継ぎ用の環境構築ドキュメントを用意するのもダルいので、
Dockerでいい感じに環境構築して、だれの環境でも簡単に動かすことを考えないとな、と思った次第でございます。
それが23時間ほど前。
2020年の末にもなってDockerImageの一つも作れないので、克服するために調べよう。2021年にはこの遺恨を残してはいけない(大げさ)
— 赤城 巧 (@takumi_akashiro) December 20, 2020
そのまま寝て起きて、業務を始め20時から、この記事を書くために動き始めた!
さあ間に合ったのか!間に合ったので記事になっているんですが。
SlackのBotを作るための準備
今回はRTM(リアルタイムにイベントがとれるヤツ)で動かしたいので、ClassicBotを作ります。
https://api.slack.com/apps?new_classic_app=1
適当にBotをインストールして、Bot token
を作っておきます。
各種ファイルの準備
以下のファイルを用意します。
- src/requirements.txt
- pipでインストールするモジュールを指定する
- src/app.py
- botの本体です。
- Dockerfile
- Dockerイメージを作成するためのファイルです。
今回はslackclientモジュールで適当に作ります。Slack公式が用意しているので安心ですね。
slackclient
何か書こうと思いましたが、全く時間的に余裕がないので
Slack公式が用意した、RTMAPIのサンプルコードを使います。
Real Time Messaging (RTM) — slackclient (Legacy Python Slack SDK)
import os
from slack import RTMClient
@RTMClient.run_on(event="message")
def say_hello(**payload):
data = payload['data']
web_client = payload['web_client']
if 'Hello' in data['text']:
channel_id = data['channel']
thread_ts = data['ts']
user = data['user'] # This is not username but user ID (the format is either U*** or W***)
web_client.chat_postMessage(
channel=channel_id,
text=f"Hi <@{user}>!",
thread_ts=thread_ts
)
slack_token = os.environ["SLACK_BOT_TOKEN"]
rtm_client = RTMClient(token=slack_token)
rtm_client.start()
FROM python:3.8
ENV SLACK_BOT_TOKEN <Botのトークン>
RUN mkdir src
copy src src/
RUN pip install -r ./src/requirements.txt
WORKDIR ./src/
ENTRYPOINT [ "python", "app.py" ]
Dockerイメージを作成する
docker build -t <imagename>:<tag> <DockerFileのディレクトリ>
今回は
docker build -t aktk/slack_bot:latest d:\docker\slackbot
チョー簡単。
Dockerイメージを動かす
docker run -d -p 80:80 aktk/slack_bot
SlackのBotの前でHelloしてみる
締め
思った以上に簡単にできてビックリですね!!
こんなに簡単にできるなら、もっと早く触るべきだったなあ、ってちょっと後悔してます。
将来的にはPySide2製のEXE化が必要なツールの環境構築+ビルドとかにも使いたいですが、
コンテナはLinuxで動いてるっぽいので、もっと調べないと駄目だろうなあ……