如何解决Telethon抓取Telegram频道消息时无法获取互动表情的问题?
解决Telethon抓取Telegram互动表情(骰子等)的问题
你当前的代码仅读取了消息的message.text字段,但骰子、石头剪刀布这类互动表情并不属于普通文本内容——它们要么是服务消息(Service Message),要么以媒体对象(MessageMediaDice)的形式存在,因此无法通过message.text获取。
解决方案代码
先导入Telethon对应的类型来识别这类特殊消息,再在遍历消息时针对性处理:
from telethon import TelegramClient from telethon.tl.types import MessageService, MessageMediaDice, MessageActionDice with TelegramClient('session_name', api_id, api_hash) as client: for message in client.iter_messages(chat): # 处理带骰子媒体的普通消息(多数场景) if isinstance(message.media, MessageMediaDice): dice = message.media.dice print(f"{message.sender_id}: 互动表情 - {dice.emoji},结果: {dice.value}") # 处理骰子类服务消息(少数频道场景) elif isinstance(message, MessageService): if isinstance(message.action, MessageActionDice): dice = message.action.dice print(f"{message.sender_id}: 互动服务消息 - {dice.emoji},结果: {dice.value}") # 保留原有普通文本消息的处理逻辑 elif message.text: print(f"{message.sender_id}: {message.text}")
代码说明
MessageMediaDice:绝大多数互动表情会以媒体对象的形式附着在普通消息中,通过判断message.media的类型,可以直接获取骰子对应的emoji和随机结果值。MessageService+MessageActionDice:部分频道内的互动操作会以服务消息的形式发送,需要同时校验消息类型和动作类型才能捕获。- 保留了原有的文本消息处理逻辑,确保普通文本消息的抓取不受影响。
内容的提问来源于stack exchange,提问作者augustfu
相关产品推荐
相关产品推荐

