如何用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);
错误原因及修正方案
URL格式错误
Telegram Bot API的接口地址必须遵循https://api.telegram.org/bot<token>/<method>的格式,原代码中botToken和sendDocument之间缺少斜杠,导致请求地址无效,返回404。文件参数传递错误
命令行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
相关产品推荐
相关产品推荐

