【Python】【LINE Bot】オウム返しLINE Botを作成する

今さらながらですが、ふとLINE Botを作成してみようと思い、
ただただオウム返しをするLINE Botを作ってみました。
![スクリーンショット 2020-05-12 20.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/d983ea0c-902a-2e25-1411-28bac070cac2.png)

#1.LineMessagingAPIのチャネルを作る
##LINE Developersでチャネルを作成
基本的に以下の公式ページに従って特に問題なく登録できるはず
[Messaging APIを利用するには | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/getting-started/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)
>![スクリーンショット 2020-05-12 20.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/83b70611-c51f-d7f0-ca71-6389eac33f13.png)

無事チャネルが登録できると↓のような状態に
![スクリーンショット 2020-05-12 20.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/82241de2-1ec0-7419-144d-c2e26b284cb1.png)

あとで必要になるので以下の2つを確認しておく
　・ Channel secret ← Basic Settingタブの中にあります
　・ Channel access token (long-lived) ← MessagingAPIタブの中にあります

#2.Heroku
##アカウントを作成する
基本的に以下の公式ページに従って特に問題なく登録できるはず
[Heroku Dev Center](https://devcenter.heroku.com/)
>![スクリーンショット 2020-05-12 21.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/add1067e-c321-8ba2-a348-3dcf648916be.png)

##Heroku CLI をダウンロード
以下のページからHeroku CLIをダウンロード・インストールする
[The Heroku CLI | Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-cli)
>![スクリーンショット 2020-05-12 21.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/a3ee0f63-8bb9-a06e-418e-27c04e72a1b5.png)

無事インストールが完了すると、ターミナルでherokuコマンドが使用できるようになっているはず
![スクリーンショット 2020-05-12 21.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/32d3026a-35ea-e4be-e4aa-7d23e53b45e4.png)

#3.デプロイするファイルの作成
##ファイルの構成
以下の構成でファイルを作成する
![スクリーンショット 2020-05-12 21.29.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/f78cb13e-e4e9-a9a0-9e54-74a8cf576e95.png)

###main.py
プログラムの本体部分

```python:main.py
# -*- coding: utf-8 -*-
#  Licensed under the Apache License, Version 2.0 (the "License"); you may
#  not use this file except in compliance with the License. You may obtain
#  a copy of the License at
#
#       https://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#  License for the specific language governing permissions and limitations
#  under the License.

import os
import sys
from argparse import ArgumentParser

from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
    print('Specify LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_access_token is None:
    print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(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 message_text(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text)
    )


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

###Procfile
プログラムの実行方法

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

###requirements.txt
使用するモジュール

```
Flask==0.12.2
line-bot-sdk==1.8.0
```

###runtime.txt
pythonのバージョンを記載

```
python-3.6.6
```

#4.Herokuにデプロイ
##gitレポジトリを作成し、コミット
ターミナルなどから以下のコマンドを実行する

```
$ cd line-bot
$ git init
$ git config user.name "名前"
$ git config user.email メールアドレス
$ git add .
$ git commit -m "コメント"
```
$ cd line-bot : ルートディレクトリへ移動
$ git init : gitレポジトリの初期化
$ git config user.name "名前" : configの設定
$ git config user.email メールアドレス : configの設定
$ git add . : 追加
$ git commit -m "コメント" : コミット

##Herokuへログイン
以下のコマンドを実行しHerokuへログイン

```
$ heroku login
```
実行すると以下のような状態になるので何かキーを押すとブラウザでログイン画面が表示されるので、
Log Inボタンをクリックしてログイン状態にする
![スクリーンショット 2020-05-12 21.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/9b6816c7-48de-5991-d97e-85b862286705.png)
![スクリーンショット 2020-05-12 21.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/fc54d000-db9e-d836-f865-3a1be0c00d74.png)

##アプリケーションを作成し、デプロイ
以下のコマンドを実行し、Herokuにアプリケーションを作成・デプロイする

```
$ heroku create アプリケーション名
$ heroku config:set LINE_CHANNEL_SECRET="Channel Secret" --app アプリケーション名
$ heroku config:set LINE_CHANNEL_ACCESS_TOKEN="アクセストークン" --app アプリケーション名
$ git push heroku master
```
アプリケーション名は任意の名前
「Channel Secret」と「アクセストークン」はLINE Developersでチャネルを作った時に確認したものを設定する

##build packの設定
build pack の設定ができてないとデプロイに失敗する場合がある。
その場合は以下のコマンドを実行し、build packを設定する

```
$ heroku buildpacks:set heroku/python
```

#5.LINE Bot側でwebhookの設定
LineDevelopersのコンソールから作成しておいたチャネルのWebhook settingsを設定する
Webhookを使用するにし、webhook URLに以下のURLを指定する

```
https://アプリケーション名.herokuapp.com/callback
```

#完成
ここまでの作業が完了するとオウム返ししてくれるボットが完成しました！
HerokuもGitもMessagingAPIも使ったことない初心者でしたが、意外と簡単に作成できました
今後はこれをもとに何か作れたらいいなぁ
![スクリーンショット 2020-05-12 22.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130414/130a3e39-2761-6f2f-3bc4-8d424d694128.png)