本篇所使用的機器人目前回覆的負擔很輕,但若是使用 ChatGPT 等生成式 AI,以及需要撈取大型資料庫資料的時候,往往會有等待的情況,也因此 LINE 提供 Loading Animation API 讓開發者可以先傳送思考動畫去前台,以此維持流暢的使用者體驗,使得與機器人聊天過程中運作上會變得更加流暢,減少卡頓感,並會自動在後端處理完訊息後馬上消失。
比起 Loading 翻成載入動畫,我比較喜歡說它在思考它在想,所以叫做思考動畫: D
其原理是當取得使用者傳來的訊息後,根據 event.source.user_id
(稍後會提到) 呼叫 API /v2/bot/chat/loading/start
傳送動畫。
所以先寫一個 send_loading_animation
函式呼叫 API,傳送的資料包含 chatId
即 user_id
;loadingSeconds
可以調整思考的時間,以 5 為一數,範圍是 5~60,此參數選填且其預設為 20 :
def send_loading_animation(user_id):
url = "https://api.line.me/v2/bot/chat/loading/start"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {settings.LINE_CHANNEL_ACCESS_TOKEN}",
}
# 呼叫所代的參數
data = {
"chatId": user_id,
"loadingSeconds": 5 # 可以修改這個秒數
}
# 發送 POST 請求到 LINE API
response = requests.post(url, json=data, headers=headers)
if response.status_code == 202:
print("Loading animation sent successfully")
else:
print(f"Error: {response.status_code}, {response.text}")
這邊要注意
status_code
為 202 是代表成功。
這邊修正的地方是原本透過文字觸發的函式 handle_msg
,透過 event.source.user_id
先取得 user_id
:
# hulolo > chatbot > views.py
@parser.add(MessageEvent, message=TextMessage)
def handle_msg(event):
user_message = event.message.text # 取得使用者發送的文字
user_id = event.source.user_id # 取得使用者識別碼
使用者識別碼是每個官方帳號與使用者專屬的一串編號,不能在不同官方帳號通用。
往下一點點如果存在此老師名則呼叫 send_loading_animation
# hulolo > chatbot > views.py > handle_msg function
if filtered_teacher.exists():
send_loading_animation(user_id)
同理,如果存在此課程名則呼叫 send_loading_animation
# hulolo > chatbot > views.py > handle_msg function
elif filtered_course.exists():
send_loading_animation(user_id)
同義詞簡稱的部分也可以呼叫:
# hulolo > chatbot > views.py > handle_msg function
elif filtered_course_alias.exists():
send_loading_animation(user_id)
另外,在 PostbackEvent
也就是按下列表按鈕之後,也可以代入思考動畫:
# hulolo > chatbot > views.py
@parser.add(PostbackEvent)
def handle_postback(event):
#取得使用者點按鈕時回傳的資料
postback_data = event.postback.data
user_id = event.source.user_id
send_loading_animation(user_id)
user_id
是一串使用者識別碼,代表的是使用者 (有的會是群組),長得像是 U8189cf6745fc0d808977bdb0b9f22995
,在很多與 LINE Messaging API 中會需要它。在這篇文章中,我們學會了: