Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

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

sciseed
AI・RPAを活用した業務効率化ソリューション『sAI Chat』『sAI Search』を提供するITベンチャー
https://saichat.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした