使用python-telegram-bot能否获取跨聊天回复的原消息详情?
问题解答
当用户使用Telegram的「在其他聊天中回复」功能,将群组消息的回复发送给机器人时,可以追踪到原消息的群组ID、用户ID、消息ID等详情,但你需要注意正确的字段获取方式和权限配置,以下是具体说明和解决方案:
核心原因:你可能忽略了权限或版本问题
你提到update.effective_message.reply_to_message返回None,大概率是以下原因之一:
- 机器人未开启「读取所有消息」权限
- 使用的python-telegram-bot版本过低,不支持该场景的消息结构解析
- 用户操作不符合「跨聊天回复」的标准流程
正确的实现步骤
1. 配置机器人权限
在BotFather中发送/setprivacy,选择你的机器人,然后设置为Disable,这样机器人可以接收所有类型的消息(包括跨聊天回复)。
2. 使用最新稳定版python-telegram-bot
确保你使用的是v13及以上版本(推荐最新稳定版),旧版本对跨聊天回复的消息结构支持不完善。可以通过pip更新:
pip install --upgrade python-telegram-bot
3. 正确获取原消息详情
当用户发送跨聊天回复时,原消息的所有信息会封装在update.effective_message.reply_to_message中,示例代码如下:
from telegram import Update from telegram.ext import Updater, MessageHandler, Filters, CallbackContext def track_cross_reply(update: Update, context: CallbackContext): current_msg = update.effective_message # 检查是否存在跨聊天回复的原消息 if current_msg.reply_to_message: original_msg = current_msg.reply_to_message # 提取原消息关键信息 original_chat_id = original_msg.chat.id original_user_id = original_msg.from_user.id original_message_id = original_msg.message_id # 输出或处理信息 print(f"原群组/超级群组ID: {original_chat_id}") print(f"原消息发送者ID: {original_user_id}") print(f"原消息在群组中的ID: {original_message_id}") else: print("未检测到跨聊天回复的原消息") def main(): # 替换为你的机器人Token updater = Updater("YOUR_BOT_TOKEN") dp = updater.dispatcher # 处理所有非命令消息 dp.add_handler(MessageHandler(Filters.all & ~Filters.command, track_cross_reply)) updater.start_polling() updater.idle() if __name__ == "__main__": main()
特殊情况说明
如果以上配置后仍然无法获取原消息信息,可能是以下限制导致:
- 原消息所在的超级群组开启了「隐藏成员」功能,导致无法获取原发送者ID
- 原消息已被删除,Telegram无法返回完整的原消息数据
- 用户实际操作是「转发消息」而非「跨聊天回复」,这种场景下需要使用
forward_origin字段,但转发和跨聊天回复是两种不同的操作
内容的提问来源于stack exchange,提问作者Obidjon Raimov
相关产品推荐
相关产品推荐

