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

Telegram Bot调用sendDocument API发送文件重复两次问题求助

解决Telegram Bot API重复发送文件的问题

嘿,我帮你排查下这个重复发文件的问题——你的代码里有几个容易踩的坑,导致明明只执行一次却收到两份文件。我来拆解一下问题,再给你修正后的代码:

问题根源分析

  1. 手动设置Content-Type搞乱了请求格式:当你用CURLFile上传文件时,PHP的curl会自动生成正确的multipart/form-data请求头(包括自动生成的boundary分隔符)。你手动设置这个头会覆盖自动生成的内容,导致请求格式异常,Telegram服务器可能会错误解析两次请求,或者触发重试机制。
  2. 混合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:38:15