【问题标题】:Sending Discord Webhook using Wininet使用 Wininet 发送 Discord Webhook
【发布时间】:2020-11-26 00:12:22
【问题描述】:

我正在尝试将 webhook 发送到以下网址:

https://discord.com/api/webhooks/781132765195747359/XDXDH08HsJ0GzkYFKvlDFO6QE3MtzKOqIaKpBruLmqLDJPvlLQEuQQNjr_R8x4y9zCjx

我的代码:

HINTERNET hIntSession = InternetOpenA((""), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);

if (!hIntSession)
{
    return request_data;
}

HINTERNET hHttpSession = InternetConnectA(hIntSession, ("discord.com"), 80, 0, 0, INTERNET_SERVICE_HTTP, 0, NULL);

if (!hHttpSession)
{
    return request_data;
}

HINTERNET hHttpRequest = HttpOpenRequestA(hHttpSession, ("POST"), url.c_str()
    , 0, 0, 0, INTERNET_FLAG_RELOAD, 0);

if (!hHttpSession)
{
    return request_data;
}

char* szHeaders = ("Content-Type: application/json\r\nUser-Agent: License");
char* szRequest = ("{ \"content\": \"test\" }");

if (!HttpSendRequest(hHttpRequest, NULL, 0, szRequest, strlen(szRequest)))
{
    return request_data;
}

CHAR szBuffer[1024] = { 0 };
DWORD dwRead = 0;

while (InternetReadFile(hHttpRequest, szBuffer, sizeof(szBuffer) - 1, &dwRead) && dwRead)
{
    request_data.append(szBuffer, dwRead);
}

InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hIntSession);

我还不能发布该请求,网址返回数据。

我正在尝试让它向我的不和谐频道发送一条消息。它不工作,我不知道为什么。

【问题讨论】:

  • 附带说明,如果发生错误,此代码会泄漏资源。您必须在每个 returns 之前关闭所有打开的句柄,而不仅仅是在最后。另外,您没有将szHeaders 传递给HttpSendRequest()
  • 我对我的答案进行了很多修改,但现在它处于可接受的状态。希望您没有使用我早期的编辑之一。如果是这样,只需抓住现在存在的那个。祝你好运。

标签: c discord wininet


【解决方案1】:

上面来自 Remy 的评论提到了缺少标题。这已与其他一些小错误一起修复。你可以对照你所拥有的进行检查。

LPCTSTR szUserAgent = _T("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43");
LPCTSTR szHost = _T("discordapp.com");
LPCTSTR szUrlPath = _T("/api/webhooks/740632765195747359/m8FGH08HsJ0GzkYFKvlDFO6QE3MtzKOqIaKpZH4LmqLDJPvlLQEuQQNjr_R8x4y9zCjx");
LPCTSTR szAcceptTypes[] = { _T("application/json"), NULL };

LPCTSTR szContentTypeHeader = _T("Content-Type: application/json");
LPCSTR szPostData = "{ \"username\":\"ANDY from StackOverflow\", \"content\": \"Test string again\" }";
const DWORD dwPostDataLength = strlen(szPostData);

HINTERNET hIntSession = InternetOpen(szUserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hIntSession) {
    HINTERNET hHttpSession = InternetConnect(hIntSession, szHost,
        INTERNET_DEFAULT_HTTPS_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, NULL);
    if (hHttpSession) {
        HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, _T("POST"), szUrlPath,
            NULL, NULL, szAcceptTypes,
            (INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE |
                INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_NO_CACHE_WRITE), 0);
        if (hHttpRequest) {
            if (HttpSendRequest(hHttpRequest,
                szContentTypeHeader, -1, (LPVOID)szPostData,
                dwPostDataLength)) {

                DWORD dwStatusCode = 0;
                {
                    TCHAR szStatusCode[32] = { 0 };
                    DWORD dwStatusCodeSize = sizeof(szStatusCode) / sizeof(TCHAR);
                    if (HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE,
                        szStatusCode, &dwStatusCodeSize, NULL)) {
                        dwStatusCode = _ttoi(szStatusCode);
                    }
                }

                //
                // dwStatusCode: [200,299] means success, any other value
                // means something went wrong
                //

                unsigned char* lpResponse = NULL;
                DWORD dwTotalSize = 0;
                {
                    unsigned char* lpBuffer = (unsigned char*)malloc(2048);
                    DWORD dwRead = 0;
                    while (InternetReadFile(hHttpRequest, lpBuffer, sizeof(lpBuffer), &dwRead) && dwRead) {
                        unsigned char* lpTmp = (unsigned char*)realloc(lpResponse, dwTotalSize + dwRead);
                        if (lpTmp) {
                            lpResponse = lpTmp;
                            memcpy(&lpResponse[dwTotalSize], lpBuffer, dwRead);
                            dwTotalSize += dwRead;
                        }
                        dwRead = 0;
                    }
                    free(lpBuffer);
                }

                //
                // lpResponse now has your data with length of dwTotalSize.
                // Do with it what you want.
                // Keep in mind that a successful request will return
                // no data.
                //

                if (lpResponse) { free(lpResponse); }
            }
            InternetCloseHandle(hHttpRequest);
        }
        InternetCloseHandle(hHttpSession);
    }
    InternetCloseHandle(hIntSession);
}

【讨论】:

  • 网址错误,实际上是discord.com/api/webhooks/740632765195747359/…,它没有发布消息。它不会发布 webhook
  • @FmalheirFmalheir -- 它似乎工作得很好。更新了我的答案。
  • @FmalheirFmalheir -- 根据文档,一切都是正确的:dev.to/oskarcodes/…
  • 我仍然没有让它工作不知道为什么,imgur.com/a/JifV8R8我看到了你的消息,但我的仍然不工作,复制你的代码到底是什么
  • @FmalheirFmalheir -- 废话。我想到了。您的网址中的主机错误。将www.discord.com 更改为discordapp.com。更新我的答案。
猜你喜欢
  • 2020-09-25
  • 2018-09-11
  • 2020-03-20
  • 2019-01-15
  • 2020-04-11
  • 2019-03-05
  • 2020-07-08
  • 2019-10-21
  • 2020-07-10
相关资源
最近更新 更多