我想用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?
如果先前 WinInet 请求中已存在 cookie,则 WinInet 将自动发送它。但是,如果 WinInet 的 cookie 缓存中不存在 cookie(例如,如果您从其他来源获取了 cookie),则在调用
HttpAddRequestHeaders()
之前,您必须使用 Cookie:
提供您自己的 HttpSendRequest()
请求标头。
这是基于@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
标头。但你不能将两者混合搭配。