LINE BotをPython + Heroku + LINE Messaging APIで作成した備忘録

# はじめに

LINE BotをPythonで作成しようと記事を漁った際、開発環境をWindowsで行っている記事が少なかったんですよね。せっかくなので軽くまとめて記述させていただきます。

今回はLINE Botの中身をHerokuからデプロイして**おうむ返しが出来るようになるまで。**  

# 開発環境
・Windows 10 Home
・Python 3.7.4
・Git 2.17.1
  
# LINE messaging APIのチャンネル作成
始めに開発者として**LINE developersへ登録**しましょう。
その後LINE Messaging APIのチャンネルを作成して使用できるようにします

LINEの公式ページ通りに進めれば大丈夫です。
[LINE公式ページ Messaging APIを利用するには](https://developers.line.biz/ja/docs/messaging-api/getting-started/)

以下の折り畳み部分に写真を添付しておきます。
<details><summary>LINE公式　チャンネルの作成手順</summary><img width="500" alt="LINE公式" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214636/022fe956-94f9-7f31-71b7-7d031e8b6fb7.jpeg">
</details>

<img width="300" alt="remi_app" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214636/e836c298-512e-9f6d-c695-f3086884a47d.jpeg">
チャンネル作成が終わるとこんな感じに自分が作成したチャンネルが一覧で見える様になります。

確認が完了したら作成したチャンネル内に入ってチャンネル基本設定へ。
そこにある**[Channel Secret]と[アクセストークン(ロングターム)]の文字列がある事を確認**しておいてください。後々使用します。
始めはアクセストークン欄が空欄なので**再発行ボタンを押して発行**しておきましょう。

## FILE構成
LINE Botのプロジェクトフォルダを以下の様に作成して下さい。

[line-bot]というフォルダ名は任意の名前に変更。
中に入れてある**ファイル名は必ず同じ**にしましょう。
スペルミス等してしまうとHerokuにデプロイの際、エラーを吐きます。
  
```
line-bot
  ├── Procfile
  ├── requirements.txt
  └── main.py
```

#### 軽いファイル説明
Procfile : プログラムの実行方法を定義
requirements.txt : 開発環境で使用しているモジュールを記載
main.py : LINE Botのメインプログラム

## 各ファイルの中身

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

```text:requirements.txt
line-bot-sdk

flask
```

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


## gitリポジトリの作成
```console
$ git init

$ git add .

$ git commit -m "create new"
```

#### もしgitを初めて使用したなら
```$ git init```を行った後にgitの名前とメールアドレスの設定をしましょう。
今回初めてgitを導入した場合、gitの設定が完了していない為に詰まる人が出てくる可能性もあるので一応記述しておきます。

```console
$ git config user.name "名前"

$ git config user.email メールアドレス
```

無事に設定が出来たら```$ git add .```から続けて実行していきましょう。

# Herokuアカウントを作成
[Herokuの公式サイト](https://devcenter.heroku.com/login)から入って手順通りにアカウントの登録を行いましょう。

<img width="500" alt="heroku_login" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214636/f2052247-be48-fb87-25fc-cccbc9af8f65.jpeg>


### Heroku CLIをダウンロード
アカウントを作成したらプラットフォーム用のインストーラー[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)をサイトからダウンロードして下さい。(今回はWindows版)

インストーラーに従ってダウンロードが完了すればターミナルからherokuコマンドが扱えるようになります。

<img width="500" alt="heroku_cli" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214636/0070d777-1814-e3a9-1ec9-b6eb7bfcc8a7.jpeg>


## ターミナルからHerokuにログイン

LINE Bot開発用のルートディレクトリに移動してログインしましょう。

```console
$ heroku login

heroku: Press any key to open up the browser to login or q to exit:
```

キーの入力を求められるので**Enterを押します。**  
そのまま少し待っていると自動的にHerokuの公式サイトへ飛ぶので先ほど作成したアカウントでログインしましょう。
Herokuにlogin出来るとターミナルに以下の様な文が出てくるので表示の確認が出来たらログイン成功です。

```console
Opening browser to https://cli-auth.heroku.com/auth/browser/XXXX
Logging in... done
Logged in as XXXX@XXXX
```

  

## Herokuにデプロイしよう

### Herokuのアプリケーションを作成。
**[APP_NAME]**部分は自分の好きなアプリ名を付けましょう。

```console
$ heroku create APP_NAME

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

### Herokuアプリ内の環境変数を設定
一番始めに行ったLINE Messaging APIのチャンネルを作成した際に確認した[Channel Secret]と[アクセストークン]の文字列を設定しましょう。

```console
$ heroku config:set LINE_CHANNEL_SECRET="Channel Secret" --app APP_NAME

$ heroku config:set LINE_CHANNEL_ACCESS_TOKEN="アクセストークン" --app APP_NAME
```

### Herokuにpushする

```
$ git push heroku master
```
  
# LINE Bot側のWebhook設定を忘れずに

最後にLINE Bot側にWebhook URLの指定をします。
LINE Messaging APIのChannel基本設定の**Webhook URL**にHerokuにデプロイしたアプリケーションのURLを記入

「```https://APP_NAME.herokuapp.com/callback```」

**その他Webhook設定**
Webhook送信：利用する
Botのグループトーク参加：利用しない
自動応答メッセージ：利用しない
友だち追加時あいさつ：利用しない

<img width="500" alt="heroku_login" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214636/68674353-f4ed-b1e8-1158-96c3343cda28.jpeg>


# ページを開いてみる
デプロイが出来たら以下のコマンドを打ち込めばブラウザが開きます。

```console
$ heroku open
```

取り合えず今回はサイトにアクセスして画面がNot Foundになっていれば大丈夫です。

## Botの動作確認
LINE Messing APIにあるチャンネル基本設定のBot情報に友達追加のQRコードが載っているので追加しましょう。

何かメッセージを送ってBotがおうむ返ししたら成功です。
お疲れさまでした。

<img width="300" alt="remi_app_bot" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214636/ff93061b-64fe-7225-4dc5-bd249f5fdfe0.jpeg>




<br>
<be>

## 上手くいかない場合

取り合えずログを見る

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

設定が合っているか一度確認しましょう

```console
$ heroku config --app APP_NAME
```
<br>



あまりにも上手くいかない場合はHerokuのアプリを再度作成してやってみると良いかもしれません。

Herokuのアプリを削除する際は以下の通り

```console
$ heroku apps:destroy --app APP_NAME --confirm APP_NAME
```

# 参考
以下のサイトを参考にさせていただきました。

[HerokuでLINE BOT(python)を動かしてみた - @akabei ]
(https://qiita.com/akabei/items/38f974716f194afea4a5)

[Python + HerokuでLINE BOTを作ってみた - @shimajiri ](https://qiita.com/shimajiri/items/cf7ccf69d184fdb2fb26)

[LINE Messaging API を使ってLINEにメッセージ送信／メッセージ返信する - @fkooo](https://qiita.com/fkooo/items/d07a7b717e120e661093)