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

如何用C++基于TgBot框架实现Telegram机器人发送文件

Telegram机器人文件上传404错误修复

我正在基于TgBot框架开发Telegram机器人,需要通过Telegram Bot API以multipart/form-data格式上传文件,框架自带CurlHttpClient类,无需单独调用CURL。参考命令行Curl的实现编写了代码,但运行返回404错误:

{"ok":false,"error_code":404,"description":"Not Found"}

原代码如下:

TgBot::CurlHttpClient curlClient;
std::stringstream sstream;
sstream << "https://api.telegram.org/bot" << botToken;
sstream << "sendDocument";

TgBot::Url url(sstream.str());

std::vector<TgBot::HttpReqArg> args;
args.emplace_back("chat_id", chatId);
std::string docString = "@";
docString += filename;
args.emplace_back("document", docString, true);
fileId = curlClient.makeRequest(url, args);

错误原因及修正方案

  1. URL格式错误
    Telegram Bot API的接口地址必须遵循https://api.telegram.org/bot<token>/<method>的格式,原代码中botToken和sendDocument之间缺少斜杠,导致请求地址无效,返回404。

  2. 文件参数传递错误
    命令行Curl用@filename指定文件,但TgBot的CurlHttpClient封装已自动处理文件上传逻辑:当HttpReqArg的第三个参数设为true时,框架会直接将参数值作为文件路径读取并以multipart/form-data格式发送,无需手动添加@符号。

修正后的代码

TgBot::CurlHttpClient curlClient;
std::stringstream sstream;
// 添加botToken与接口方法之间的斜杠
sstream << "https://api.telegram.org/bot" << botToken << "/sendDocument";

TgBot::Url url(sstream.str());

std::vector<TgBot::HttpReqArg> args;
args.emplace_back("chat_id", chatId);
// 直接传入文件名,第三个参数true标记为文件参数
args.emplace_back("document", filename, true);
std::string fileId = curlClient.makeRequest(url, args);

内容的提问来源于stack exchange,提问作者Mickaël C. Guimarães

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:10:36