iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Software Development

從無到有,LINE著不走系列 第 16

Day 15: 強化 Line Bot 功能

  • 分享至 

  • xImage
  •  

步驟 1: 增加回應種類

這步驟主要是讓 Bot 能根據收到的文字訊息作出不同的回覆,實現多樣化回應。

  1. 根據關鍵字回應不同訊息

    • 增加條件判斷邏輯,讓 Bot 根據收到的不同文字內容給予特定回應。
    • 可以定義一些常見問題或指令,例如:
      @handler.add(MessageEvent, message=TextMessage)
      def handle_message(event):
          user_msg = event.message.text.lower()
      
          if "天氣" in user_msg:
              reply = "今天的天氣很好!"
          elif "時間" in user_msg:
              reply = "現在是 " + datetime.now().strftime('%H:%M:%S')
          elif "笑話" in user_msg:
              reply = "為什麼自行車不能站起來?因為它太累了!"
          else:
              reply = "抱歉,我不太明白你的意思。"
      
          line_bot_api.reply_message(event.reply_token, TextSendMessage(text=reply))
      
    • 在這裡,我們根據使用者發送的訊息內容,如「天氣」、「時間」或「笑話」,做出相應的回答。你還可以根據需求擴展更多關鍵詞和回覆內容。
  2. 實現模式識別與回應

    • 可以設計更複雜的模式,如使用正則表達式來匹配某些模式的文字。例如,當使用者輸入一串數字時,Bot 可以進行數學運算:
      import re
      
      @handler.add(MessageEvent, message=TextMessage)
      def handle_message(event):
          user_msg = event.message.text.lower()
          if re.match(r'\d+ \+ \d+', user_msg):
              numbers = list(map(int, re.findall(r'\d+', user_msg)))
              result = numbers[0] + numbers[1]
              reply = f"計算結果:{result}"
          else:
              reply = "請輸入例如 '3 + 5' 這樣的格式進行計算。"
      
          line_bot_api.reply_message(event.reply_token, TextSendMessage(text=reply))
      
    • 這裡我們使用正則表達式匹配簡單的加法算式,並回覆計算結果。

步驟 2: 加入圖片消息的處理

這步驟是讓 Bot 能處理並回應用戶發送的圖片,進一步增加 Bot 的互動性。

  1. 圖片消息處理流程

    • 當用戶發送圖片時,LINE 會發送一個 ImageMessage 事件到你的 Webhook。你可以用 LINE SDK 下載圖片,並進行進一步處理。
    • 在處理圖片時,首先需要檢測消息類型並做出適當回應:
      from linebot.models import ImageMessage
      
      @handler.add(MessageEvent, message=ImageMessage)
      def handle_image(event):
          # 下載用戶發送的圖片
          message_content = line_bot_api.get_message_content(event.message.id)
      
          # 保存圖片到本地
          with open(f"received_image_{event.message.id}.jpg", 'wb') as f:
              for chunk in message_content.iter_content():
                  f.write(chunk)
      
          # 回覆訊息
          line_bot_api.reply_message(
              event.reply_token,
              TextSendMessage(text="收到你的圖片了,謝謝!"))
      
    • 在這個範例中,我們從用戶發送的圖片中取得 message_id,並使用 get_message_content 來下載圖片。下載後,我們儲存圖片並回應「收到你的圖片了」。
  2. 圖片處理與回應

    • 你可以在收到圖片後進行進一步的圖片處理,如通過第三方 API 進行圖像識別,然後回覆分析結果。假設使用者發送一張含有文字的圖片,Bot 可以利用圖像識別技術讀取文字並回傳:
      import pytesseract
      from PIL import Image
      
      @handler.add(MessageEvent, message=ImageMessage)
      def handle_image(event):
          message_content = line_bot_api.get_message_content(event.message.id)
          img_path = f"received_image_{event.message.id}.jpg"
      
          # 保存圖片到本地
          with open(img_path, 'wb') as f:
              for chunk in message_content.iter_content():
                  f.write(chunk)
      
          # 圖像識別 (OCR)
          img = Image.open(img_path)
          recognized_text = pytesseract.image_to_string(img)
      
          # 回覆識別結果
          reply = recognized_text if recognized_text else "我無法讀取圖片中的文字。"
          line_bot_api.reply_message(event.reply_token, TextSendMessage(text=reply))
      
    • 這段代碼使用 pytesseract 進行圖片文字識別,並將識別到的文字回傳給使用者。這樣,Bot 不僅能接收圖片,還可以對其進行處理。

步驟 3: 測試不同類型的消息交互

為了讓 Bot 變得更加靈活,應進一步擴展處理不同消息類型的能力,如位置訊息、影片訊息等。

  1. 處理位置消息

    • 當用戶發送位置時,可以回應地理位置資訊,如經緯度:
      from linebot.models import LocationMessage
      
      @handler.add(MessageEvent, message=LocationMessage)
      def handle_location(event):
          reply = f"你的位置:{event.message.address} (經度: {event.message.latitude}, 緯度: {event.message.longitude})"
          line_bot_api.reply_message(event.reply_token, TextSendMessage(text=reply))
      
    • 這段代碼會在用戶發送位置消息後回應具體的經緯度與地址訊息。
  2. 處理影片消息

    • 同樣地,當用戶發送影片消息時,也可以下載並回應:
      from linebot.models import VideoMessage
      
      @handler.add(MessageEvent, message=VideoMessage)
      def handle_video(event):
          message_content = line_bot_api.get_message_content(event.message.id)
          with open(f"received_video_{event.message.id}.mp4", 'wb') as f:
              for chunk in message_content.iter_content():
                  f.write(chunk)
      
          line_bot_api.reply_message(event.reply_token, TextSendMessage(text="收到你的影片了!"))
      
    • 這段程式會下載用戶發送的影片,並回覆確認訊息。
  3. 綜合測試

    • 測試用戶發送不同類型的消息(文字、圖片、位置、影片等),確保每種類型的消息都能正常接收和處理。
    • 測試過程中可以使用不同設備進行測試,觀察不同網路環境下的表現。

小結

這一天重點是擴展 Line Bot 的消息處理能力,讓它能夠處理並回應多種不同類型的訊息。經過這些增強後,Bot 不僅能夠處理文字訊息,還能夠處理圖片、位置、影片等更多互動形式,提供更豐富的功能與使用體驗。


上一篇
Day 15: [緊急插播]ngrok走出localhost的山洞
下一篇
Day17: 處理用戶輸入
系列文
從無到有,LINE著不走30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言