iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
1

在第一次的實作當中,我們學會了如何接收與傳送純文字的內容
但是實際上LINE還有很多豐富的訊息類型
在這一篇我們就來看看有哪些有趣的訊息種類吧!
今天會講到關於接收訊息的部分
關於LINE的訊息種類可以參考 https://developers.line.biz/zh-hant/docs/messaging-api/message-types/

JSON

在開始之前,先稍微介紹一下甚麼是JSON吧~
JSON, JavaScript Object Notation 是一種輕量級的資料交換語言
有非常高的可閱讀性以及方便的存取方式
在檔案不會大到需要用資料庫儲存,而且也不會有太大的安全問題的前提下(?,推薦用JSON儲存資料喔!

在LINE傳送以及接收訊息,都是以JSON格式進行傳送
這樣一來當我們在python中要存取元素的時候
我們只需要用.來連接各層就可以了!

舉例而言,如果今天有個JSON格式的訊息為:

{
    "Mike":{
        "age" : 12,
        "sex" : "Male"
    },
    "Jane":{
        "age" : 13,
        "sex" : "Female"
    }
}

當我們要讀取 Mikeage ,就可以使用 Mike.age 查詢
同樣地,要存取 Janesex ,就可以使用 Jane.sex 查詢


接下來要帶大家來看看幾種訊息類型

  • Text Message
  • Sticker Message
  • Image Message
  • Video Message
  • Audio Message
  • Location Message

另外幾種訊息類型是沒辦法透過使用者傳送的,所以就到下一篇再來說明囉~

大家也可以嘗試傳送各種訊息給LINE BOT
記得改用ngrok本機測試,這樣才能看到Body的部分
在模板的第21行有將Body輸出出來,可以透過這個來一起玩玩看w

以下的內容會將部分敏感訊息移除
如果看到只剩下空字串("")就表示被我刪掉了w
不過重點是在訊息架構所以這部份不會影響的

純文字訊息(Text)

Text Message接收到的格式如下
特別注意到

  • events.message.typetext
    表示接收到的是純文字訊息
  • events.message.text
    這裡會記錄接收到的訊息內容
{
    "events": [
        {
            "type": "message",
            "replyToken": "",
            "source": {
                "userId": "",
                "type": "user"
            },
            "timestamp": 1600521868019,
            "mode": "active",
            "message": {
                "type": "text",
                "id": "12707972946547",
                "text": "文字訊息"
            }
        }
    ],
    "destination": ""
}

貼圖訊息(Sticker)

Sticker Message接收到的格式如下
特別注意到

  • events.message.typesticker
    表示接收到的是貼圖訊息
  • events.message.stickerId 以及 events.message.packageId
    這兩項代表了使用者傳送的貼圖
    可以參考 https://devdocs.line.me/files/sticker_list.pdf
    每個貼圖都會有相對應的package以及Id
{
    "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)

Image Message接收到的格式如下
特別注意到

  • events.message.typeimage
    表示接收到的是圖片訊息
  • events.message.id
    我們可以透過這個ID下載到使用者傳送的檔案
{
    "events": [
        {
            "type": "message",
            "replyToken": "",
            "source": {
                "userId": "",
                "type": "user"
            },
            "timestamp": 1600522073302,
            "mode": "active",
            "message": {
                "type": "image",
                "id": "12707990344203",
                "contentProvider": {
                    "type": "line"
                }
            }
        }
    ],
    "destination": ""
}

影片訊息(Video)

Video Message接收到的訊息格式如下
特別注意到

  • events.message.typevideo
    表示接收到的是影片訊息
  • events.message.id
    我們可以透過這個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)

Audio Message 接收訊息格式如下
特別注意到

  • events.message.typeaudio
    表示接收到的是音訊訊息
  • events.message,id
    我們可以透過這個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)

Location Message 接收訊息格式如下
特別注意到

  • events.message.typelocation
    表示接收到的是位置訊息
  • 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


上一篇
Day04 部署到Heroku
下一篇
Day06 基本訊息傳送
系列文
LINE BOT 新手村30日攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
diegowu
iT邦新手 5 級 ‧ 2022-02-07 16:30:01

請問要怎麼改成以ngrok本機測試 謝謝

Koios iT邦新手 4 級 ‧ 2022-06-15 16:58:28 檢舉
0
老漢
iT邦新手 5 級 ‧ 2022-11-11 12:52:51

感謝分享

請問有辦法做到 監控特定聊天群組,當有特定關鍵字出現時,發起 alert
這靠官方的 API 能做到嗎?

我要留言

立即登入留言