DockerとErrbotでお手軽Slackbot


## 概要

ローカル環境のDockerでchatbotを動かして
Slackとのやりとりをさせてみました。

GitHub謹製の[Hubot](https://github.com/github/hubot)やRuby製の[Lita](https://github.com/litaio/lita)と悩みましたが
CoffeeScriptの読解やRedisの事前準備が面倒だったので
Pythonで書かれていて、一番シンプルそうなErrbotを選びました。
ザッと調べた感じでは、大きな優劣はないように思います。

## 準備

Dockerのコンテナが動作する環境であればどこでも問題ありません。
筆者はDocker for Macを使用してローカルPCに構築しています。

Slackbotを作成する場合には、事前にチームの準備が必要です。

## 手順

### Dockerコンテナの構築

Pythonのバージョン3.3以上が動作するコンテナを構築します。
省力のため、Python込みのAlpine Linuxを使用しました。

```Dockerfile
FROM python:3.5.2-alpine

# apkの更新
RUN apk update

# Errbotのインストールに必要なパッケージのインストール
RUN apk add gcc g++ libffi-dev openssl-dev

# 開発に必要なパッケージをお好みでインストール
RUN apk add vim bash
```

`Dockerfile`のあるディレクトリで以下を入力し、コンテナを起動します。

```bash:コンテナの起動
# botという名前で、Dockerfileからイメージを生成
$ docker build -t bot .

# botイメージを起動し、/bin/shを実行
$ docker run -it bot /bin/sh
```

### Errbotの導入

`pip`を使って必要なパッケージをインストールします。
`errbot`の本体とSlackとの通信用に`slackclient`が必要です。

```bash:パッケージのインストール
$ pip install errbot slackclient
```

完了したら、無事インストールできたかどうかを確認します。
結構な数のパッケージに依存していますね…。

```bash:パッケージの確認
$ pip freeze
ansi==0.1.3
beautifulsoup4==4.5.1
bottle==0.12.9
cffi==1.8.3
colorlog==2.7.0
cryptography==1.5.2
daemonize==2.4.7
dnspython==1.14.0
dnspython3==1.14.0
errbot==4.3.3
idna==2.1
Jinja2==2.8
Markdown==2.6.7
MarkupSafe==0.23
pyasn1==0.1.9
pycparser==2.14
Pygments==2.1.3
pygments-markdown-lexer==0.1.0.dev39
pyOpenSSL==16.1.0
requests==2.11.1
rocket-errbot==1.2.5
six==1.10.0
slackclient==1.0.2
threadpool==1.3.2
waitress==1.0.0
WebOb==1.6.1
websocket-client==0.37.0
WebTest==2.0.23
Yapsy==1.11.223
```

無事インストールができたら[First run](http://errbot.io/en/latest/user_guide/setup.html#first-run)を実行してみます。
以下のコマンドで、プロジェクトディレクトリを初期化します。

```bash:プロジェクトの初期化
$ mkdir ~/errbot-root
$ cd ~/errbot-root
$ errbot --init
```

botの設定や実行に必要な複数のファイルが作成されました。
早速コンソール上で`errbot`を起動してみます。
`>>>`が表示されたら、`!tryme`と入力してみてください。
botから反応が返ってくるはずです。

```bash:コンソールでの実行
$ errbot
>>> !tryme
It works !
```

どうやら、Errbotではbotへの指示のプレフィックスとして`!`をつけるようです。

### botアカウントの準備

[こちら](https://slack.com/apps/build)のページを開き、'Make a Custom Integration'を選択します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/43116/03e5f189-3c27-623c-11b3-10669ffb0cd6.png "1.png")

Botsの作成を選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/43116/31a374cd-cde2-598a-c6e7-241da8ef5013.png "2.png")

botアカウントの名称を入力し、'Add bot integration'をクリックします。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/43116/1e3500dc-46b1-99c0-cd36-aa2470624cbc.png "3.png")

遷移先の画面にAPI Tokenが表示されるので、メモりましょう。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/43116/e0ff85ea-5370-9c25-0f57-bbde9aaa1291.png "4.png")

これでbotアカウント作成は完了です。
'DIRECT MESSAGES'欄に作成したアカウントを見つけられるはずです。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/43116/8ab9652a-e64d-3735-fc77-293b88182e84.png "5.png")

### 設定ファイルの書き換え

`errbot --init`により作成された`config.py`を書き換えます。
変更箇所は主に3点です。他の項目はそのままで問題ありません。

```python:config.py
# BACKENDをTextからSlackに修正
BACKEND = 'Slack'

# 前述のAPI Tokenを入力
BOT_IDENTITY = {
    'token': 'xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}

# adminにしたいユーザのアカウント名をタプルのかたちで入力（複数可）
BOT_ADMINS = ('@nanakenashi')
```

説明のためにtokenをべた書きで記載しています。
GitHubなどでソースを管理する場合は環境変数に埋め込んで
`os.getenv('HOGE')`などで読み込むかたちが望ましいと思います。

保存したら改めてErrbotを起動します。
今回はデーモンオプションをつけてみます。

```bash:Errbotの起動
$ errbot --daemon
```

### 動作確認

Slack上で`!tryme`、`!help`、`!about`など、話しかけてみましょう。
コンソールのときと同様に動作するはずです。
なお、botアカウントのアイコンは愛情が注げるものに変えておくことをオススメします。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/43116/6b33897d-7d69-8360-51e7-a57595403857.png "6.png")

## まとめ

かなりお試しの内容ではありましたが
Slackのbotとお話ができるようになりました。

chatbotの真骨頂は指示に対する柔軟な動作なので
次はその部分（プラグイン）に触れてみたいと思います。