使用C++ libcurl调用Discord Webhook发送消息无报错但无消息
问题排查与修复方案
核心问题:POST数据格式不符合Discord Webhook要求
Discord的Webhook接口要求发送JSON格式的请求体,必须包含content字段承载消息内容。你的代码直接把原始字符串作为POST数据发送,未包装成合法JSON结构,导致Discord无法解析请求,因此不会推送消息。
具体修复步骤
1. 包装消息为合法JSON字符串
需要将消息内容包裹在{"content": "..."}结构中,同时转义字符串里的特殊字符(双引号、反斜杠、换行符等),避免JSON格式错误。
修改调用代码:
// 转义消息中的特殊字符 std::string escapedMsg = message; // 转义双引号 size_t pos = 0; while ((pos = escapedMsg.find("\"", pos)) != std::string::npos) { escapedMsg.replace(pos, 1, "\\\""); pos += 2; } // 转义换行符 pos = 0; while ((pos = escapedMsg.find("\n", pos)) != std::string::npos) { escapedMsg.replace(pos, 1, "\\n"); pos += 2; } // 包装成标准JSON结构 std::string jsonPayload = "{\"content\": \"" + escapedMsg + "\"}"; func::sendDiscordWebhook(config::Bot_url, jsonPayload);
2. 增强错误排查:获取HTTP响应码
即使curl_easy_perform返回CURLE_OK,也不代表Discord接受了请求。建议添加代码获取HTTP响应状态码,精准定位问题:
// 在curl_easy_perform执行后添加以下代码 long http_code = 0; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); if (http_code != 204) { // Discord成功接收请求的响应码为204 No Content fprintf(stderr, "Discord API响应码: %ld\n", http_code); // 可选:获取响应内容进一步排查 std::string response; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](char* ptr, size_t size, size_t nmemb, std::string* data) { data->append(ptr, size * nmemb); return size * nmemb; }); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); res = curl_easy_perform(curl); fprintf(stderr, "响应内容: %s\n", response.c_str()); }
3. 检查其他潜在问题
- 确认
config::Bot_url是正确的Discord Webhook URL,格式应为https://discord.com/api/webhooks/[ID]/[TOKEN] - 确保消息内容未超过Discord单条消息2000字符的限制
- 排查是否有防火墙/代理拦截了curl的网络请求,导致无法连接Discord服务器
内容的提问来源于stack exchange,提问作者Nick Vinesmoke
相关产品推荐
相关产品推荐

