Pythonで作るLineBotの作成手順

###前書き
linebotの作成仕方などは多くの記事で書かれていますが、初心者の私にはつまづいたところがあったのでそこを補い、自分にとってわかりやすく作った記事です。
自分用に作った記事なのでわかりにくい点が多々ありますが、他の記事と参照しながら頑張ってください。

####前提　LineBotを作成済
<img width="1040" alt="スクリーンショット 2020-02-01 11.10.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/04569b45-e6ab-e1cb-7960-ca75487d7a3e.png">
####チャンネルシークレットを取得
![スクリーンショット 2020-05-06 17.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/204af3f7-9656-3ddb-d799-e9ff025776b4.png)

####チャンネルアクセストークンを取得

####前提　Herokuアカウント作成済&クレジット登録済
１、ターミナルを起動
２、

```
$mkdir lineBotTest

$cd lineBotTest
```
を入力
3、アプリケーションにあるテキストエディットを起動
4、上バーにあるフォーマットを選択し標準テキストを選択、以下をコピペする
'LINE_CHANNEL_SECRET'など変更する必要なし
そのままコピペする

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

"""
heroku config:set LINE_CHANNEL_SECRET="チャネルシークレット" --app アプリ名
をターミナルに打ち込んだので以下のコードにチャンネルシークレットが毎回自動で入力される。
アクセストークンも同様なので変更する必要なし
"""
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)

"""
チャンネルシークレットやアクセストークンがnull(何もない)の場合の処理
"""
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)
    
"""
Herokuの変数からトークンなどを取得
"""
line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)

"""
LINEからのwebhook
基本変更することはない関数
"""
@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)

    # 署名を検証し、問題なければhandleに定義されている関数を呼び出す
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:#エラーが出た時400と返す
        abort(400)
    return 'OK'

"""
LINEでMassageEvent(テキストメッセージが送信された時)が起こった時呼び出される
line_bot_api.reply_messageの第一引数のevent.reply_tokenはイベントの応答に用いる
第二引数はlinebot.modelsに定義されている返信用のTextSendMessageオブジェクトを渡す
"""
@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
    #入力された内容(event.message.text)に応じて返信
    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)
```

5、名前をmain.pyにする。また保存場所はlineBotTestにする
この時点で
<img width="766" alt="スクリーンショット 2020-02-01 11.32.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/980b2e74-2020-ce30-94d5-2bb77237c110.png">
こうなっているはずである。

6、ターミナルでlineBotTest user$になっているのを確認し、以下のコマンドを入力する

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

$heroku login
//q以外のボタンを押すとログイン開始

$heroku create アプリ名
//他者が作ったアプリ名と被らないユニークな名前を使用
//heroku create linetest0000 今回はlinetest0000を使用

$heroku addons:create fixie:tricycle --app linetest0000
//「Fixie」アドオンの追加

$pipenv install flask
$pipenv install line-bot-sdk
//フォルダ内に「Pipfile」と「Pipfile.lock」が生成されます。

/*
Webスクレイピングをする時は入力する
$pipenv install bs4
$pipenv install requests
*/

$heroku config:set LINE_CHANNEL_SECRET="チャネルシークレット" --app linetest0000
//最初に取得したチャンネルシークレットを入力する

$heroku config:set LINE_CHANNEL_ACCESS_TOKEN="アクセストークン（ロングターム）" --app linetest0000
//最初に取得したアクセストークンを入力する

$echo web: python main.py > Procfile
//Profile作成

$heroku git:remote --app linetest0000

$git init

$git add -A

$git commit -m "コメントを入力"

$git push heroku master

```

git add -A以下のコマンドはコードを変更した時、反映させるために打つコマンド

#####webhookの設定

<img width="1031" alt="スクリーンショット 2020-02-01 12.53.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/b83f37ae-2a35-1008-3794-1d7e3367e8ab.png">
「https://アプリ名.herokuapp.com/callback」を入力します

###注意
コードでimportを使った場合はProcfileで

```
$pipenv install ライブラリ名　
```
を入力
Procfileは開いて入力するのではなくコマンドで入力しよう

動かない時は

```
$heroku logs -t
```
でログを見ることができる。
大抵これでなんとかなる。

これで完成
<img width="350" alt="スクリーンショット 2020-02-01 13.42.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/ecb15da5-8411-ff19-9f63-d539cb7953aa.png">