#概要
LINEへの入力内容をpythonのサーバで受けて、MeCabによる形態素解析の結果を応答として返すLinebotを作りました。Linebotとpythonプログラムの中継にherokuを使いました。
下記のサイトを参考にしました。
PythonでLine botを作ってみた
Getting started with the Messaging API | LINE Developers
#環境
macOS Catalina 10.15.4
python 3.8.0
#事前準備
PythonでLine botを作ってみたの「実装」までを終えておきます。つまり、LineDeveloperアカウントとHerokuアカウントを作り、LineDeveloperコンソールで新規チャンネルを作成し、チャンネルアクセストークンとチャンネルシークレットを取得します。GUIなどたまに変化しているようなので、適宜、LINEの公式ドキュメントを参照しました。
pythonからmecab (mecab-python3)を使えるようにしておきます。
下記サイトなどが参考になるかも知れません。
Python3からMeCabを使う
2021/03/02追記:使う辞書にこだわりがなければ、2021/03/02時点では公式リファレンスのやり方pip install mecab-python3 unidic-lite
が一番簡単です。(追記ここまで)
https://pypi.org/project/mecab-python3/
#pythonサーバの構築
ローカルで適当な名前のディレクトリを作り、仮想環境を立ち上げます。
$ mkdir <dir name>
$ cd <dir name>
$ python -m venv .
$ source bin/activate
各種ライブラリをインストールします。仮想環境を作ったので、mecab-python3
も改めてインストールしておきます。
$ pip install Flask
$ pip install line-bot-sdk
$ pip install mecab-python3 unidic-lite
main.pyを作ります。
PythonでLine botを作ってみた
のコードをもとに、mecabによる形態素解析の部分を追加、変更しています(コード中でコメントしている変更①と変更②が本実装における変更部分です)。
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
import os
#変更①。MeCabのimportとobject宣言を追記
import MeCab
m = MeCab.Tagger('')
app = Flask(__name__)
#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_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:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
#変更①。mecabのパース結果を返すように変更
#TextSendMessage(text=event.message.text))
TextSendMessage(text=m.parse(event.message.text)))
if __name__ == "__main__":
# app.run()
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port)
##Heroku CLIのインストール
Herokuをコマンドラインから使うHeroku CLIをインストールします。
今回はbrewでインストールしました。
$ brew tap heroku/brew && brew install heroku
参考:The Heroku CLI | Heroku Dev Center
##ローカルで環境構築
Heroku CLIがインストールできたら、そのままコマンドラインで、herokuにログインします。
$ heroku login
Herokuのアプリを新規作成します。
$ heroku create <app name>
LINEの認証情報をHerokuの環境変数に設定します。
$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secret" --app <app name>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="Channel Access Token" --app <app name>
設定ファイルを作成します。
バージョンはローカル環境と念の為合わせておきます。
2021/03/02追記:runtime.txtのpythonバージョンはデプロイ日時点でherokuが対応しているものに合わせる必要がありますので、何かしらエラーが起きた場合、適宜修正してみてください(追記ここまで)
python-3.8.0
web: python main.py
またrequirements.txtを作ります。
$ pip freeze > requirements.txt
##Herokuのリモートサーバの設定
リモートサーバの設定をします。自分の環境ではこれをやっておかないと、デプロイ(git push heroku master
)がうまくできませんでした。
$ heroku git:remote -a <app name>
##herokuでmecab-python3を使えるようにする設定
調べると、linuxbrewを用いる方法など出てきますが、最新版のmecab-python3ではunidic-liteをpip installするだけで使うことができますので、ここで特別に何かをする必要はありません。
参考:
https://pypi.org/project/mecab-python3/1.0.3/
Herokuでmecab-python3を使う
##デプロイ
git init
git add .
git commit -am "new commit"
git push heroku master
##テスト
スマートフォンなどでLineDevelopersのチャンネルQR Codeを読み取り、ボットを友達登録します。適当な言葉を打って、形態素解析の結果が返ってきていればOKです。
自動応答メッセージも一緒に帰ってきてしまうので、不要であれば、LineDeveloperコンソール > 応答設定 > 詳細設定 > 応答メッセージのラジオボタンをオフにします。
#更新履歴
日時 | 更新内容 |
---|---|
2021/03/02 | herokuにmecab-python3を使えるようにする方法がより簡単にできることがわかったので、内容を修正しました |
2021/03/02 | runtime.txtに関する補足を追記しました |