Slackbot備忘録(1)


# ひとこと
pythonの勉強を始めようと思い、手始めにSlackbotを使ったbotを作成。
簡単な会話(特定の言葉に返事を返す)機能と天気・遅延情報を教えてくれる機能を追加。
その時のメモ。


# 準備
## python環境の構築
Pythonをインストールします。
Anacondaを使うとPythonの環境を構築してくれるので便利です。
ので、今回はAnacondaを使った環境構築方法を紹介します。
    
1. <a href = "https://www.anaconda.com/download/">Anaconda</a>のインストール(Python3系が良いです)
1. さっそくAnaconda Navigatorを起動
1. EnvironmentsのCreateから環境構築

![create.PNG](https://qiita-image-store.s3.amazonaws.com/0/201826/bdffc243-45fa-56f0-534d-df61b6c3a5db.png)


   再生ボタンを押して、Open Terminalをクリック

![open.PNG](https://qiita-image-store.s3.amazonaws.com/0/201826/6093c5e5-5bde-edde-0284-8f0b539bf498.png)


作成した環境でコマンドプロンプトを起動することができます


## Slack Botアカウントの作成
1. SlackでBot用のアカウントを作成します。
チームのSlack作成方法等は[Slackのホームページ](https://slack.com/)を見てください。

1. 権限のあるユーザーでログインしている状態で[ここ](https://my.slack.com/services/new/bot)をクリックします。
 Botアカウントの作成画面が開きます。
![slackbot.PNG](https://qiita-image-store.s3.amazonaws.com/0/201826/83b7e381-155b-22dc-0f6b-72c4c559694f.png)

1. 好きなユーザー名を入力して、Add bot integrationをクリックします。
   API Tokenという部分が必要になるので、ここをメモっておいてください。
   ![APIToken.PNG](https://qiita-image-store.s3.amazonaws.com/0/201826/55f51076-a460-a961-6b5d-f9bfc1e408e9.png)


1. 適当にBotさんをカスタマイズ。
   
# コードを作成してBotを動かす
1. Slackbotをインストール。Anacondaで作成した環境でコマンドプロンプトに以下のコードを入力するとできます。 
      ```pip install slackbot```

2. 以下のようなディレクトリ構造を作成
 ![dire[1].png](https://qiita-image-store.s3.amazonaws.com/0/201826/28294971-1bf3-6533-ac13-6b74dff84c12.png)



1. `run.py`に以下のコードを入力

    ```python:run.py
       from slackbot.bot import Bot

        def main():
            bot = Bot()
            bot.run()

        if __name__ == "__main__":
            print('start slackbot')
            main()
    ```

              
1. botアカウントのトークンを指定。
`slackbot_settings.py`に以下のコードを入力

    ```python:slackbot_settings.py
      API_TOKEN = "さっきメモしたAPIToken"

        # このbot宛のメッセージで、どの応答にも当てはまらない場合の応答文字列
        DEFAULT_REPLY = "何言ってんだこいつ"

        PLUGINS = [
            'plugins',
        ]
   ```

1. コードを保存したら、再びコマンドプロンプトを表示。
run.pyの存在するディレクトリに移動して、以下のコマンドを実行します。
    ```python run.py```


1. 作成したアカウントと会話しましょう。

 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/9b961af2-70b0-600e-3221-8290386df272.png)
   
すべての言葉に対して"何言ってんだこいつ"というbotの完成です。

# もっと会話をしてみる
## 特定の言葉に反応させる
先ほど作成したディレクトリ内の`my_mention.py`を編集することで、機能を追加できます。

例として以下のコードを書いてみます。

```python:my_mention.py
from slackbot.bot import respond_to     # @botname: で反応するデコーダ
from slackbot.bot import default_reply  # 該当する応答がない場合に反応するデコーダ

@respond_to('うそまる') #反応してほしい言葉
def mention_func(message):
    message.reply('うそまるは偽物です。') # メンション
```
起動してみましょう。
![usomaru.PNG](https://qiita-image-store.s3.amazonaws.com/0/201826/fd432908-2c70-e0c3-f15d-44c2f1c72a2d.png)

特定の言葉に反応してくれました。

コードについて簡単に解説。
まず、pluginsディレクトリについて。
pluginsディレクトリに作った`_init_.py`
こちらは、Slackbotのプラグインとして読み込ませるディレクトリがPythonパッケージである必要があるために作ったものです。
パッケージとして認識させているだけなので、中身は空です。

続いて、`my_mention.py`
主にこちらに追加したい機能に必要なコードを書きます。
`respond_to`デコレータの引数に反応してほしい言葉をかくことで、Botに対するメンションに反応するように登録されます。
`mention_func`の`mention`部分はファクション名なので、
他の言葉に対してもメンション機能を追加したい場合はここの名前を変えます。

最後に`slackbot_settings.py`
こちらに書いた下のコード部分

 ```python:slackbot_settings.py
        PLUGINS = [
            'plugins',
        ] 
```

こちらはプラグインロードが行われるようにするために記載します。
なので、`plubins`部分には任意のディレクトリ名が入ります。

## 天気予報を取得する
[天気情報API](http://weather.livedoor.com/weather_hacks/webservice)を使って今日の天気情報を取得します。
このサイトではjson形式でデータを返してくれるので、
ここから必要な情報を取得します。

今回は本日の天気と天気に伴ったアイコンを表示させる方法を紹介します。

機能を追加するので、`my_mention.py`に以下のコードを追加します。

 ```python:my_mention.py
@respond_to('今日の天気')
def weather(message):
import urllib
import json

url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='
# '130010'とすると東京の情報を取得してくれる
# ここを変えれば任意の地域の天気情報を取得できる
city_id = '130010'
html = urllib.request.urlopen(url + city_id)
jsonfile = json.loads(html.read().decode('utf-8'))
title = jsonfile['title'] 
telop = jsonfile['forecasts'][0]['telop']
#telopが晴れだったら晴れのスラックのアイコンとか場合分け
telop_icon = ''
if telop.find('雪') > -1:    
    telop_icon = ':showman:'
elif telop.find('雷') > -1:
    telop_icon = ':thinder_cloud_and_rain:'
elif telop.find('晴') > -1:
    if telop.find('曇') > -1:
        telop_icon = ':partly_sunny:'
    elif telop.find('雨') > -1:
        telop_icon = ':partly_sunny_rain:'
    else:
        telop_icon = ':sunny:'
elif telop.find('雨') > -1:
    telop_icon = ':umbrella:'
elif telop.find('曇') > -1:
    telop_icon = ':cloud:'
else:
    telop_icon = ':fire:'
text = title + '\n' + '今日の天気　' + telop + telop_icon
message.send(text) 
```

今日の天気を聞いてみましょう。

![todayweather.PNG](https://qiita-image-store.s3.amazonaws.com/0/201826/d7350b6f-92d2-6010-f501-9c508bcef1ee.png)

再びコードを軽く説明。
まずtitleとtelop部分。
こちらは上記にリンクを貼った天気予報APIのプロパティ名を参考にし、
自分が欲しいプロパティ名を['　']の中に書くことで、プロパティ名に付随する情報を取得できます。
ただし、telopで取得しているforecastsプロパティに関しては、配列形式でデータが挿入されています。
配列の0番目が今日の天気、1番目が明日の天気、2番目が明後日の天気です。
今回は今日の天気を取得したいため、配列の0番目を指定しています。

続いてif文によって分岐している部分ですが、
こちらはtelopで取得した天気ワードを基に、表示させるスラックアイコンを分岐させています。

最後にtext部分でbotに表示させる言葉をつなぎ合わせています。
最高気温を取得したりもできるので、今後カスタマイズの価値があります。

## 遅延情報を取得する
最後に列車の遅延情報を取得します。
[こちら](https://rti-giken.jp/fhc/api/train_tetsudo/)の遅延情報JSONを使って、天気予報を取得した時と同様の方法を使います。

再び機能追加なので、`my_mention.py`に以下のコードを追加します。

 ```python:my_mention.py
@respond_to('電車遅れてる？')
def train(message):
import urllib
import json

url = 'https://rti-giken.jp/fhc/api/train_tetsudo/delay.json'
html = urllib.request.urlopen(url)
jsonfile = json.loads(html.read().decode('utf-8'))
    
for json in jsonfile:    
name = json['name'] 
company = json['company']
text = company + name + 'が遅延してるぴょん♪'
message.send(text) 
```

表示させてみます。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/201826/a09c5d4d-83bd-57c0-9b24-d99298fd5283.jpeg)


まだ地域ごとの遅延情報を表示させるようにカスタマイズしていないため、
全国の遅延情報が出てしまいます。

今後は地域ごとの遅延情報カスタマイズやお勧めのレストランを紹介してくれるbotを作成予定。


# 参考ページ

- [PythonのslackbotライブラリでSlackボットを作る](http://qiita.com/sukesuke/items/1ac92251def87357fdf6)
- [PythonでSlackbotを作る(1)](http://blog.bitmeister.jp/?p=3892)
- [PythonでSlackbotを作る(2)](http://blog.bitmeister.jp/?p=3911)
- [初心者に捧げる対話システムの作り方](http://qiita.com/Hironsan/items/0373339388f460cebb08)
- [Pythonを使ってSlack Botを作成してみた](http://www.monthly-hack.com/entry/2016/08/10/214146)

##つづき
- [Slackbot備忘録(2) ~docomo雑談対話APIを使ったbot~](https://qiita.com/usomaru/items/c31ec525eacb5e10c3a1)