Python + HerokuでLINE BOTを作ってみた

勉強のためにオウム返しbotを作ってみました。

##まずはLine developersに登録する。
https://developers.line.biz/ja/services/messaging-api/

アプリ名　→任意のアプリ名
アプリ説明　→説明文
プラン　→Developer Trial
大業種　→個人
小業種　→個人(その他)
メールアドレス　→自分のメールアドレス

利用規約に同意して作成。

チャネル基本設定->メッセージ送受信設定のアクセストークンの再発行ボタンを押下。

Bot情報のLINEアプリへのQRコードで友達登録しておく。

##Flaskとline-bot-sdkをインストール

```console
$ pip3 install flask
$ pip3 install line-bot-sdk
```

https://github.com/line/line-bot-sdk-python
にオウム返ししてくれるBotのサンプルがあるのですが、
これをそのまま使うと上手く行かないので、
[こちら](https://uepon.hatenadiary.com/entry/2018/07/27/002843)のサイト様からmain.pyを参考にさせて頂きました。

```python:main.py

from flask import Flask, request, abort
import os

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

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("/")
def hello_world():
    return "hello world!"

@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 handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)
```

##Heroku(ヘロク)に登録する。
HerokuはPaas(パース)とよばれる、アプリケーションを実行するためのプラットフォームで、
アプリケーションを作成して簡単に動かすことが出来ます。

Herokuコマンドラインインタフェース（CLI）をインストールします。CLIを使用して、アプリケーションの管理と拡張、アドオンのプロビジョニング、アプリケーションログの表示、およびアプリケーションのローカルでの実行を行います。

プラットフォーム用のインストーラをダウンロードして実行します。

```console
$ heroku login

heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/browser/XXXX
Logging in... done
Logged in as XXXX@XXXX
```

##アプリケーションの登録

```console

$ heroku create {自分のアプリケーション名}

Creating ● XXXX... done
https://XXXX.herokuapp.com/ | https://git.heroku.com/XXXX.git
```


##環境変数の設定

```console
$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの文字列" --app {自分のアプリケーション名}
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの文字列" --app {自分のアプリケーション名}
```

##設定の確認

```console
$ heroku config --app {自分のアプリケーション名}
```

##Webhookの設定

管理画面からWebhookの設定をします。

Webhook送信：利用する

Webhook URL：https://<自分のアプリケーション名>.herokuapp.com/callback

接続確認が表示されれば完了です。

##設定ファイルの作成とデプロイ

設定ファイルに記載するためにPythonとFlaskのバージョンを調べておきます。

```console
$ flask --version
```


同じディレクトリに作成
main.py　→ソースコード
runtime.txt　→Pythonのバージョンを記載
requirements.txt　→インストールするライブラリの記載
Procfile　→プログラムの実行方法を定義

```runtime.txt
python-3.7.0
```

```requirements.txt
Flask==1.0.2
line-bot-sdk==1.8.0
```

Procfile
```web: python main.py
```

###変更した内容を反映する

```console
$ git add .
$ git commit -am "make it better"
$ git push heroku master
```

###上手くデプロイ出来たか確認する

```console
$ heroku open
```
Hello Worldが表示されたら正常にデプロイされています。

###ログ確認

```console
heroku logs --tail
```

###詰まったところ
Procfileを作成した際に他二つが.txtだったので、
間違えて.txtで作成してしまっていました。
拡張子の無いファイルを作成するときは、名前を付ける時にダブルクォートで囲んで保存します。

Webhook URLの設定で接続確認をしたところエラーが出ていました。

`Webhookが無効なHTTPステータスコードを返しました（期待されるステータスコードは200です）`

原因は分からなかったのですが、
オウム返しは上手く行っていました。

###ちなみに...

ログの、

```log
WARNING: Do not use the development server in a production environment.
```

この部分で注意されていますが、今回は試すだけなので無視して大丈夫です。
公開するときはちゃんとサーバーを立てろということですね。


##参考
https://qiita.com/akiko-pusu/items/dec93cca4855e811ba6c
https://qiita.com/tomboyboy/items/122dfdb41188176e45b5
https://uepon.hatenadiary.com/entry/2018/07/27/002843