使用 Flask 建立 Line Bot 聊天機器人

建立專案

建立專案。

1
2
mkdir flask-line-bot
cd flask-line-bot

建立環境。

1
2
pyenv virtualenv 3.11.4 flask-line-bot
pyenv local flask-line-bot

建立頻道

登入 LINE Developers 頁面,選擇 Messaging API 產品,建立一個 Channel。

實作

新增 .gitignore 檔。

1
2
3
4
__pycache__
.vscode
.vercel
.env

新增 requirements.txt

1
2
3
Flask==2.2.2
line-bot-sdk
python-dotenv

安裝依賴套件。

1
pip install -r requirements.txt

新增 .env 檔。

1
2
LINE_CHANNEL_ACCESS_TOKEN=
LINE_CHANNEL_SECRET=

新增 api/index.py 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from flask import Flask, request, abort
from dotenv import load_dotenv
from linebot.v3 import (
WebhookHandler
)
from linebot.v3.exceptions import (
InvalidSignatureError
)
from linebot.v3.messaging import (
Configuration,
ApiClient,
MessagingApi,
ReplyMessageRequest,
TextMessage
)
from linebot.v3.webhooks import (
MessageEvent,
TextMessageContent
)

import os

load_dotenv()

app = Flask(__name__)

configuration = Configuration(access_token=os.getenv('LINE_CHANNEL_ACCESS_TOKEN'))
webhook_handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET'))

@app.route('/')
def home():
return 'OK'

@app.route("/webhook", methods=['POST'])
def webhook():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
try:
webhook_handler.handle(body, signature)
except InvalidSignatureError:
app.logger.info("Invalid signature. Please check your channel access token or channel secret.")
abort(400)
return 'OK'

@webhook_handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=event.message.text)]
)
)

啟動服務。

1
flask --app api/index run

部署

新增 vercel.json 檔。

1
2
3
4
5
6
7
8
{
"rewrites": [
{
"source": "/(.*)",
"destination": "/api/index"
}
]
}

推送程式碼到儲存庫。

部署

Vercel 平台註冊帳號,並且連結儲存庫。

然後在設定頁面,新增相關環境變數。

將 Function 區域改為東京或新加坡。

設定

  1. 進到「Messaging API」頁面,設置應用程式的「Webhook URL」。
1
https://line-bot-flask.vercel.app/webhook
  1. 點選「Verify」按鈕。

  2. 將「Use webhook」功能開啟。

  3. 將「Auto-reply messages」和「Greeting messages」功能關閉。

程式碼

參考資料