如何获取消息转发来源聊天及中间链路?fwd_from无返回值
解决Telegram消息转发来源及转发链获取问题
看起来你在尝试获取转发消息的来源聊天,甚至完整转发路径时遇到了fwd_from始终为空的问题,我来帮你梳理下解决方案:
为什么fwd_from为空?
首先要明确:fwd_from是Telegram Bot API的旧属性,现在已经被官方弃用了,取而代之的是更灵活的forward_origin字段。如果你还在使用旧版本的API库或者调用方式,自然拿不到值。
正确获取转发来源的方法
现在应该用forward_origin来获取转发信息,它会根据转发来源的类型返回不同的结构,比如用户、群聊、频道等。举个适配你Program_ListenUpdates示例的代码片段:
# 假设你用的是python-telegram-bot库 def handle_update(update, context): message = update.message if message.forward_origin: origin = message.forward_origin # 根据来源类型解析信息 if origin.type == "message_origin_user": print(f"这条消息转发自用户: {origin.user.first_name} (ID: {origin.user.id})") elif origin.type == "message_origin_chat": print(f"这条消息转发自群聊: {origin.chat.title} (ID: {origin.chat.id})") elif origin.type == "message_origin_channel": print(f"这条消息转发自频道: {origin.chat.title} (ID: {origin.chat.id}), 原消息ID: {origin.message_id}") elif origin.type == "message_origin_hidden_user": print(f"这条消息转发自隐藏用户: {origin.sender_name}") else: print("这条消息不是转发消息,或者转发信息无法获取")
关于获取完整转发链(中间经过的聊天)
这里要注意一个Telegram的机制限制:普通直接转发不会保留中间转发者的信息,只会记录最初的来源。只有当每一次转发都是以「回复转发」的形式进行(也就是转发时选择回复上一条转发消息),才能通过递归遍历reply_to_message字段来拼凑出完整的转发路径。
给你一个递归获取转发链的示例:
def build_forward_chain(message): forward_chain = [] current_msg = message while current_msg: # 记录当前消息的转发来源 if current_msg.forward_origin: origin = current_msg.forward_origin if origin.type == "message_origin_user": entry = f"用户 {origin.user.first_name} ({origin.user.id})" elif origin.type in ["message_origin_chat", "message_origin_channel"]: entry = f"{origin.type.split('_')[-1]} {origin.chat.title} ({origin.chat.id})" else: entry = f"隐藏来源: {origin.sender_name}" forward_chain.append(entry) # 进入下一层回复消息,检查是否有中间转发步骤 current_msg = current_msg.reply_to_message # 反转列表,得到从最初来源到当前消息的转发路径 return forward_chain[::-1] # 在更新处理函数中调用 def handle_update(update, context): message = update.message chain = build_forward_chain(message) if chain: print(f"完整转发路径: {' → '.join(chain)}") else: print("无有效转发来源或转发链")
额外提醒
- 确认消息是通过Telegram官方的「转发」功能发送的,复制粘贴的消息不会带有任何转发属性,自然拿不到来源信息。
- 确保你使用的Telegram Bot API库是最新版本,旧版本可能还没有实现
forward_origin字段。
内容的提问来源于stack exchange,提问作者X--X
相关产品推荐
相关产品推荐

