#はじめに
株式会社サイシードのサマーインターンシップに参加して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はなくてもいけるみたいです)
##3.BOT APIの処理を実装
LINE API Referenceを参考にして、メソッドを作成していきます。
以下のコードはユーザーが送信したメッセージをオウム返しにします。(下の写真で使っているAPIではdocomoの雑談APIを使っておしゃべりしています)
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が表示されます。
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.完成
わりとサクッとできました。以前のトライアル版に比べ、ドキュメントも分かりやすくなっていたので、予想よりはかなり楽に開発出来ました。
#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を作ってみた