LINE Messaging APIとPythonを使ってChatbotを作ってみた

#はじめに
[株式会社サイシード](http://sciseed.jp)のサマーインターンシップに参加してLINE Chatbotを開発してきました。2016/9/29にLINEから公式版のMessaging APIが発表されたので、今回は公式版のほうで自動応答してくれるbotを作成しました。
>【LINE】chatbotの開発・普及に向けて新たな展開を発表、新たなMessaging APIを公開し、開発者への正式提供を開始
>https://linecorp.com/ja/pr/news/ja/2016/1516

#追記(2016/10/18)
githubでbotのソースコードを公開しました。
https://github.com/Sciseed/yukko-line-bot

#システム構成
今回の開発環境は以下の通りです。
・Python 3.4.0
・Heroku
・Django 1.8.14
#作り方
##0.サーバーを構築
今回はHerokuを使用し、Djangoを使ってサーバーを立てました。(サーバー構築については後日説明します)
##1.LINEビジネスアカウントの作成
ビジネスアカウントを登録し、Messaging APIアカウントを作成する。
https://business.line.me/ja/services/bot
##2.アカウント情報とWebhook URLを設定する
APIアカウントを作成するとChannel Access Tokenが発行されます。使用するので控えておいてください。
Webhook URLはLINEからメッセージが送信された時に通知するエンドポイントです。
Herokuで作成したURLを指定します。(Trialの時はSSL通信指定があったので今回もあるかと)（ポート番号443はなくてもいけるみたいです）
![webhookurl.jpg](https://qiita-image-store.s3.amazonaws.com/0/123589/0866dea1-836a-a2c3-5b3e-fceb6c6bde28.jpeg)


##3.BOT APIの処理を実装
[LINE API Reference](https://devdocs.line.me/ja/)を参考にして、メソッドを作成していきます。
以下のコードはユーザーが送信したメッセージをオウム返しにします。（下の写真で使っているAPIではdocomoの雑談APIを使っておしゃべりしています）

```python:view.py
REPLY_ENDPOINT = 'https://api.line.me/v2/bot/message/reply'

def post_text(reply_token, text):
    header = {
        "Content-Type": "application/json",
        "Authorization": "Bearer {ENTER_ACCESS_TOKEN}"
    }
    payload = {
          "replyToken":reply_token,
          "messages":[
                {
                    "type":"text",
                    "text": text
                }
            ]
    }
    requests.post(REPLY_ENDPOINT, headers=header, data=json.dumps(payload))
```
##4.Messaging APIで追加された新機能を試してみた
新しく導入されたTemplate Message機能を使い、Carouselを実装してみました。
思ったより制限が多くて少し手こずりました。要素の個数制限と、説明文の文字数制限には注意してください。また、ドキュメントによると、サムネイルはHTTPSで送る必要があるそうです（HTTPで送れるかどうかは未確認）。

LINEのチャット画面で、
「おすすめレストランは？」
「良いランチスポットを教えて。」
など、
「レストラン」「ランチ」と「おすすめ」「教えて」
などが含まれる文を入力すると、Carouselが表示されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/123589/ae4d59e8-c5ae-dd77-362c-351b4f2b9ba4.png" width=50%>

```python:views.py

def post_carousel(reply_token):
    header = {
        "Content-Type": "application/json",
        "Authorization": "Bearer {ENTER_ACCESS_TOKEN}"
    }
    payload = {
          "replyToken":reply_token,
          "messages":[
              {
                "type": "template",
                "altText": "おすすめレストラン",
                "template": {
                    "type": "carousel",
                    "columns": [

                        {
                          "thumbnailImageUrl": "https://s3-us-west-2.amazonaws.com/lineapitest/hamburger_240.jpeg",
                          "title": "ジャンク・バーガー",
                          "text": "誰が何と言おうとジャンクフードの王様は、今も昔も変わらずハンバーガー。",
                          "actions": [

                              {
                                  "type": "uri",
                                  "label": "詳細を見る",
                                  "uri": "http://example.com/page/222"
                              }
                          ]
                        },
                        {
                          "thumbnailImageUrl": "https://s3-us-west-2.amazonaws.com/lineapitest/pizza_240.jpeg",
                          "title": "pizza cap",
                          "text": "本場ナポリの味を早く、安く。都内に17店舗展開するピザ専門店です。",
                          "actions": [
                          
                              {
                                  "type": "uri",
                                  "label": "詳細を見る",
                                  "uri": "http://example.com/page/222"
                              }
                          ]
                        },
                        {
                          "thumbnailImageUrl": "https://s3-us-west-2.amazonaws.com/lineapitest/bread_240.jpeg",
                          "title": "本格パン工房 たけよし",
                          "text": "パンにとって一番大事だと思うものはなんですか？たけよしは、表面の焼き上がりこそが命であると考えています。",
                          "actions": [
                          
                              {
                                  "type": "uri",
                                  "label": "詳細を見る",
                                  "uri": "http://example.com/page/222"
                              }
                          ]
                        },
                        {
                          "thumbnailImageUrl": "https://s3-us-west-2.amazonaws.com/lineapitest/harumaki_240.jpeg",
                          "title": "ヴェトナムTokyo",
                          "text": "東池袋にあるしたベトナム料理の老舗。40年以上人々に愛され続けてきたベトナム料理をご提供します。",
                          "actions": [
                          
                              {
                                  "type": "uri",
                                  "label": "詳細を見る",
                                  "uri": "http://example.com/page/222"
                              }
                          ]
                        },
           
                    ]
                }
              }
            ]
    }
    req = requests.post(REPLY_ENDPOINT, headers=header, data=json.dumps(payload))
```

##5.完成

わりとサクッとできました。以前のトライアル版に比べ、ドキュメントも分かりやすくなっていたので、予想よりはかなり楽に開発出来ました。

LINEに友達追加してぜひ試してみてください！^ ^
<img src="http://qr-official.line.me/L/LQY1UEIy7O.png" width='30%'>   <a href="https://line.me/R/ti/p/%40nuu4365h"><img height="36" border="0" alt="友だち追加数" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>

#Tips
・メッセージ送信時に「...このアカウントでは個別のご返信ができないのです...」と返される場合は、自動応答機能が働いているので、LINE@ MANAGER→アカウント設定→Bot設定→自動応答メッセージを一時的にオフにすると返信してくれます。
・Trial版ではport番号443の指定が必要でしたが、不要になったみたいです。
・Carouselは2016/9/30時点でiPhone上では動きませんでした。

・今回はオウム返しするだけですが、post_textに渡すtextをdocomoの雑談APIで返すと簡単におしゃべりロボットができます。(上記のアカウントでは実装済み)
#まとめ
Trial版からさらにいくつかの機能が追加されました。言語処理の開発も進行していますし、ますます高品質・多機能のchatbotが生まれてきそうですね。
今回インターンで参加したサイシードでは、自然言語処理と機械学習を用いて、就活生に高品質なアドバイスを提供する[「就活Myコンシェル」](http://shukatsu.myconcier.net/all_new/)というLINEサービスを開発しています。エンジニアのインターン生も随時募集しているそうです。
#続きの記事
[LINE Messaging APIとPythonを使ってChatbotを作ってみた
(2)](http://qiita.com/Kosuke-Szk/items/e31df8665f2a83406362)
#参考
・[LINE BOTでりんな風の自分専用女子高生BOTを作ってみた (Python & Heroku)](http://qiita.com/shiraco/items/58a33b878fa5f1180d75)
・[LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516#comment-e6737f3166be32597681)
・[LINE API Reference](https://devdocs.line.me/ja/#messaging-api)
・[HerokuにDjangoアプリをデプロイするときのまとめ](http://qiita.com/jtwp470/items/0034c85130928851ce72)
・[LINE BOT APIを使ってPythonでLINE BOTを作ってみた](http://osa030.hatenablog.com/entry/2016/04/08/214939)