解析 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 的必经之路。
延伸阅读
微信扫码关注
抖音扫码关注