C++ wininet,连接weblogin,如何设置cookie?

问题描述 投票:0回答:2

嘿,我想用 wininet 登录我的作品网页,这是我当前的代码:

int main()
{
    HINTERNET hInet = InternetOpenA("UserAgent/1.0", INTERNET_OPEN_TYPE_PRECONFIG,0, 0, 0 );
    if(!hInet)
    {
        printf("hInet Failed!\n");
        return -1;
    }

    HINTERNET hConnection = InternetConnectA( hInet,"app.tamigo.com",INTERNET_DEFAULT_HTTPS_PORT,"","", INTERNET_SERVICE_HTTP,0,0);
    if (!hConnection)
    {
        InternetCloseHandle(hInet);
        printf("InternetConnectA failed!\n");
        return -1;
    }

    HINTERNET hRequest = HttpOpenRequestA( hConnection, "Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",NULL,"https://app.tamigo.com/Home/Pages/Login.aspx", NULL, INTERNET_FLAG_KEEP_CONNECTION, 0 );
    if (!hRequest)
    {
        printf("BuildRequestHeader failed %d!\n",GetLastError());
        InternetCloseHandle(hConnection);
        InternetCloseHandle(hInet);
        return -1;
    }

    HttpSendRequestA(hRequest, NULL, 0, NULL, 0);

    DWORD dwInfoLevel = HTTP_QUERY_RAW_HEADERS_CRLF;
    DWORD dwInfoBufferLength = 10;
    BYTE *pInfoBuffer = (BYTE *)malloc(dwInfoBufferLength+1);
    while (!HttpQueryInfo(hRequest, dwInfoLevel, pInfoBuffer, &dwInfoBufferLength, NULL))
    {
        DWORD dwError = GetLastError();
        if (dwError == ERROR_INSUFFICIENT_BUFFER)
        {
            free(pInfoBuffer);
            pInfoBuffer = (BYTE *)malloc(dwInfoBufferLength+1);
        }
        else
        {
            fprintf(stderr, "HttpQueryInfo failed, error = %d (0x%x)\n",
            GetLastError(), GetLastError());
            break;
        }
    }
    pInfoBuffer[dwInfoBufferLength] = '\0';
    printf("%s", pInfoBuffer);
    free(pInfoBuffer);

    cin.get();
    return 1;
}

如果这段代码是正确的,我必须使用我的用户名登录并通过,我使用“Firefox 插件篡改数据”获得了一个 cookie。我怎样才能用wininet设置这个cookie?

非常感谢您的阅读和您的时间

c++ html connect wininet
2个回答
1
投票

如果先前 WinInet 请求中已存在 cookie,则 WinInet 将自动发送它。但是,如果 WinInet 的 cookie 缓存中不存在 cookie(例如,如果您从其他来源获取了 cookie),则在调用

HttpAddRequestHeaders()
之前,您必须使用
Cookie:
提供您自己的
HttpSendRequest()
请求标头。


0
投票

这是基于@vishalb(我认为错误)删除的答案。重新发布更详细的信息,因为这是正确的答案!

如果使用默认 cookie 行为,您无法手动设置 cookie。使用默认行为,您可以将

Cookie
标头传递到
lpzHeaders
中的
SendRequest()
或调用
HttpAddRequestHeaders()
,但手动
Cookie
标头将被忽略,因为默认情况下启用自动 cookie 处理。自动 cookie 处理使用 cookie 缓存来捕获系统和先前捕获的会话 cookie,并将它们提供给当前请求。 AFAIK 没有办法混合自动 cookie 手工线 添加手动 cookie。

您可以通过设置

INTERNET_FLAG_NO_COOKIES
标志来关闭自动 cookie 处理。如果应用,您可以手动设置自己的
Cookie
标头,但此时不会使用缓存的 cookie,并且不会捕获任何新的 cookie 集以供后续请求使用。

IOW,您可以选择自动 Cookie 处理,从系统和您之前的请求中获取 Cookie,并以与浏览器相同的方式将它们转发,手动显式设置 Cookie

 标头。但你不能将两者混合搭配。 

© www.soinside.com 2019 - 2024. All rights reserved.