Edited at

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を作ってみた