目標:MFC 應用嵌入 WebBrowser 控件 (IE 內核) 登錄 QQ 網頁,獲取 Cookie 後注入 WinHTTP 請求實現後台自動化操作。
關鍵組件:
InternetGetCookieEx 讀取、InternetSetCookieEx 寫入系統 Cookie 存儲。
CString strCookie;
DWORD dwSize = 1024;
InternetGetCookieEx(_T("https://qzone.qq.com"), _T("pt_key;pt_pin"), strCookie.GetBuffer(dwSize), &dwSize, INTERNET_COOKIE_HTTPONLY, NULL);
strCookie.ReleaseBuffer();
INTERNET_COOKIE_HTTPONLY 讀取 HttpOnly Cookie (關鍵)。
HINTERNET hSession = WinHttpOpen(L"MFC App", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
HINTERNET hConnect = WinHttpConnect(hSession, L"qzone.qq.com", INTERNET_DEFAULT_HTTPS_PORT, 0);
HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", L"/proxy.html", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
// 關鍵:設置 Cookie Header
CStringA strCookieA(strCookie); // Unicode 轉 ANSI/UTF-8
WinHttpAddRequestHeaders(hRequest, L"Cookie: " + CString(strCookieA), -1, WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE);
// 發送請求...
WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, ...);
Set-Cookie 需解析並回寫 WinINet (InternetSetCookieEx),保持雙向同步。| 坑點 | 症狀 | 解決 |
|---|---|---|
| Cookie 域名/路徑不匹配 | GetCookie 返回空 | 精確傳入登錄頁域名 (如 .qq.com) 和路徑 / |
| HttpOnly Cookie 無法讀取 | 無 pt_key 等關鍵字段 | 必須加 INTERNET_COOKIE_HTTPONLY 標誌 (IE8+ 支持) |
| WinHTTP 不自動處理重定向/攜帶 Cookie | 請求丟失登錄態 | 手動設置 Cookie Header,或啟用 WINHTTP_OPTION_DISABLE_FEATURE 禁用自動重定向自行處理 |
| Unicode/ANSI 混用導致亂碼 | Cookie 值損壞 | 統一使用 UTF-8 (CStringA 轉換) 或寬字符版 API (WinHttpAddRequestHeaders 接受 LPCWSTR) |
MFC + WebBrowser + WinHTTP 屬於「經典組合」,核心難點在於 **WinINet (IE Cookie) 與 WinHTTP (獨立會話) 的 Cookie 手動橋接**。掌握 InternetGetCookieEx/SetCookieEx + WinHttpAddRequestHeaders 同步模式,即可實現穩健的網頁自動化登錄。