You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+ZeroMQ实现Telegram消息处理器:多媒体附件处理问题

Telegram多媒体消息合并入ZeroMQ队列解决方案

问题背景

开发Telegram机器人抓取新闻组新消息,要求单条帖子(文本+多媒体)对应ZeroMQ队列中的一个元素,但默认events.NewMessage会将多媒体拆分为单独消息存入队列,尝试自定义相册处理器时触发AttributeError: 'Message' object has no attribute 'messages'错误。

错误原因

events.NewMessage事件仅处理单条消息,其event对象仅包含message属性;处理多媒体组(相册)需要使用Telethon专门的events.Album事件,该事件会将同组的所有媒体消息打包到event.messages属性中。

修正代码

from telethon import events

# 处理多媒体相册消息组
@tg_client.on(events.Album(chats=('tewst123')))
async def album_handler(event):
    # 取相册组第一条消息的基础信息(文本通常在此)
    main_msg = event.messages[0]
    text_content = main_msg.message
    media_paths = []

    for msg in event.messages:
        # 下载媒体文件到temp目录
        file_path = await tg_client.download_media(msg, 'temp')
        if file_path:
            media_paths.append(file_path)

    # 发送合并后的消息到ZeroMQ队列
    publisher.send_json({
        "message_id": main_msg.id,
        "chat_name": main_msg.chat.username,
        "text": text_content,
        "media_path": media_paths
    })

# 处理单条消息(纯文本或单媒体)
@tg_client.on(events.NewMessage(chats=('tewst123'), func=lambda e: not e.is_album))
async def single_msg_handler(event):
    msg = event.message
    text_content = msg.message
    media_paths = []

    if msg.media:
        file_path = await tg_client.download_media(msg.media, 'temp')
        media_paths.append(file_path)

    # 统一用数组格式返回媒体路径,方便消费者处理
    publisher.send_json({
        "message_id": msg.id,
        "chat_name": msg.chat.username,
        "text": text_content,
        "media_path": media_paths
    })

关键说明

  1. 事件区分:用events.Album处理多媒体组,events.NewMessage配合func=lambda e: not e.is_album处理单条消息,避免重复触发
  2. 文本提取:相册组的文本通常在第一条消息中,直接取event.messages[0].message即可
  3. 格式统一:将media_path统一为数组格式,无论单媒体还是多媒体,消费者端无需额外判断格式

内容的提问来源于stack exchange,提问作者sherwood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:57:05