iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

跟著 OXXO 一起學 Python系列 第 83

( Day 39.2 ) Python LINE BOT 解析 LINE 的訊息

  • 分享至 

  • xImage
  •  

順利將 LINE BOT 串接 Webhook 後,這篇教學會先使用 Flask 函式庫接收訊息,透過 json 標準函式庫將訊息轉換成字典格式,解析各種訊息包含的屬性,理解訊息的內容後,開發 LINE BOT 才能更得心應手。

將訊息轉換為 json 格式

將 LINE BOT 串連 Colab + ngrok 所建立 Webhook,回到 Colab 寫入下方的程式碼,使用 print 印出 json 格式的 body 資料。

參考:使用 ngrok + Colab 建立 Webhook

from flask_ngrok import run_with_ngrok   # colab 使用,本機環境請刪除
from flask import Flask, request
import json

app = Flask(__name__)

@app.route("/", methods=['POST'])
def linebot():
    body = request.get_data(as_text=True)
    json_data = json.loads(body)
    print(json_data)               # 印出 json_data
    return 'OK'

if __name__ == "__main__":
    run_with_ngrok(app)        # colab 使用,本機環境請刪除
    app.run()

完成後,執行程式,將連動 ngrok 的 Webhook 填入 LINE Message API 裡,Verify 驗證通過後,從 LINE 傳送訊息,接著就能在 Colab 的顯示區裡,就能看見傳送的訊息變成一串 json 的格式,從 json 格式的回應訊息裡,可以看到許多屬性值,使用字典搭配串列的方式就能取出指定的內容。

參考:LINE Developer Common properties

{
  "destination":"Ua3ab05f0fc998ee31756cbc24c4e50f5",
  "events":[
      {
        "type":"message",
        "message":{
            "type":"text",
            "id":"15686965060877",
            "text":"okok"
        },
        "timestamp":1646380955269,
        "source":{
            "type":"user",
            "userId":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        },
        "replyToken":"5df7c3abca3d4956bb04e05d434ea609",
        "mode":"active"
      }
  ]
}

通用屬性

通用屬性表示不論哪種格式的訊息,都會出現的屬性值。

屬性 說明
destination 回應的目的地。
events[0].type 訊息狀態。 message ( 接收訊息 ),postback ( 資料訊息 ),join ( 加入群組 ),leave ( 離開群組 )。
events[0].message.type message 訊息屬性。 text ( 文字 ),sticker ( 表情貼圖 ),image ( 圖片 ),audio ( 聲音 ),video ( 影片 ),location ( 位置 )。
events[0].message.id 這則訊息的 id。
events[0].timestamp 傳送訊息的時間。
events[0].source.type 傳送訊息的來源類型。 user ( 一對一聊天 ),group ( 群組聊天 )。
events[0].source.userId 一對一傳送訊息的使用者 ID,如果是群組聊天則會多一個 groupId。
events[0].replyToken 每則訊息回應使用的 Token。
events[0].mode 訊息狀態。 active ( 正常運作中 ),standby ( 等待中,不會回應訊息 )。

text 文字訊息屬性

如果傳送文字訊息 ( 文字、tag 某人、網址 ),會出現文字訊息屬性。

屬性 說明
events[0].message.text 訊息內容的文字。

sticker 表情貼圖訊息屬性

如果傳送表情貼圖,會出現表情貼圖的屬性。

屬性 說明
events[0].message.stickerId 表情貼圖 ID。
events[0].message.packageId 表情貼圖所在的群組 ID。
events[0].message.stickerResourceType 表情貼圖的類型,STATIC 靜態貼圖,ANIMATION 動態貼圖。
events[0].message.keywords 表情貼圖的關鍵字,以串列表示。

image 圖片訊息屬性

如果傳送圖片,會出現圖片相關屬性。

屬性 說明
events[0].message.contentProvider 圖片提供者,line 為使用者提供,external 為程式發送。

video 影片、audio 聲音訊息屬性

如果傳送影片或聲音,會出現時間長度與提供者的屬性。

屬性 說明
events[0].message.duration 影片或聲音的長度,單位毫秒。
events[0].message.contentProvider 影片或聲音提供者,line 為使用者提供,external 為程式發送。

location 地點位置訊息屬性

如果傳送地點資訊,會出現地理位置相關的屬性。

屬性 說明
events[0].message.latitude 緯度。
events[0].message.longitude 經度。
events[0].message.address 地址。

postback 訊息屬性

如果收到的是 postback 資料,表示直接透過 API 發送,會出現 data 屬性。

屬性 說明
events[0].postback.data 資料內容。

小結

能夠解析 LINE 的訊息後,就能進一步透過程式判斷該如何回應訊息,例如收到了傷心的貼圖,就可以回覆關心的文字,收到了地址查詢的要求,就能回覆地址的資訊,這也是打造一個 LINE BOT 的必經之路。

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 39.1 ) Python LINE BOT 建立並串接 Webhook
下一篇
( Day 40.1 ) Python LINE BOT 自動回覆訊息
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言