在第一次的實作當中,我們學會了如何接收與傳送純文字的內容
但是實際上LINE還有很多豐富的訊息類型
在這一篇我們就來看看有哪些有趣的訊息種類吧!
今天會講到關於接收訊息的部分
關於LINE的訊息種類可以參考 https://developers.line.biz/zh-hant/docs/messaging-api/message-types/
在開始之前,先稍微介紹一下甚麼是JSON吧~
JSON, JavaScript Object Notation 是一種輕量級的資料交換語言
有非常高的可閱讀性以及方便的存取方式
在檔案不會大到需要用資料庫儲存,而且也不會有太大的安全問題的前提下(?,推薦用JSON儲存資料喔!
在LINE傳送以及接收訊息,都是以JSON格式進行傳送
這樣一來當我們在python中要存取元素的時候
我們只需要用.
來連接各層就可以了!
舉例而言,如果今天有個JSON格式的訊息為:
{
"Mike":{
"age" : 12,
"sex" : "Male"
},
"Jane":{
"age" : 13,
"sex" : "Female"
}
}
當我們要讀取 Mike
的 age
,就可以使用 Mike.age
查詢
同樣地,要存取 Jane
的 sex
,就可以使用 Jane.sex
查詢
接下來要帶大家來看看幾種訊息類型
另外幾種訊息類型是沒辦法透過使用者傳送的,所以就到下一篇再來說明囉~
大家也可以嘗試傳送各種訊息給LINE BOT
記得改用ngrok本機測試,這樣才能看到Body的部分
在模板的第21行有將Body輸出出來,可以透過這個來一起玩玩看w
以下的內容會將部分敏感訊息移除
如果看到只剩下空字串(""
)就表示被我刪掉了w
不過重點是在訊息架構所以這部份不會影響的
Text Message接收到的格式如下
特別注意到
events.message.type
是 text
events.message.text
{
"events": [
{
"type": "message",
"replyToken": "",
"source": {
"userId": "",
"type": "user"
},
"timestamp": 1600521868019,
"mode": "active",
"message": {
"type": "text",
"id": "12707972946547",
"text": "文字訊息"
}
}
],
"destination": ""
}
Sticker Message接收到的格式如下
特別注意到
events.message.type
是 sticker
events.message.stickerId
以及 events.message.packageId
{
"events": [
{
"type": "message",
"replyToken": "",
"source": {
"userId": "",
"type": "user"
},
"timestamp": 1600521886337,
"mode": "active",
"message": {
"type": "sticker",
"id": "12707974503377",
"stickerId": "13",
"packageId": "1",
"stickerResourceType": "STATIC"
}
}
],
"destination": ""
}
接下來三個訊息種類在接收上不會像前面那麼方便
我們只會拿到訊息的ID,還需要透過其他方式下載
詳細可以看 https://developers.line.biz/en/reference/messaging-api/#get-content
這邊提供python的下載方式
from linebot import LineBotApi
line_bot_api = LineBotApi('<channel access token>')
message_content = line_bot_api.get_message_content('<message_id>')
with open(file_path, 'wb') as fd:
for chunk in message_content.iter_content():
fd.write(chunk)
Image Message接收到的格式如下
特別注意到
events.message.type
是 image
events.message.id
{
"events": [
{
"type": "message",
"replyToken": "",
"source": {
"userId": "",
"type": "user"
},
"timestamp": 1600522073302,
"mode": "active",
"message": {
"type": "image",
"id": "12707990344203",
"contentProvider": {
"type": "line"
}
}
}
],
"destination": ""
}
Video Message接收到的訊息格式如下
特別注意到
events.message.type
是 video
events.message.id
events.message.duration
{
"events": [
{
"type": "message",
"replyToken": "",
"source": {
"userId": "",
"type": "user"
},
"timestamp": 1600523664567,
"mode": "active",
"message": {
"type": "video",
"id": "12708124380545",
"contentProvider": {
"type": "line"
},
"duration": 63708
}
}
],
"destination": ""
}
Audio Message 接收訊息格式如下
特別注意到
events.message.type
是 audio
events.message,id
events.message.duration
{
"events": [
{
"type": "message",
"replyToken": "",
"source": {
"userId": "",
"type": "user"
},
"timestamp": 1600523832985,
"mode": "active",
"message": {
"type": "audio",
"id": "12708138333270",
"contentProvider": {
"type": "line"
},
"duration": 243408
}
}
],
"destination": ""
}
Location Message 接收訊息格式如下
特別注意到
events.message.type
是 location
events.message.address
events.message.latitude
events.message.longitude
{
"events": [
{
"type": "message",
"replyToken": "",
"source": {
"userId": "",
"type": "user"
},
"timestamp": 1600523968075,
"mode": "active",
"message": {
"type": "location",
"id": "12708149486582",
"address": "100台灣台北市中正區中山南路21號",
"latitude": 25.034524,
"longitude": 121.521812
}
}
],
"destination": ""
}
因為鐵人賽重新回來看各種訊息的接收方式
才發現到蠻多有趣的地方
像是關於 Image
Video
Audio
的接收方式
我們只能拿到ID,必須得透過套件來下載內容
不過遇到最大的問題是不知道檔案的副檔名是什麼
自己在測試可以很清楚知道應該要給檔案甚麼副檔名
但是還沒找到最好的方法,讓我們能決定下載的副檔名
據說可以用vb.net處理
參考資料
之後有機會再來研究看看w
原本這篇是打算要把接收跟傳送都講完
結果才發現內容已經太多了XDD
那就下一篇再來介紹傳送吧~
各位看到這邊,實際上已經可以做出 半全方位.鸚鵡式機器人
之所以說是半全方位,是因為到這邊我們只學會接收,但是傳送還是只會純文字XD
總之,記得要嘗試玩玩看喔,唯有自己操作過,才會真正體驗到開發的樂趣w