はじめに
チーム開発でAWSにデプロイしようとしたら,クレカ登録で弾かれた。- 別のデプロイ先を調べてたらPythonAnywhereを見つけたので試すことに。意外と記事が少なかったので一通り流れだけまとめてみた。
ターゲット
- AWSやAzure,GCP,Herokuなどに登録をしてない人
- line botのデプロイを比較的に簡単にやりたい人
前提スキル
- Python及びFlaskの基礎が分かる人
開発環境
- Windows10
- Python 3.10.7
フレームワーク | バージョン |
---|---|
flask | 2.2.2 |
line-bot-sdk | 2.3.0 |
環境の下準備
LINE Messaging APIの登録
- line messaging apiの登録にline business idの発行が必要です。
参考記事は以下に
- 参考記事通りに進めていくと,プロバイダーが作成され,チャンネルアクセストークンとチャンネルシークレットが発行されるので控えてください。
PythonAnywhereの登録
デプロイ先としてPythonAnywhereを利用するので登録をします。
参考記事を以下に
フレームワークのインストール
- フレームワークとして,line-bot-sdkとflaskを使うのでインストールします。
ターミナルで以下のコマンドを実行してください。
>pip install line-bot-sdk
>pip install flask
- インストールを確認する際は以下のコマンドを実行してください。
>pip list
- コマンド後の結果
flaskとline-bot-sdkのインストールが完了してることが確認できると思います。
ターミナルでpipコマンドを打ってエラー吐かれた場合は,pip.exeがあるパスまで移動して同じpipコマンドを打つとできるかもしれません
これで、line botとpythonanywhereが扱える環境になりました。実際にデプロイしていきます。
※今回はデプロイを目的としてるので、メッセージを送信するとオウム返しする簡易的なline botにしています。
- ファイル構成
test_deploy/
├ main.py
├ requirements.txt
pip freeze > requirements.txt とコマンドを打つとテキストファイルが生成されます。
コードを以下に
import os
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, QuickReply, QuickReplyButton, MessageAction, PostbackAction, FollowEvent, ImageMessage
)
app = Flask(__name__)
LINE_CHANNEL_SECRET = os.getenv("LINE_CHANNEL_SECRET")
LINE_CHANNEL_ACCESS_TOKEN = os.getenv("LINE_CHANNEL_ACCESS_TOKEN")
handler = WebhookHandler(LINE_CHANNEL_SECRET)
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
## 1 ##
#Webhookからのリクエストをチェックします。
@app.route("/callback", methods=['POST'])
#この関数は、LINE Bot API 経由で入力テキストを処理します。
def callback():
# リクエストヘッダーから署名検証のための値を取得します。
signature = request.headers['X-Line-Signature']
# リクエストボディを取得します。
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
# 署名を検証し、問題なければhandleに定義されている関数を呼び出す。
try:
handler.handle(body, signature)
# 署名検証で失敗した場合、例外を出す。
except InvalidSignatureError:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
# ここから実装開始
def handle_message(line_reply_event):
line_bot_api.reply_message(line_reply_event.reply_token,TextSendMessage(text=event.message.text)) #ここでオウム返しを実装
if __name__ == "__main__":
app.run()
下準備も終わったので、実際にデプロイしていきます。
デプロイの流れ
PythonAnywhereのデプロイ準備
$pip install line-bot-sdk
$pip install flask
$pip list
- line-bot-sdkとflaskが確認できればインストール完了です。
デプロイ
-
Filesをクリックし,Directoriesに適当なディレクトリ名を入力してください。入力が完了したら、New directoryをクリックしてください。
-
Upload a fileをクリックして作成したpythonファイルをアップロードします.
requirements.txtは基本なくもよさそう -
フレームワーク選択欄があるので、Flaskを選択します。pythonのバージョンは3.9.0を選択します ※3.10でも可能
-
Pathに作成したディレクトリを指定します。
写真ではPythonファイルを指定してますが、基本ディレクトリの方が無難です
Nextをクリックします。
-
以下の画像の ユーザー名.pythonanywhere.com はwebhookへのリクエストに扱うためのURLとなります。
-
LINE Developerに移り,Webhookの設定を行います。先ほど取得した https:// のURLをWebhook URLに設定します。
※main.pyで/callbackの指定をしているため,以下の画像では,pythonanywhereで取得したURL後に/callbackを指定してます。
おわりに
マイナーなインフラの参考記事って少ないよね~、と思いながら記事を書きました。少しでも役立てれば幸いです。