接下來,如果要在 Azure Web App 上打造 chatbot ,那就必須會用到 Line Massaging API ,透過 Line Massaging API 才能讓 chatbot 與使用者溝通。
webhook event
到 chatbot server取得 Secret & Token
issue
,得到 Channel access token
將 Channel Secret 和 Channel access token 存到config.json
上傳到 Azure Web App。
config.json
{
"line": {
"line_secret": "your line secret",
"line_token": "your line token",
}
}
az webapp create-remote-connection \
-n <你的Web App名稱> --resource-group <你的資源群組> &
scp
上傳config.json
,這邊要注意只能上傳到/home
,這樣在 Web App 的 chatbot 才能讀到此檔案。scp -P <port> config.json ben@127.0.0.1:/home/config.json
或者,直接利用az webapp config appsettings set
設定環境變數,詳情請看Day 04 Azure Web App- 方便部署服務。
pip3.7 install line-bot-sdk
把之前的 "hello world" 的Flask
網頁改寫成以下的樣子,並且部署到 Azure Web App ,就能讓 chatbot 與 Line Platform 溝通。
application.py
import json
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
app = Flask(__name__)
# 讀取 config.json,取得 secret 和 token
CONFIG = json.load(open("/home/config.json", "r"))
LINE_SECRET = CONFIG["line"]["line_secret"]
LINE_TOKEN = CONFIG["line"]["line_token"]
LINE_BOT = LineBotApi(LINE_TOKEN)
HANDLER = WebhookHandler(LINE_SECRET)
@app.route("/callback", methods=["POST"])
def callback():
# X-Line-Signature: 數位簽章
signature = request.headers["X-Line-Signature"]
print(signature)
body = request.get_data(as_text=True)
print(body)
try:
HANDLER.handle(body, signature)
except InvalidSignatureError:
print("Check the channel secret/access token.")
abort(400)
return "OK"
接著就要到剛剛建立的 Messaging API channel ,設定webhook
。
/callback
https://<YOUR WEB APP NAME>.azurewebsites.net/callback
在application.py
加上以下這一段,就可以讓chatbot學你說話。透過 HANDLER
,可以辨別 chatbot 接受到的訊息種類,基本的訊息種類有:
我們可以讓 chatbot 針對接收到的訊息種類做相對應的動作,在這邊是針對文字訊息做處理。收到文字訊息後,如果有收到特定文字,便給予特定答覆,其餘則直接學對方說話,回覆相同的文字。要回覆給使用者的字串需要經由TextMessage
包裝成物件之後,才能透過reply_message
回覆給使用者。可以試著在application.py
加入以下示範程式,確認效果。
from linebot.models import (
MessageEvent,
TextMessage,
TextSendMessage,
)
# 可以針對收到的訊息種類作出處理,這邊是針對 TextMessage
@HANDLER.add(MessageEvent, message=TextMessage)
def handle_message(event):
url_dict = {
"ITHOME":"https://www.ithome.com.tw/",
"HELP":"https://developers.line.biz/zh-hant/docs/messaging-api/"}
# 將要發出去的文字變成TextSendMessage
try:
url = url_dict[event.message.text.upper()]
message = TextSendMessage(text=url)
except:
message = TextSendMessage(text=event.message.text)
# 回覆訊息
LINE_BOT.reply_message(event.reply_token, message)
下一篇比較輕鬆,教大家怎麼美化自己的 Line 訊息。