在第一次的實作當中,我們學會了如何接收與傳送純文字的內容
但是實際上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 是 textevents.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 是 stickerevents.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 是 imageevents.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 是 videoevents.message.idevents.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 是 audioevents.message,idevents.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 是 locationevents.message.addressevents.message.latitudeevents.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