[Python]LineBotを作成する

# はじめに
HerokuとPythonを使った、おうむ返しするLINE BOTの作成方法についてまとめました。

#環境
macOS Mojava

#事前準備
[Line Developerアカウント登録](https://developers.line.biz/ja/
)
[Herokuアカウント登録](https://jp.heroku.com)
[Homebrewインストール](https://brew.sh/index_ja)

# Line Developer側の設定

チャンネルの作成
・チャンネルの種類は「Messaging API」を選択。
・チャンネル名、チャネル説明等を入力し作成します。

チャネルシークレット、チャネルアクセストークンを確認します。
・lineBot作成にあたり必要になります。
・[チャンネル基本設定]-[チャネルシークレット]
・[Message API設定]-[チャネルアクセストークン]

#LINEBOT作成
以下のファイルを作成します。
[フォルダ]
 ├ main.py&emsp;&emsp;&emsp;&emsp;&emsp;(実行するプログラム)
 ├ Procfile&emsp;&emsp;&emsp;&emsp;&emsp;(プログラムの実行方法)
 ├ requirements.txt&nbsp;&nbsp;(インストールするライブラリ)
 ├ runtime.txt&emsp;&emsp;&emsp;&nbsp;(Pythonのバージョン)

main.pyは[line-bot-sdk-python](https://github.com/line/line-bot-sdk-python)を元に作成します。

```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__)

#環境変数取得
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_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 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)
```

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

```:requirements.txt
Flask==0.12.2
line-bot-sdk==1.5.0
```

```:runtime.txt
python-3.6.6
```



#Herokuにデプロイする
Herokuにアプリを作成し、作成したファイルをデプロイします。
また、LINEのチャネルシークレット、チャネルアクセストークンを環境変数として設定します。

Herokuのインストールします。

```
brew tap heroku/brew && brew install heroku
```

Herokuにログインします。

```
heroku login
```

作成したファイルがあるフォルダに移動し、アプリを新規作成します。

```
heroku create アプリ名
```

作成したファイルをHerokuにデプロイします。

```
git add .
git commit -m 'First commit'
git push heroku master
```

Line Developerで作成したチャンネルのチャネルシークレット、チャネルアクセストークンをHerokuの環境変数として設定します。

```
heroku config:add LINE_CHANNEL_ACCESS_TOKEN=チャネルアクセストークン --app googlecalendar-webhook
heroku config:add LINE_CHANNEL_SECRET=チャネルシークレット --app googlecalendar-webhook
```

#WebHouckを設定する
LineからのメッセージをHerokuで受信できるようにWebHockを設定します。
Line DeveloperのチャンネルでWebHockと応答メッセージの設定を行います。

```
```


![スクリーンショット 2020-03-11 22.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/1a350f83-b761-e958-3f54-65a438b7fe6f.png)


メッセージを受け取った時に、WebHockを使用するように
[LINE公式アカウント機能]-[応答メッセージ]-[編集]から応答設定を変更します。
![スクリーンショット 2020-03-11 22.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/60e7162a-6dcd-084d-4cb4-6f382572016a.png)



#実行
メッセージを送信して同じメッセージが返されたら成功です。
メッセージが返ってこない場合

```
heroku logs --tail
```

で、Herokuのログでエラー等が出ているか確認すればいいです。

#PUSHメッセージ送信
Herokuから直接Lineにメッセージを送ることができます。
PUSHメッセージはユーザIDを指定することで送信できます。

```
line_bot_api.push_message(
    ユーザID,
    TextSendMessage(text=メッセージ))
```

#参考
[Herokuでサンプルボットを作成する](https://developers.line.biz/ja/docs/messaging-api/building-sample-bot-with-heroku/#kitchensinkサンプルボットアプリをデプロイする)

[line-bot-sdk-python](https://github.com/line/line-bot-sdk-python)