用 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 後就可以任意的传送。
贴图列表可以参考这边


<<:  25 | 【进阶教学】什麽是 WordPress 区块小工具?

>>:  Day 24 - 用 canvas 画个时钟

DAY 15 『 Realm 新增、修改、删除 』Part3

昨天分享如何新增、修改、删除、印出 Realm 资料库的资料,以及读取 Realm 资料库的资料去更...

[Day 5]从零开始学习 JS 的连续-30 Days---比较与逻辑运算子

比较与逻辑运算子 比较运算子 用於判断比较运算子前後的结果回传逻辑值。 运算子如下 > 大於 ...

【把玩Azure DevOps】Day14 Extensions for Azure DevOps:Azure DevOps也能装外挂?

许多功能强大的系统或软件都会设计有能够安装额外的扩充套件或外挂的功能,藉此延伸软件的功能应用层面,A...

使用storyboard实现代理功能

缘由: 这应该也算是我没学好的项目之一,tableview也算是开发实务里很常见的元件,举凡要连续套...

Day 28 - Pwn 0x2

防护机制 为什麽会先说防御机制呢 因为在打 pwn 之前 要先对这些防御原理有基础才有办法知道你要怎...