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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:13:17