218
236

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-30

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

218
236
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
218
236

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?