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

  • 96
    いいね
  • 0
    コメント

はじめに

株式会社サイシードのサマーインターンシップに参加して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

3.BOT APIの処理を実装

LINE API Referenceを参考にして、メソッドを作成していきます。
以下のコードはユーザーが送信したメッセージをオウム返しにします。(下の写真で使っているAPIではdocomoの雑談APIを使っておしゃべりしています)

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が表示されます。

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に友達追加してぜひ試してみてください!^ ^
友だち追加数

Tips

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

・今回はオウム返しするだけですが、post_textに渡すtextをdocomoの雑談APIで返すと簡単におしゃべりロボットができます。(上記のアカウントでは実装済み)

まとめ

Trial版からさらにいくつかの機能が追加されました。言語処理の開発も進行していますし、ますます高品質・多機能のchatbotが生まれてきそうですね。
今回インターンで参加したサイシードでは、自然言語処理と機械学習を用いて、就活生に高品質なアドバイスを提供する「就活Myコンシェル」というLINEサービスを開発しています。エンジニアのインターン生も随時募集しているそうです。

続きの記事

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

参考

LINE BOTでりんな風の自分専用女子高生BOTを作ってみた (Python & Heroku)
LINE BOT をとりあえずタダで Heroku で動かす
LINE API Reference
HerokuにDjangoアプリをデプロイするときのまとめ
LINE BOT APIを使ってPythonでLINE BOTを作ってみた