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
相关产品推荐
相关产品推荐

