iT邦幫忙

1

用 Python 暢玩 Line bot - 05:MessageEvent

除了文字訊息以外, Line 還有很多種訊息型態可以傳送,例如圖片,音檔,貼圖......。
我們可以用上次的程式碼,做一點修改,來讓我們可以看看不同的訊息型態會分別傳來怎樣的資訊。

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

上次的程式碼在接收到 MessageEvent 的時候,限制了只有接收到文字訊息才會繼續執行後續的函式,而我們這次想要看看其他種類的訊息,所以可以先將 message=TextMessage給刪除,並將回復訊息的部分刪掉,增加print(event)來查看接收的資訊。

@handler.add(MessageEvent)
def handle_message(event):
    print(event)

再來我們就可以嘗試看看傳送各種類型的訊息了。

  1. Image
{
"message": 
    {
    "contentProvider": 
        {
        "type": "line"
        }, 
    "id": "14885593584822",
    "type": "image"
    }, 
  "mode": "active", 
  "replyToken": "cc8568ac32484efa8a0d44e6d64a1f43", 
  "source": 
      {
      "type": "user", 
      "userId": "Ub8c776653b3d290b3c3f9d1b9c852cb9"
      },
  "timestamp": 1633783269252, 
  "type": "message"
}

可以看到跟 text message 相比,他多了一個 contentProvider 並且少了 text 的內容,這是因為他不是直接將整張圖片傳送給你,而是透過給你一組 id 去找到對應的圖片。如果我們想要取得這張圖片的資訊,可以使line_bot_api.get_message_content(event.message.id),此部分的應用會在後續再做介紹。

  1. audio
{
"message": 
    {
    "contentProvider": 
        {
        "type": "line"
        }, 
    "duration": 1617, 
    "id": "14885654988537", 
    "type": "audio"
    }, 
"mode": "active", 
"replyToken": "7de6eb26c06041da9911d4bb186e4841", 
"source": 
    {
    "type": "user", 
    "userId": "Ub8c776653b3d290b3c3f9d1b9c852cb9"
    }, 
"timestamp": 1633784023730, 
"type": "message"
}

跟 image message 相比,audio message 又多了一個 duration,代表該音訊的時間長度(ms),而 Line 傳送時所使用的副檔名是 m4a

  1. video
{
"message": 
    {
    "contentProvider": 
        {
        "type": "line"
        }, 
    "duration": 3247, 
    "id": "14885666798843", 
    "type": "video"
    },
"mode": "active", 
"replyToken": "7de6eb26c06041da9911d4bb186e4841", 
"source": 
 {
 "type": "user", 
 "userId": "Ub8c776653b3d290b3c3f9d1b9c852cb9"
 }, 
"timestamp": 1633784023730, 
"type": "message"
}

video message 接收到的資訊格式是跟 audio message 格式一致的

  1. file
{
"message": 
    {
    "fileName": "\u795e\u8e5f(1~5\u5377).docx", 
    "fileSize": 979763, 
    "id": "14885677207783", 
    "type": "file"
    }, 
"mode": "active", 
"replyToken": "7de6eb26c06041da9911d4bb186e4841", 
"source": 
 {
 "type": "user", 
 "userId": "Ub8c776653b3d290b3c3f9d1b9c852cb9"
 }, 
"timestamp": 1633784023730, 
"type": "message"
}

file message 比較特別的是,他是從 keep 上選取文件檔或是音檔所寄出的格式,你無法直接從電腦中拉一個 docx 檔案到 line bot 去寄送,或是從傳送檔案的選項去找到 docx 檔案去寄送,會發現找不到。不過這點確切原因是為什麼暫時還不確定。
而他會給出的資訊是檔案名稱、大小以及對應的 id。

  1. location
{
"message": 
    {
    "address": "你所分享的地址", 
    "id": "14885779817072", 
    "latitude": 24.985464, 
    "longitude": 121.427829, 
    "type": "location"
    }, 
"mode": "active", 
"replyToken": "7de6eb26c06041da9911d4bb186e4841", 
"source": 
 {
 "type": "user", 
 "userId": "Ub8c776653b3d290b3c3f9d1b9c852cb9"
 }, 
"timestamp": 1633784023730, 
"type": "message"
}

location message 可以取得使用者所傳送的地址、經緯度資訊。

  1. sticker
{
"message": 
    {
    "id": "14885788780170",
    "keywords": ["Affirmative", "OK"],
    "packageId": "1021884",
    "stickerId": "949915",
    "stickerResourceType": "STATIC",
    "type": "sticker"
    },
"mode": "active", 
"replyToken": "7de6eb26c06041da9911d4bb186e4841", 
"source": 
 {
 "type": "user", 
 "userId": "Ub8c776653b3d290b3c3f9d1b9c852cb9"
 }, 
"timestamp": 1633784023730, 
"type": "message"
}

sticker message 可以取得該貼圖的各項 id、推薦貼圖的關鍵字,貼圖的類型(STATIC、POPUP_SOUND、ANIMATION、PER_STICKER_TEXT......)
如果要做貼圖的回傳,要注意的是只能夠傳送默認有的貼圖,而不是有了 ID 後就可以任意的傳送。
貼圖列表可以參考這邊


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言