解析 LINE 的訊息
順利將 LINE BOT 串接 Webhook 後,這篇教學會先使用 Flask 函式庫接收訊息,透過 json 標準函式庫將訊息轉換成字典格式,解析各種訊息包含的屬性,理解訊息的內容後,開發 LINE BOT 才能更得心應手。
建議先閱讀:建立 LINE Channel
快速導覽:
將訊息轉換為 json 格式
將 LINE BOT 串連 Colab + ngrok 所建立 Webhook,回到 Colab 寫入下方的程式碼,使用 print 印出 json 格式的 body 資料。
from flask import Flask, request
from pyngrok import ngrok # 本機環境不需要
import json
app = Flask(__name__)
# 本機環境不需要下面這三行
port = "5000"
public_url = ngrok.connect(port).public_url
print(f" * ngrok tunnel \"{public_url}\" -> \"http://127.0.0.1:{port}\" ")
@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__":
app.run()
完成後,執行程式,將連動 ngrok 的 Webhook 填入 LINE Message API 裡,Verify 驗證通過後,從 LINE 傳送訊息,接著就能在 Colab 的顯示區裡,就能看見傳送的訊息變成一串 json 的格式,從 json 格式的回應訊息裡,可以看到許多屬性值,使用字典搭配串列的方式就能取出指定的內容。
{
"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 的必經之路。
延伸閱讀
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~