初心者がFlaskでlinebotを作成してHerokuでデプロイする

#はじめに
この記事を描こうとした理由を書かせていただきます。
私は、2020年3月プログラミングを学習し始めた者です。その為、学習の記録やアウトプット、再度読めるようにと記事にしようとした次第です。
またここに書かれている事は、様々な記事を参考にしたものです。
そして、linebotを作成した経緯とつまづいてしまった所を書いていきたいと思います。
また何か質問があれば、答えられるものがあるかもしれないので、分からないものがありましたら気軽に質問を投げてみてください。

##目次
・Heroku&LINE開発者アカウント作成
・コーディング
・Git hub push
・Heroku push
・line連携
・実装

###Heroku&LINE開発者アカウント作成
こちらは、他サイトをご覧になって、作成して頂ければ思います。
###コーディング
とりあえず適当にディレクトリを作成して、
下記のファイルを作成したディレクトリに作成します。
--"Directory"
|-app.py
|-Procfile
|-requirements.txt
|-runtime.txt

まずは、app.pyですが、コピペでいいです。
コピペしたら、諸々をインストールしないと使えませんので、調べてインストールします。
コード中で気になる物はご自身で調べてください。

```app.py
from flask import Flask, request, abort

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

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_ACESS_TOKEN')
handler = WebhookHandler('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)
```
Procfileはファイルの中に、コードを書くのが少し工夫が入ります。
参考になるファイルをみて、ご自身で調べて書いてみて下さい。
https://qiita.com/1-row/items/80f89c8ada2e61f04446

```Procfile
web: python app.py
```
続いて、requirements.txt何ですが、下記のように書かなければいけません。
flaskとline-bot-sdkのバージョンを確認して、記入してもいいですが、
このようなコマンドで記入してもいいと思います。書き方は、個人に任せます。

```
$ pip3 freeze > requirements.txt
```
```requirements.txt
Flask==1.1.2
line-bot-sdk==1.16.0
```
runtime.txtのファイルですが、
こちらはPythonのバージョンを確認して書いて下さい

```runtime.txt
python-3.8.0
```

###Git hub push
コードを書いたら、GitHubにPushして下さい。
まずは、GitHubのRepositoriesでNEWで新しいレポジトリを作成します。
そこに、作成したディレクトリをPushします。

```
$ echo "# [ディレクトリ名]" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ git remote add origin [pushするディレクトリのurl]
$ git push -u origin master
```

###Heroku push
Herokuのアプリにpush&アプリケーションを作成する方法です。
アプリケーションの名前は何でもいいですが、heroku createだけだと適当な名前になります。これは各個人に任せます。

```
$ heroku login
$ git init
$ git add .
$ git commit -m 'first commit'
$ heroku create [アプリケーション名]
$ git push heroku master
```

Git HubとHerokuの両方を初めてpushした後に、何かディレクトリに変更などを行なった後は、このような方法でpushします。


```
$ git add .
$ git commit -m 'コメント'
$ git push origin master
$ git push heroku master
```
アプリを使えるように、コマンドラインで以下のように実行します。
**結構ここで、Application errorが発生します。**
私が考えられる原因として、ちゃんとデプロイできてない可能性があります。
それはつまり、git push heroku masterが出来ていないということですね。まずHerokuにログインして、アプリケーションをCreateまでやります。その後にGitにもHerokuにも両方デプロイしたほうがいいです。行う手順が多いので、工程を飛ばして行なっている可能性があります。

```
$ heroku open [アプリケーション名]
```

###LINE連携
　LINE開発者アカウントで、チャンネルアクセストークンとチャンネルシークレットを発行して、下のコードの場所に入れていきます。
　まずは、チャンネルアクセストークンですが、「Messaging API設定」の一番下にありますので、そちらを発行＆コピーして'YOUR_ACESS_TOKEN'の所に入れます。
　次はチャンネルシークレットですが、「チャネル基本設定」の下の方にあるので、発行＆コピーをして'CHANNEL_SECRET'に入れて下さい。

```app.py
line_bot_api = LineBotApi('YOUR_ACESS_TOKEN')
handler = WebhookHandler('CHANNEL_SECRET')
```
　続いては、webhook設定です。これは、「Messaging API設定」の上の方にあります。最初は何も書かれてないと思いますが、先ほど作成して頂いたHerokuのアプリの「OPEN APP]をクリックして、URLを持ってきます。しかし個人的にはここは厄介な所でした。
　まずコマンドラインで、このように実行して下さい。

```
$ heroku open [アプリケーション名]
```
すると、このような画面が出力されると思います。この画面が、ちゃんとデプロイできてますよという画面ですね。
![スクリーンショット 2020-05-18 15.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617421/59dbca86-cd77-f98c-7307-ef834238e157.png)
こちらが表示されたら、URLを使います。

```
https://[アプリケーション名].herokuapp.com/
```
次に、「Messaging API設定」のwebhookにこのように追加して行きます。

```
https://[アプリケーション名].herokuapp.com/callback
```
###実装
lineにアカウントを追加して、チャットを送るとおうむ返しがされると思います。

参照
アプリ作成手順関係
https://qiita.com/suigin/items/0deb9451f45e351acf92
heroku push先変更関係
https://qiita.com/Tattsum/items/b86c9d698b0727934836
https://qiita.com/tamago324/items/4df361fd6ac5b51a8a07