LINE BOTでりんな風の自分専用女子高生BOTを作ってみた (Python & Heroku)

* 2016/7/15追記

LINE BOT の Server IP Whitelist がOptional になったみたいなので、Heroku のFixie Addon の設定とServer IP Whitelist の設定を部分を記事の手順から削除しました。別にFixie + Server IP Whitelist の設定をしても動くはずです。

> [【朗報】LINE BOT の Server IP Whitelist がOptionalになってた - にわかサーバー屋さんの覚書](http://architect.hatenadiary.jp/entry/2016/05/18/%E3%80%90%E6%9C%97%E5%A0%B1%E3%80%91LINE_BOT_%E3%81%AE_Server_IP_Whitelist_%E3%81%8COptional%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%9F_1)

---

BOT界隈が非常に盛り上がっています。先週の4/7にLINE BOT APIが先着順でオープンになったので、検証してみました。

[【LINE】メッセージングAPIのオープン化に先駆け、先着1万名限定でBOTアカウントを自由に開発できる「BOT API Trial Account」の無償提供を開始 | LINE Corporation | ニュース](http://linecorp.com/ja/pr/news/ja/2016/1320)


なお、今回の検証をするにあたって以下の記事を参考にさせていただきました。ありがとうございます。

* [とりあえずLINE BOT APIでオウムを作ってみた - Qiita](http://qiita.com/masuidrive/items/1042d93740a7a72242a3)
* [LINE BOT をとりあえずタダで Heroku で動かす - Qiita](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516#comment-e6737f3166be32597681)

# 概要

自分専用の女子高生風Bot Linna があなたのLINE友達になって、エンドレスでLINEでおしゃべりに付き合ってくれます。
対話の仕組みはDocomoの雑談対話APIを使っています。雑談対話APIでは関西弁の女子高生キャラ（桜子？）を指定しているので、それっぽくなっている気がします。画像も女子高生フリー素材をぱくたそからGetしたので、雰囲気はバッチリです。

以下が動作イメージです。
![IMG_4208.PNG](https://qiita-image-store.s3.amazonaws.com/0/5707/798d32f7-7e65-6517-e07e-a6106f847bfc.png "IMG_4208.PNG")

どうやら両想いのようです。

# 使い方

HerokuならHerokuボタンを用意するだけで、誰でもワンクリックデプロイできます。Herokuすごい！

ただし、実際動作させるためには以下のアカウントが必要になります。デプロイ前にアカウントを作成しておきます。

* Herokuアカウント
* LINE Developerアカウント
* Docomo Developerアカウント

これらを準備した上で、以下のリンク先よりHerokuボタンを押してみてください。

[shiraco/linnabot](https://github.com/shiraco/linnabot/tree/trialbot-api)

デプロイボタンクリック時にアプリの名前、LINE/DocomoそれぞれのAPI KEYなどなどが尋ねられるので、LINE/Docomoそれぞれのダッシュボードにログインして確認した内容を入力します。

デプロイが成功したことを確認できたら、以下からLINEのダッシュボードを再度開いて、以下の通り設定しましょう。

https://developers.line.me/channels/

* Herokuのデプロイ先urlをLINEのCallback URLに設定 **※httpsのport番号(443)まで指定が必要なので注意**

多分、 `https://YOUR_APP_NAME.herokuapp.com:443/callback` になります。

![linnabot2.png](https://qiita-image-store.s3.amazonaws.com/0/5707/c7ec997f-50d8-e5b7-6cfb-5ab0798368ff.png "linnabot2.png")

(Server IP Whitelist がOptional になったみたいなので以下は不要)

~~* herokuのfixieのoutboud ip address x 2 をLINEのServer IP Whitelistへ設定~~

~~LINE APIを呼び出す時の接続元IPをfixieで固定してそれをLINE側で許可するように設定します。~~

~~![linnabot1.png](https://qiita-image-store.s3.amazonaws.com/0/5707/2e9774d4-b45e-20e3-5c4d-d7c4710c7d6f.png "linnabot1.png")~~

以上で設定は終わりで、あとはQRコードから友達追加して、LINEアプリで話しかけるだけです。

# 検証したかったこと

* LINE BOTで何ができるのか
* Heroku + PythonでLINE BOTの無料運用
* ついでにPythonのFalconフレームワークつかってみたかった

# システム構成

今回の環境は以下の構成です。

* Python 3.5.1
* Falcon (Python web framework)
* Heroku
* Docomo API

ざっくりした処理フローは以下のイメージです。

![linna-archi.png](https://qiita-image-store.s3.amazonaws.com/0/5707/ecbc28d4-c55b-ddb9-4647-9782091256d8.png "linna-archi.png")

処理的には、LINEで何か話しかけられたのを受けて、callbackが呼び出され、発話内容をDocomoの雑談APIに丸投げしてます。

```python:bot.py(抜粋&改変)
    def on_post(self, req, resp):

        body = req.stream.read()
        receive_params = json.loads(body.decode('utf-8'))

        for msg in receive_params['result']:

            docomo_res = self.docomo_client.send(utt=msg['content']['text'],  # ユーザーの発話内容
                                                 apiname='Dialogue')
            send_content = {
                'to': [msg['content']['from']],
                'toChannel': 1383378250,  # Fixed value
                'eventType': '138311608800106203',  # Fixed value
                'content': {
                    'contentType': 1,
                    'toType': 1,
                    'text': docomo_res['utt'],  # 雑談APIの発話内容
                },
            }
            send_content = json.dumps(send_content)

            header = {
                'Content-Type': 'application/json; charset=UTF-8',
                'X-Line-ChannelID': os.environ['LINE_CHANNEL_ID'],
                'X-Line-ChannelSecret': os.environ['LINE_CHANNEL_SECRET'],
                'X-Line-Trusted-User-With-ACL': os.environ['LINE_CHANNEL_MID'],
            }

            # Server IP Whitelist がOptional になったみたいなのでproxies の指定は不要になった！
            # PROXIES = {'http': os.environ.get('FIXIE_URL', ''), 'https': os.environ.get('FIXIE_URL', '')}
            # res = requests.post(ENDPOINT_URI, data=send_content, headers=header, proxies=PROXIES)
            res = requests.post(ENDPOINT_URI, data=send_content, headers=header)

            resp.body = json.dumps('OK')
```

詳細なのは必要だったら以下からコードを見てください。
[shiraco/linnabot](https://github.com/shiraco/linnabot/tree/trialbot-api)

# ハマったところ

(Server IP Whitelist がOptional になったみたいなので以下は不要)

~~LINE BOT API を叩きに行く際にHerokuのaddonであるfixieをプロキシに設定する必要があります。上記のように、addonを追加したタイミングでHerokuの環境変数に自動的に設定される`FIXIE_URL`を使ってhttp_proxy & https_proxyの設定をします。(http_proxyは今回の用途では必要ないかも。)~~

# まとめ

今回LINEのBOT APIに雑談APIをつなげてみただけですが、チャットインターフェイスは非常にユーザーフレンドリーで、多数の人に使ってもらえる可能性を秘めていて魅力的に映ります。

TrialではBotが1つまでしか作れなかったり、LINEグループに招待できなかったりと用途がパーソナルアシスタント的な使い道が主になってくる気がしますが、メッセージングプラットフォーム大手のLINEがBOTプラットフォームの提供を開始したことには大きな可能性を感じます。
今後制限が緩和されて、様々なBOTアプリが誕生するのは容易に想像できます。今後の動向に目が離せないですね。

Qiitaのlinebotタグへ3,4日で30近い投稿されているのも注目の高さを感じますね。

# 参考

* [【LINE】メッセージングAPIのオープン化に先駆け、先着1万名限定でBOTアカウントを自由に開発できる「BOT API Trial Account」の無償提供を開始 | LINE Corporation | ニュース](http://linecorp.com/ja/pr/news/ja/2016/1320)
* [LINE Developers - BOT API - Overview](https://developers.line.me/bot-api/overview)
* [docomo Developer support | NTTドコモ](https://dev.smt.docomo.ne.jp/)
* [とりあえずLINE BOT APIでオウムを作ってみた - Qiita](http://qiita.com/masuidrive/items/1042d93740a7a72242a3)
* [LINE BOT をとりあえずタダで Heroku で動かす - Qiita](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516#comment-e6737f3166be32597681)
* [Falconで光速のWeb APIサーバーを構築する - Qiita](http://qiita.com/icoxfog417/items/913bb815d8d419148c33)
* [ログ出力のための print と import logging はやめてほしい - Qiita](http://qiita.com/amedama/items/b856b2f30c2f38665701)
* [Dialogue_API_spec_latest.pdf](https://devsite-pro.s3.amazonaws.com/contents_file/Dialogue_API_spec_latest.pdf)
* [heavenshell/py-doco: Client library for docomo API written in Python.](https://github.com/heavenshell/py-doco)
* [「今日は私の誕生日だよ！」と彼に伝える放課後女子高生｜フリー写真素材・無料ダウンロード-ぱくたそ](https://www.pakutaso.com/20150557139post-5533.html)
* [shiraco/linnabot](https://github.com/shiraco/linnabot)
* [【朗報】LINE BOT の Server IP Whitelist がOptionalになってた - にわかサーバー屋さんの覚書](http://architect.hatenadiary.jp/entry/2016/05/18/%E3%80%90%E6%9C%97%E5%A0%B1%E3%80%91LINE_BOT_%E3%81%AE_Server_IP_Whitelist_%E3%81%8COptional%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%9F_1)