
在 telegram bot 开发中,`forward_from` 字段嵌套在 `message` 对象内,直接访问 `$update['forward_from']['id']` 会因路径错误返回 null;正确路径是 `$update['message']['forward_from']['id']`。
Telegram 的 Webhook 接收的更新(Update)对象是一个层级结构的 JSON 数据,其根节点并不直接包含 forward_from,而是通过 message(或 channel_post、edited_message 等子对象)间接承载消息内容。当你收到一条用户转发的消息时,forward_from 信息仅存在于 $update['message'] 下——前提是该消息确为普通聊天中的转发(非频道转发,且原始用户未启用“隐藏转发来源”隐私设置)。
✅ 正确用法示例:
$update = json_decode(file_get_contents('php://input'), TRUE);
// 安全检查:确保是消息更新,且存在 forward_from
if (isset($update['message']) && isset($update['message']['forward_from'])) {
$originalUserId = $update['message']['forward_from']['id'];
$originalFirstName = $update['message']['forward_from']['first_name'] ?? 'Unknown';
$originalUsername = $update['message']['forward_from']['username'] ?? null;
echo "原始发送者 ID: {$originalUserId}\n";
echo "姓名: {$originalFirstName}" . ($originalUsername ? " (@{$originalUsername})" : "");
} else {
echo "未检测到转发来源(可能为非转发消息、隐私限制或频道转发)";
}⚠️ 注意事项:
- forward_from 仅适用于私聊/群组中由用户手动转发的消息;频道转发(forward_from_chat)使用不同字段,且不暴露用户 ID;
- 即使用户关闭了“隐藏转发来源”,若其账号为新注册的 Telegram 账号(2018 年后创建),默认仍不向 bot 暴露 forward_from ——这是 Telegram 的强制隐私策略,无法绕过;
- 始终进行嵌套键存在性校验(如 isset()),避免 PHP Notice 错误;
- 若需识别转发行为但 forward_from 为空,可结合 forward_date 和 forward_from_chat 判断是否来自频道。
? 总结:路径错误是最常见的 forward_from 为 null 原因。牢记 Telegram Update 结构:$update → ['message'] → ['forward_from'] → ['id']。调试时建议先 var_dump($update) 查看完整结构,再精准取值。










