Python + herokuでおうむ返しLINEbotを作る

## はじめに
今回はPythonとherokuを使っておうむ返しbotを作成しようと思います。
python3とhomebrewの環境が整った人向けの記事となってます。
まだ環境がない人は
https://ai-inter1.com/python-install/
https://qiita.com/balius_1064/items/ac7dff5ef10eaf69996f
の記事などを参考にしてみてください。
### 開発環境
- Python 3.7.3
- flask
- heroku
- macos  10.15.4

## LINE Developers設定
まず、[LINE Developers](https://developers.line.biz/ja/)に自分のLINEアカウントでログインしてください。
![スクリーンショット 2020-05-09 13.10.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/b74bf792-334a-ae89-9176-468f26007e8e.jpeg)

ログインするとDevelopersアカウントの登録画面が表示されるので
- 開発者名
- メールアドレス
を入力して作成してください。

アカウント登録が完了すると
![スクリーンショット 2020-05-09 13.14.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/45e29466-221b-a21e-e0c4-aeaa3329d682.jpeg)

このようなページが表示されるので新規プロバイダー作成をクリックしてください。
プロバイダー名を入力すると
![スクリーンショット 2020-05-09 13.16.31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/e1cbe189-1932-f7c2-ec0d-58820f2112d1.jpeg)

と表示されるので、Messaging APIを選択してください。
![スクリーンショット 2020-05-09 13.17.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/f89fab40-7513-d943-692d-aadf0c4cd1ea.jpeg)
この画面が表示されたら、
- チャンネル名
- チャンネル説明
- 大業種
- 小業種
- メールアドレス
を適当に入力して作成してください。
作成が完了すると、チャンネル基本設定のページが表示されるのでその隣のMessagingAPI設定に移動して、あいさつメッセージと応答メッセージを無効にし、webhookをオンにしましょう。
![スクリーンショット 2020-05-09 13.23.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/a607bb5b-d786-a91e-a34d-ed43c2e9a156.jpeg)
これでLINEbotのアカウントのセットアップは完了です。
表示されているQRコードを自分のLINEで読み取って友達追加をしておきましょう。

## line-bot-sdkとflaskのインストール

```
pip install flask
pip install line-bot-sdk
```

上の二つを実行して[line-bot-sdk](https://github.com/line/line-bot-sdk-python)と[flask](https://a2c.bitbucket.io/flask/)をインストールします。

```
mkdir line-bot
cd line-bot
```

次にターミナルを開いて、linebot用のディレクトリを作成し、そのディレクトリに移動します。

設定ファイルを作成します

```runtime.txt
python-3.7.3
```
```requirements.txt
Flask==1.1.1
line-bot-sdk==1.8.0
```
```:Procfile
web: python main.py
```
- runtime.txt ・・・ Pythonのバージョンを記載
- requirements.txt ・・・ インストールするライブラリを記載
- Procfile ・・・ プログラムの実行方法を記載

ここまで設定できたらpython プログラムの作成です。

```python:main.py
#ライブラリのインポート
from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    FollowEvent, MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, TemplateSendMessage, ButtonsTemplate, PostbackTemplateAction, MessageTemplateAction, URITemplateAction
)
import os
# 軽量なウェブアプリケーションフレームワーク:Flask
app = Flask(__name__)

#LINE Acces Token
LINE_CHANNEL_ACCESS_TOKEN = "LINE_CHANNEL_ACCESS_TOKEN"
#LINE Channel Secret
LINE_CHANNEL_SECRET = "LINE_CHANNEL_SECRET"

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + 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__":
    port = os.getenv("PORT")
    app.run(host="0.0.0.0", port=port)
```
このようにmain.pyを作成してください。

```
#LINE Acces Token
LINE_CHANNEL_ACCESS_TOKEN = "LINE_CHANNEL_ACCESS_TOKEN"
#LINE Channel Secret
LINE_CHANNEL_SECRET = "LINE_CHANNEL_SECRET"
```
LINE Acces TokenとLINE Channel Secretの部分は最初に作成した、LINEbotのチャンネル設定のページに移動し、自分のものを確認してコピペしてください。
![スクリーンショット 2020-05-09 13.56.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/1ecf509f-3100-4bc7-c59a-d71d865307ef.jpeg)
![スクリーンショット 2020-05-09 13.56.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/76dadd02-6a81-8d2e-8b1e-233070cb0c9e.jpeg)

## Herokuの設定
まず、[Heroku](https://id.heroku.com/login)に登録をしてください。(英語苦手な僕には辛かった)
登録が完了したら、create new appをクリックしてアプリを作成してください。
![スクリーンショット 2020-05-09 14.10.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/873153eb-8388-6f01-b627-01822446f5dd.jpeg)
このとき入力するアプリ名は他の人のものと被ってはいけないのでよく考えてつけてください。
![スクリーンショット 2020-05-09 14.11.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/aa444ec1-da33-606c-d066-d5704080a016.jpeg)
アプリの作成が完了したらSettingのDomainsに書かれているurlに/callbackをつけたものをLINE Messaging APIのwebhook設定のところに入力してください。
![スクリーンショット 2020-05-09 14.15.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/fe779e28-119b-9433-dd84-c12f69b8a4a9.jpeg)
![スクリーンショット 2020-05-09 14.17.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/02e6789a-d014-c8cf-3c72-71fbd1bab78a.jpeg)


続いてターミナルで

```
brew install heroku
```
を実行してください。
次にherokuにpushするための設定を行います。

```
heroku login
```
を実行してエンターキーを押すとブラウザが起動します。
そこで先ほど登録したメールアドレスと、パスワードを入力してログインをしてください。

```
Logged in as [登録したメールアドレス]
```
と表示されれば成功です。

```
git init

heroku git:remote -a (アプリ名)

git add .

git commit -m "first commit"

git push heroku master
```
上のコマンドを順番に実行してくとデプロイが完了します。
herokuのActivityのところで
![スクリーンショット 2020-05-09 14.50.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/b18615d8-19ed-9000-e3f3-f455d7d974c6.jpeg)
Build succeededと表示されていれば成功です。

## 環境変数の設定

```
heroku config:set LINE_CHANNEL_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX

heroku config:set LINE_CHANNEL_SECRET=XXXXXXXXXXXXXXXXXXXXX
```
次にターミナルで上の二つを実行して環境変数設定します。
これは先ほどのmain.pyに入力したLINE Acces TokenとLINE Channel Secretと同じなので、コピペをして実行してください。

## 完成
自分のLINEアプリで先ほど追加したbotに適当な文字を送ってみましょう！
自分が送った文字と同じ内容が返ってくれば成功です。
![hoge.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494743/224300a9-be26-2a1e-6f22-74a66db79d1e.jpeg)

既読はつくけどうまくいかないというときはターミナルで

```
heroku logs --tail
```
と入力するとリアルタイムでログが見られるのでそこで原因を究明してみてください。(LINE messaging APIでwebhook無効になっていたりすることがよくあります)

## まとめ
今回はおうむ返しをしてくれるLINEbotを作成しましたが、このソースコードを改良して自分なりのLINEbotを作成することが可能です！
また、[リッチメニュー](https://www.linebiz.com/jp/manual/OfficialAccountManager/rich-menus/create/)や[LIFFアプリ](https://developers.line.biz/ja/docs/liff/developing-liff-apps/)などを加えるともっと豪華なLINEbotを作成することも可能です。
ぜひそちらにも挑戦してみてください！

## 参考
https://developers.line.biz/ja/docs/messaging-api/
https://github.com/line/line-bot-sdk-python