iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Software Development

做一支專屬自己學校的課程評價 LINE Bot 吧!系列 第 18

[Day 18] LINE Bot 回覆加上 Loading Animation 思考載入動畫 (V3.11.0)

  • 分享至 

  • xImage
  •  

使用者是一種需要被安撫的生物

本篇所使用的機器人目前回覆的負擔很輕,但若是使用 ChatGPT 等生成式 AI,以及需要撈取大型資料庫資料的時候,往往會有等待的情況,也因此 LINE 提供 Loading Animation API 讓開發者可以先傳送思考動畫去前台,以此維持流暢的使用者體驗,使得與機器人聊天過程中運作上會變得更加流暢,減少卡頓感,並會自動在後端處理完訊息後馬上消失

Loading Animation

比起 Loading 翻成載入動畫,我比較喜歡說它在思考它在想,所以叫做思考動畫: D

定義需求

  • 使用者輸入老師名/課程名,資料庫中若有該筆資料即先傳送思考動畫
  • 使用者按下列表選項時,即先傳送思考動畫
  • 若資料庫無該筆資料,不傳送思考動畫

編寫邏輯

思考動畫是一支 POST API

其原理是當取得使用者傳來的訊息後,根據 event.source.user_id (稍後會提到) 呼叫 API /v2/bot/chat/loading/start 傳送動畫。

所以先寫一個 send_loading_animation 函式呼叫 API,傳送的資料包含 chatIduser_idloadingSeconds可以調整思考的時間,以 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 是代表成功。

資料庫結果不為空時呼叫函式

  1. 這邊修正的地方是原本透過文字觸發的函式 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 # 取得使用者識別碼
    

    使用者識別碼是每個官方帳號與使用者專屬的一串編號,不能在不同官方帳號通用。

  2. 往下一點點如果存在此老師名則呼叫 send_loading_animation

    # hulolo > chatbot > views.py > handle_msg function
    if filtered_teacher.exists():
            send_loading_animation(user_id)
    
  3. 同理,如果存在此課程名則呼叫 send_loading_animation

    # hulolo > chatbot > views.py > handle_msg function
    elif filtered_course.exists():
        send_loading_animation(user_id)
    
  4. 同義詞簡稱的部分也可以呼叫:

    # hulolo > chatbot > views.py > handle_msg function
    elif filtered_course_alias.exists():
        send_loading_animation(user_id)
    
  5. 另外,在 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)
    
    

結果

Loading Animation

再往前一點點

  • user_id 是一串使用者識別碼,代表的是使用者 (有的會是群組),長得像是 U8189cf6745fc0d808977bdb0b9f22995,在很多與 LINE Messaging API 中會需要它。
  • 通常 API 回傳成功的狀態碼會是 200,此 API 則為 202。
  • 如果不管使用者打什麼就傳思考動畫,但最後卻沒有回覆,會有影響使用者體驗的疑慮。(跟人類一樣想一想還是別說好了?)
  • 此功能於 2024.04.17 發布,請注意使用的 line-bot-sdk-python 套件版本是否大於 3.11.0

覆盤

在這篇文章中,我們學會了:

  • 呼叫與手刻 LINEMessaging API
  • 應用 Loading animation 增加使用者體驗
  • Day 18 原始碼

上一篇
[Day 17] 簡易前端框架 Bootstrap 5 製作評價瀏覽網頁 (下)
下一篇
[Day 19] 讓 Flex Message 訊息中帶有 CTA 按鈕
系列文
做一支專屬自己學校的課程評價 LINE Bot 吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言