Telegram Bot调用sendDocument API发送文件重复两次问题求助
解决Telegram Bot API重复发送文件的问题
嘿,我帮你排查下这个重复发文件的问题——你的代码里有几个容易踩的坑,导致明明只执行一次却收到两份文件。我来拆解一下问题,再给你修正后的代码:
问题根源分析
- 手动设置
Content-Type搞乱了请求格式:当你用CURLFile上传文件时,PHP的curl会自动生成正确的multipart/form-data请求头(包括自动生成的boundary分隔符)。你手动设置这个头会覆盖自动生成的内容,导致请求格式异常,Telegram服务器可能会错误解析两次请求,或者触发重试机制。 - 混合GET/POST参数的潜在风险:你把
chat_id和caption放在URL的GET参数里,同时POST上传文件,这种混合方式可能让服务器对请求的处理出现歧义。
修正后的代码
$token = "<Token>"; $chatId = "<chatId>"; $url = "https://api.telegram.org/bot{$token}/sendDocument"; // 初始化文件对象 $document = new CURLFile('test.txt'); // 统一把所有参数放到POST字段里 $postFields = [ 'chat_id' => $chatId, 'caption' => 'Your file', 'document' => $document ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); // 重点:移除手动设置的Content-Type,让curl自动处理 // curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 禁用自动重试,防止网络波动时重复发送 curl_setopt($ch, CURLOPT_MAXREDIRS, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $out = curl_exec($ch); $err = curl_error($ch); // 增加错误处理,方便排查问题 if ($err) { echo "CURL请求出错: " . $err; } else { $response = json_decode($out, true); if (!$response['ok']) { echo "Telegram API报错: " . $response['description']; } else { echo "文件发送成功"; } } curl_close($ch); exit;
额外排查建议
如果改完代码还是有问题,你可以做这些检查:
- 查看服务器的访问日志,确认这段代码是不是真的只被执行了一次(比如有没有重复的请求触发)
- 如果是用webhook接收更新的场景,Telegram会在没收到响应时自动重试,确保你的脚本能快速返回200状态码,避免被重复回调
- 打印Telegram API的返回结果,确认是不是一次请求就返回了成功,排除服务器端的重复处理
内容的提问来源于stack exchange,提问作者user16176768
相关产品推荐
相关产品推荐

