Pythonで雑談LINE Botをつくってみた!サンプルBot公開

こんにちは、タクロウ(@takuro_109)です!

前回、オウム返しLINE Botを動かすことができました。

Pythonで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をつくっていきましょう!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です