はじめに
linebotを作成したので備忘録です。
プログラミング経験がほぼない素人ですのでご容赦ください
・Python歴=0年
・linux歴=1年
GitとかPythonとか全く知識がないので、
間違い等がありましたら、ご指摘いただけると幸いです。
(元気があれば修正します)
環境
(2)中間サーバ
Line Developers
(3)サーバ側環境
Heroku
-Python
-Flask
参考にさせていただいたサイト
(ソースはほぼ●パクリです…すみません…)
https://uepon.hatenadiary.com/entry/2018/07/27/002843
作成手順
1. Herokuのインストール
(1)リンクから、サイトに移動する
Heroku
(2)アカウントを作成する
(3)作成したアカウントでログインする
(4)右上のNew > Create new appを選択
(5)App nameとregionを入力
※App nameは一意だ思うので、適当な名前を付けてください。これから結構使うので短いほうがいいかも
→App nameを控える①
2. gitのダウンロード・インストール
(1)リンクから、サイトに移動する
git-ダウンロード
(4)64-bit Git for Windows Setup.をクリック
(5)ダウンロードしたGit-2.35.1.2-64-bit.exeをダブルクリック
(16)Use Windows' default console windowをクリック後、
Nextをクリック
3. Heroku CLIのダウンロード・インストール
(1)リンクから、サイトに移動する
Heroku CLI-ダウンロード
(3)ダウンロードしたheroku-x64.exeをダブルクリック
4. Line Developerでアカウントを作成・設定する
(1)リンクから、サイトに移動する
LINE Developers
(2)ログインする(アカウントがなければ作成)
(7)チャネル基本設定 > チャネルシークレットの発行をクリック → コードを控える②
(7)Messaging API設定 > チャネルアクセストークン(長期)をクリック → コードを控える③
5. ファイルを準備する
C:\linebot
├─main.py
├─Procfile
├─requirements.txt
└─runtime.txt
(1)エクスプローラーを開いてローカルディスク(C:)をクリック
(4)main.pyに以下を貼り付ける
'''
必要モジュールの読み込み
'''
from flask import Flask, request, abort
import os
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
'''
変数appにFlaskを代入。インスタンス化
'''
app = Flask(__name__)
'''
変数に格納
'''
YOUR_CHANNEL_SECRET = "さっき控えたチャネルシークレット"
YOUR_CHANNEL_ACCESS_TOKEN = "さっき控えたチャネルアクセストークン(長期)"
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)
'''
Herokuログイン接続確認のためのメソッド
Herokuにログインすると「hello world」とブラウザに表示される
'''
@app.route("/")
def hello_world():
return "hello world!"
'''
ユーザーからメッセージが送信された際、LINE Message APIからこちらのメソッドが呼び出される。
'''
@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:
abort(400)
'''
handleの処理を終えればOK
'''
return 'OK'
'''
LINEでMessageEvent(普通のメッセージを送信された場合)が起こった場合に、
def以下の関数を実行します。
reply_messageの第一引数のevent.reply_tokenは、イベントの応答に用いるトークンです。
第二引数には、linebot.modelsに定義されている返信用のTextSendMessageオブジェクトを渡しています。
'''
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
'''
メッセージの返信を条件によって変える
'''
input_text = event.message.text
if "帰" in input_text:
reply_text = "おつかれさま!気をつけて帰ってきてね!"
elif "おはよう" in input_text:
reply_text = "おはよう!今日もがんばって!"
elif "行" in input_text:
reply_text = "いってらっしゃーい"
elif "プリン" in input_text:
reply_text = "ぷるる~ん"
elif "腹" in input_text:
reply_text = "今日のごはんはなににする?"
elif "食" in input_text:
reply_text = "食べすぎはだめだぞ!!!!"
else:
reply_text = "ねむい。おやすみ"
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_text))
'''
ポート番号の設定
'''
if __name__ == "__main__":
'''
app.run()
'''
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
(5)Procfileに以下を貼り付ける
heroku config:set YOUR_CHANNEL_SECRET="さっき控えたチャネルシークレット" --app さっき控えたHerokuのApp name
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="さっき控えたチャネルアクセストークン(長期)" --app さっき控えたHerokuのApp name
(6)requirements.txtに以下を貼り付ける
Flask==2.0.3
line-bot-sdk==2.1.0
(7)runtime.txtに以下を貼り付ける
python-3.9.10
Heroku(サーバ)へファイルを作成してデプロイする
(1)スタートからGit CMDを実行
(2)''で囲われている箇所の指示に従って操作
C:\>heroku login '←入力'
» Warning: Our terms of service have changed: https://dashboard.heroku.com/terms-of-service
heroku: Press any key to open up the browser to login or q to exit:'←適当なキーを入力'
Opening browser to **************'←ログイン画面のブラウザが立ちあがるので、id, passwordを入力'
Logging in... done'←ログイン完了した旨が表示される'
Logged in as **************
6. Heroku(サーバ)へデプロイ(apiを利用可能に)する
警告
前提:以前の操作で立ち上げたGit CMDはそのまま操作します。
(1)linebotフォルダに移動
cd c:\linebot
(2)環境変数を設定(意味ないかも…)
heroku config:set YOUR_CHANNEL_SECRET="さっき控えたチャネルシークレット" --app さっき控えたHerokuのAppName
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="さっき控えたチャネルアクセストークン(長期)" --app さっき控えたHerokuのAppName
(3)gitのリポジトリを作成する
git init
Initialized empty Git repository in C:/linebot/.git/'<-が表示されればOK'
(4)c:\linebot配下のすべてのファイルをコミット対象とする
git add .
'↓が表示されればOK'
[master (root-commit) xxxxxx] first commit
4 files changed, 85 insertions(+)
create mode 100644 Procfile
create mode 100644 main.py
create mode 100644 requirements.txt
create mode 100644 runtime.txt
(5)gitにc:\linebot配下のすべてのファイルをコミット
git commit -m "first_comm"
(6)herokuにc:\linebot配下のすべてのファイルをアップロード
警告
app nameがaaaの場合は、以下の通りになります。
https://git.heroku.com/aaa.git
git remote add heroku https://git.heroku.com/さっき控えたapp name.git
(7)ローカルリポジトリ(c:\linebot配下)の内容をリモートリポジトリ(heroku)に送信する
git push heroku master
'↓が表示されればOK'
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 6 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 1.98 KiB | 1.98 MiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Python app detected
remote: -----> Using Python version specified in runtime.txt
remote: -----> Installing python-3.9.10
remote: -----> Installing pip 21.3.1, setuptools 57.5.0 and wheel 0.37.0
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: Collecting Flask==2.0.3
remote: Downloading Flask-2.0.3-py3-none-any.whl (95 kB)
remote: Collecting line-bot-sdk==2.1.0
remote: Downloading line_bot_sdk-2.1.0-py2.py3-none-any.whl (83 kB)
remote: Collecting itsdangerous>=2.0
remote: Downloading itsdangerous-2.1.1-py3-none-any.whl (15 kB)
remote: Collecting click>=7.1.2
remote: Downloading click-8.0.4-py3-none-any.whl (97 kB)
remote: Collecting Werkzeug>=2.0
remote: Downloading Werkzeug-2.0.3-py3-none-any.whl (289 kB)
remote: Collecting Jinja2>=3.0
remote: Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
remote: Collecting future
remote: Downloading future-0.18.2.tar.gz (829 kB)
remote: Preparing metadata (setup.py): started
remote: Preparing metadata (setup.py): finished with status 'done'
remote: Collecting aiohttp>=3.7.4
remote: Downloading aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.2 MB)
remote: Collecting requests>=2.0
remote: Downloading requests-2.27.1-py2.py3-none-any.whl (63 kB)
remote: Collecting charset-normalizer<3.0,>=2.0
remote: Downloading charset_normalizer-2.0.12-py3-none-any.whl (39 kB)
remote: Collecting multidict<7.0,>=4.5
remote: Downloading multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)
remote: Collecting yarl<2.0,>=1.0
remote: Downloading yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (304 kB)
remote: Collecting frozenlist>=1.1.1
remote: Downloading frozenlist-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (156 kB)
remote: Collecting attrs>=17.3.0
remote: Downloading attrs-21.4.0-py2.py3-none-any.whl (60 kB)
remote: Collecting async-timeout<5.0,>=4.0.0a3
remote: Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
remote: Collecting aiosignal>=1.1.2
remote: Downloading aiosignal-1.2.0-py3-none-any.whl (8.2 kB)
remote: Collecting MarkupSafe>=2.0
remote: Downloading MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB)
remote: Collecting idna<4,>=2.5
remote: Downloading idna-3.3-py3-none-any.whl (61 kB)
remote: Collecting certifi>=2017.4.17
remote: Downloading certifi-2021.10.8-py2.py3-none-any.whl (149 kB)
remote: Collecting urllib3<1.27,>=1.21.1
remote: Downloading urllib3-1.26.8-py2.py3-none-any.whl (138 kB)
remote: Building wheels for collected packages: future
remote: Building wheel for future (setup.py): started
remote: Building wheel for future (setup.py): finished with status 'done'
remote: Created wheel for future: filename=future-0.18.2-py3-none-any.whl size=491070 sha256=b70e3fd11a80fa1401cc
remote: Stored in directory: /tmp/pip-ephem-wheel-cache-i95uqc7e/wheels/2f/a0/d3/4030d9f80e
remote: Successfully built future
remote: Installing collected packages: multidict, idna, frozenlist, yarl, urllib3, MarkupSafe, charset-normalizer, certifi, attrs, async-timeout, aiosignal, Werkzeug, requests, Jinja2, itsdangerous, future, click, aiohttp, line-bot-sdk, Flask
remote: Successfully installed Flask-2.0.3 Jinja2-3.0.3 MarkupSafe-2.1.0 Werkzeug-2.0.3 aiohttp-3.8.1 aiosignal-1.2.0 async-timeout-4.0.2 attrs-21.4.0 certifi-2021.10.8 charset-normalizer-2.0.12 click-8.0.4 frozenlist-1.3.0 future-0.18.2 idna-3.3 itsdangerous-2.1.1 line-bot-sdk-2.1.0 multidict-6.0.2 requests-2.27.1 urllib3-1.26.8 yarl-1.7.2
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 60.7M
remote: -----> Launching...
remote: Released v5
remote: https://linebot-1212.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/linebot-1212.git
* [new branch] master -> master
警告
ここでエラーがでた場合は、以下を確認してください。
・pythonのバージョンがherokuのサポート内かどうか
それでも分からない場合は、エラー個所をコピーして検索してください。
(8)リモートリポジトリを追加、削除する
c:\linebot>heroku git:remote -a さっき控えたapp name
'↓が表示されればOK'
» Warning: heroku update available from 7.53.0 to 7.59.4.
set git remote heroku to https://git.heroku.com/linebot-1212.git
(9)デプロイしたアプリを実行する
heroku ps:scale web=1
'↓が表示されればOK'
» Warning: heroku update available from 7.53.0 to 7.59.4.
(10)デプロイしたアプリにアクセス
heroku open
警告
ここでhello world以外が表示されていれば、以下を確認してください。
(a). requirements.txtファイルの内容を再度確認してください。
(b). コマンドを実行して、ERRORと記載がある行をコピー・検索して原因を確認してください。
heroku logs --tail
'↓が表示されればOK'
» Warning: heroku update available from 7.53.0 to 7.59.4.
2022-03-11T10:00:06.292364+00:00 app[api]: Initial release by user xxxxxx@xx.com
2022-03-11T10:00:06.292364+00:00 app[api]: Release v1 created by user xxxxxx@xx.com
・
・
・
7. Line Developer
(1)リンクから、サイトに移動する
LINE Developers
(3)Webhook設定をする
https://さっき控えたapp name.herokuapp.com/callback
(7)スマホのLINEで友達追加する
(9)完成です!お疲れさまでした!