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 })
关键说明
- 事件区分:用
events.Album处理多媒体组,events.NewMessage配合func=lambda e: not e.is_album处理单条消息,避免重复触发 - 文本提取:相册组的文本通常在第一条消息中,直接取
event.messages[0].message即可 - 格式统一:将
media_path统一为数组格式,无论单媒体还是多媒体,消费者端无需额外判断格式
内容的提问来源于stack exchange,提问作者sherwood
相关产品推荐
相关产品推荐

