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

Telegram机器人处理chat_join_request时发送消息报403错误求助

Telegram机器人处理chat_join_request时发送消息报403错误的解决方法

问题概述

处理chat_join_request更新时,机器人能正常调用approveChatJoinRequest通过用户入群申请,但调用sendMessage给用户发送消息时返回错误:

403 Forbidden: bot can't initiate conversation with a user

根据Telegram 2021年12月7日的API更新规则,机器人在收到chat_join_request事件后,应当具备主动给用户发送消息的权限。已尝试替换chat_id为$update->user_chat_id、查阅官方文档、在BotTalk群提问,但未解决问题。

可能的原因及解决方案

1. 调整调用顺序

部分场景下,Telegram的权限校验会优先检查用户是否已成功加入群组。建议先通过入群申请,再发送消息,调整后的代码示例:

if ($update->isType('chat_join_request')) {    
    // 先执行入群申请通过操作
    $bot->post('approveChatJoinRequest', [
        'chat_id' => $update->chatJoinRequest->chat->id,
        'user_id' => $update->chatJoinRequest->from->id
    ]);

    // 再给用户发送消息
    $messageData = [
        'chat_id' => $update->chatJoinRequest->from->id,
        'text' => $post->post
    ];
    $bot->sendMessage($messageData);
}

2. 验证chat_id的有效性

确保chat_id取值为申请入群的用户数字ID,而非群组ID或其他无效ID。可以临时在代码中打印$update->chatJoinRequest->from->id的值,确认其为纯数字格式的有效用户ID。

3. 绕过Bot库封装直接调用API

如果使用第三方PHP Bot库,可能存在参数封装逻辑问题。尝试直接调用Telegram原生API发送消息,验证是否能正常执行:

// 替换为你的机器人Token
$botToken = "你的机器人Token";
$apiEndpoint = "https://api.telegram.org/bot{$botToken}/sendMessage";

$requestData = [
    'chat_id' => $update->chatJoinRequest->from->id,
    'text' => $post->post
];

// 使用curl或HTTP客户端发送POST请求到上述端点
$ch = curl_init($apiEndpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

如果直接调用API成功,则说明是所用Bot库的问题,需检查库的文档或更新版本。

4. 排除用户侧限制

确认申请入群的用户未拉黑机器人,尽管规则允许chat_join_request事件触发后绕过用户隐私限制,但部分极端场景下仍可能存在拦截。

内容的提问来源于stack exchange,提问作者Nikita Natoloka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:02:44