PythonでSlackbotにDocomo自然対話APIを導入&環境変数でAPIキーを管理

[Pythonで個人Slack用のbotを作る](https://qiita.com/mtane0412/items/6c63eb2dc20b5ccf1e8d)の続きです。
前回は仮想環境にslackbotを導入して動作確認するところまでをやりました。
今回はやったことは

- botにリプライを飛ばしたとき、デフォルトではDocomo自然対話APIで自然な会話が返ってくる
- APIキーなどを環境変数で管理してgithubなどに載らないようにする

## slackbotのデコレータ

slackbotには便利なデコレータが用意されています。

`@respond_to`デコレータ: botへのリプライの中に指定した文字列に反応
`@default_reply`デコレータ: `@respond_to`で定義されてない場合のデフォルトの反応
`@listen_to`デコレータ: botがjoinしているchannelで指定した文字列に反応

基本的にはこれらのデコレーターを使ってbotの機能を実装していきます。

## 前回slackbot_settings.pyに設定したDEFAULT_REPLYを削除
前回は動作確認のため、設定ファイルにデフォルトの返事を書いていたのでまずはこれを削除しておきます。

```slackbot_settings.py
# デフォルトの返答
DEFAULT_REPLY = "Sorry but I didn't understand you"

```

## Docomo自然対話APIを導入
Docomo雑談対話APIの後継だそうです。
appIdの取得から喋らせるまで[こちらの記事](https://qiita.com/usomaru/items/c31ec525eacb5e10c3a1)が詳しいです。

このAPIは色々できて楽しそうなのですが、今回はとりあえずデフォルトでそれっぽい返答が返ってくるところまでで良いのでリンク先のコードをそのまま使わせていただいています。

pluginsフォルダにpythonファイルを保存すれば実行時に読み込んでくれて動作するはずです。

<img width="325" alt="Screenshot 2018-04-21 18.44.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/65966/7bf5bbbd-2efd-e30a-3989-b19b0fa2831b.png">

動きました！(パートナーbotとして有名なおじいさんを使っていますが、お気になさらず)

## 環境変数でAPIキーなどを管理する
今回はコードまるまる使わせてもらってる感じで特に書くことがないのですが、githubで管理したいのでAPI keyなどを載せないように環境変数で管理したいと思います。

### python-dotenvをインストール

```bash
(env)$ pip install python-dotenv
```

### .envに秘密の値を入力する

run.pyと同じディレクトリに.envを作成します。ここにAPI Keyなどのgitなどにあげたくない値を入れます。

```.env
# Slack API
API_TOKEN = "XXXXXXXXXXXXXX"

# Docomo対話API
DOCOMO_API_KEY = "XXXXXXXXXXXXXX"
DOCOMO_APP_ID = "XXXXXXXXXXXXXX"
```

### .envからslackbot_settings.pyに読み込む
環境変数はslackbot_settings.pyに読み込ます。

```slackbot_settings.py
# coding: UTF-8
import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

# Slack API
API_TOKEN =  os.environ.get("API_TOKEN")

# Docomo対話API
DOCOMO_API_KEY = os.environ.get("DOCOMO_API_KEY")
DOCOMO_APP_ID = os.environ.get("DOCOMO_APP_ID")

# プラグイン指定
PLUGINS = [
    'plugins',
]
```

### プラグインからAPIキー、appIdを読み込む
初心者なのでimportにかなりつまづきましたが、run.pyが実行ディレクトリなのでslackbot_settingsをimportして値を引っ張ったらうまくいきました。

```plugins/docomo_talk.py
import slackbot_settings

# ~~中略~~
@default_reply()
def default(message):
    """
    Docomo自然対話APIから返答する
    """
    #エンドポイントの設定
    endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=REGISTER_KEY'
    appid = slackbot_settings.DOCOMO_APP_ID
    url = endpoint.replace('REGISTER_KEY', slackbot_settings.DOCOMO_API_KEY)
```

### .gitignoreに追記
.envは忘れずに.gitignoreに。slackbot_settings.pyから機微なデータを除去できたのでこれはgitで管理できるようになりました。

```.gitignore
.DS_Store
__pycache__
env
.env
```

なお、[gitignore.io](https://www.gitignore.io/)というものがあるようなので次から使いたいです。

## 参考リンク
- [lins05/slackbot](https://github.com/lins05/slackbot)
- [Docomo自然対話API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_usage_scenario)
- [Slackbot備忘録(2)　～docomoAPIを使ったbot～](https://qiita.com/usomaru/items/c31ec525eacb5e10c3a1)
- [【GitHub】に載せたくない環境変数の書き方 Python](https://qiita.com/hedgehoCrow/items/2fd56ebea463e7fc0f5b)
- [Pythonのimportについてまとめる](https://qiita.com/suzuki-hoge/items/f951d56290617df4279e)