こんにちは、タクロウです!
前回、オウム返しLINE Botを動かすことができました。

今回、雑談LINE Botにチャレンジしてみました。リクルートが公開しているDeep Learning APIの1つのTalk APIを用いました。こちらの記事を参考にさせていただきました。
参考 A3RTのTalk APIを活用したLINE雑談ボットQiita環境
- macOS High Sierra
- Python3.7.1
- Flask
- Heroku
りんな風雑談LINE Bot

アイコンをフリー素材から女子高生に設定して、りんな風にして対話してみました。それなりに雑談することができました。以下から、友達追加して試してみることもできます。1対話目は、サーバーの立ち上がりで1秒ほどかかります。


Pythonコード
前回のオウム返しLINE Botとほぼ同じです。
Herokuでアプリケーションをデプロイした際に最初に実行されるコマンドを記述するためのProcfileは以下を記述します。
web: gunicorn app:app
Herokuのサーバーにアップロードした際に自動的にpipでHerokuのサーバーにインストールするライブラリを記述するためのrequirements.txtは以下を記述します。
certifi==2018.11.29
chardet==3.0.4
Click==7.0
Flask==1.0.2
future==0.17.1
gunicorn==19.9.0
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10
line-bot-sdk==1.8.0
MarkupSafe==1.1.0
requests==2.21.0
urllib3==1.24.1
Werkzeug==0.14.1
アプリケーションファイルapp.pyを以下を記述します。「YOUR_CHANNEL_SECRET」、「YOUR_CHANNEL_ACCESS」はLINE公式アカウントの情報、「YOUR_API_KEY」はTalk APIで発行したキーです。
import os
import sys
from argparse import ArgumentParser
from flask import Flask, request, abort
import urllib
import json
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
app = Flask(__name__)
# get channel_secret and channel_access_token from your environment variable
channel_secret = "YOUR_CHANNEL_SECRET"
channel_access_token = "YOUR_CHANNEL_ACCESS"
if channel_secret is None:
print('Specify LINE_CHANNEL_SECRET as environment variable.')
sys.exit(1)
if channel_access_token is None:
print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
sys.exit(1)
line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
data = {
"apikey": "YOUR_API_KEY",
"query": event.message.text ,
}
data = urllib.parse.urlencode(data).encode("utf-8")
with urllib.request.urlopen("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk", data=data) as res:
#response = res.read().decode("utf-8")
reply_json = json.loads(res.read().decode("unicode_escape"))
if reply_json['status'] == 0:
reply = reply_json['results'][0]['reply']
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply))
if __name__ == "__main__":
arg_parser = ArgumentParser(
usage='Usage: python ' + __file__ + ' [--port <port>] [--help]'
)
arg_parser.add_argument('-p', '--port', default=8000, help='port')
arg_parser.add_argument('-d', '--debug', default=False, help='debug')
options = arg_parser.parse_args()
app.run(debug=options.debug, port=options.port)
前回同様、ローカル環境でテストし、Herokuにデプロイします。
ローカル環境でテスト
app.pyファイルを起動します。
$ python app.py
別のターミナルから、app.pyと同じローカルのポート番号でngrokを起動します。
$ ngrok http 8000
LINE Developersのチャネル基本設定にアクセスし、Webhook URL欄に、ngrokのURLを設定して、QRコードを読みとり友達追加し、LINEの画面でテストします。チャネル基本設定でWebhookを利用するに設定します。
アプリケーションをデプロイ
Herokuにログインします。
$ heroku login
作業フォルダでgitを初期化し、リポジトリに追加し、コミットします。
$ git init
$ git add .
$ git commit -m "first commit"
Herokuにアプリケーションを作成します。
$ heroku create
ローカルで作成したFlaskのアプリケーションのリポジトリをプッシュします。
$ git push heroku master
さいごに
前回のオウム返しLINE Botをベースに、リクルートのTalk APIを組み合わせることで、雑談LINE Botを作成できました。便利なAPIがたくさん公開されているので、上手く組み合わせてLINE Botをつくっていきましょう!