形態素解析の結果を返すLinebot（python × MeCab × heroku）

#概要
LINEへの入力内容をpythonのサーバで受けて、MeCabによる形態素解析の結果を応答として返すLinebotを作りました。Linebotとpythonプログラムの中継にherokuを使いました。

下記のサイトを参考にしました。
[PythonでLine botを作ってみた](https://qiita.com/kro/items/67f7510b36945eb9689b)
[Getting started with the Messaging API | LINE Developers](https://developers.line.biz/en/docs/messaging-api/getting-started/#using-console)
#環境
macOS Catalina 10.15.4
python 3.8.0
#事前準備
[PythonでLine botを作ってみた](https://qiita.com/kro/items/67f7510b36945eb9689b)の「実装」までを終えておきます。つまり、LineDeveloperアカウントとHerokuアカウントを作り、LineDeveloperコンソールで新規チャンネルを作成し、チャンネルアクセストークンとチャンネルシークレットを取得します。GUIなどたまに変化しているようなので、適宜、LINEの公式ドキュメントを参照しました。

pythonからmecab (mecab-python3)を使えるようにしておきます。
~~下記サイトなどが参考になるかも知れません。~~
~~[Python3からMeCabを使う](https://qiita.com/taroc/items/b9afd914432da08dafc8)~~

<b>2021/03/02追記：使う辞書にこだわりがなければ、2021/03/02時点では公式リファレンスのやり方`pip install mecab-python3 unidic-lite`が一番簡単です。(追記ここまで)</b>
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を作ってみた](https://qiita.com/kro/items/67f7510b36945eb9689b)
のコードをもとに、mecabによる形態素解析の部分を追加、変更しています（コード中でコメントしている変更①と変更②が本実装における変更部分です）。

```Python:main.py
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](https://devcenter.heroku.com/articles/heroku-cli)

##ローカルで環境構築
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>
```

設定ファイルを作成します。
~~バージョンはローカル環境と念の為合わせておきます。~~
<b>2021/03/02追記：runtime.txtのpythonバージョンはデプロイ日時点でherokuが対応しているものに合わせる必要がありますので、何かしらエラーが起きた場合、適宜修正してみてください</b>(追記ここまで)

```:runtime.txt
python-3.8.0
```

```:Procfile
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を使う](https://qiita.com/shimajiroxyz/items/1a7629e6c5da907b2926)
##デプロイ

```
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に関する補足を追記しました|