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

如何获取消息转发来源聊天及中间链路?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:35:27