首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 使用 Cookie 實現網頁自動登錄:InternetGetCookie/InternetSetCookie + WinHTTP 跨組件協作指南

     編輯:程式設計綜合問答

架構釐清

目標:MFC 應用嵌入 WebBrowser 控件 (IE 內核) 登錄 QQ 網頁,獲取 Cookie 後注入 WinHTTP 請求實現後台自動化操作。

關鍵組件:

  • WebBrowser 控件 (MSHTML): 渲染頁面、用戶交互登錄、Cookie 存儲於 IE Cookie 管理器 (WinINet)。
  • WinINet API: InternetGetCookieEx 讀取、InternetSetCookieEx 寫入系統 Cookie 存儲。
  • WinHTTP: 服務端級 HTTP 客戶端,**不自動共享 WinINet Cookie**,需手動同步。

正確流程:Cookie 同步橋接

  1. 登錄階段: 用戶在 WebBrowser 中完成登錄 (掃碼/賬密),Cookie 自動寫入 WinINet 存儲。
  2. 提取階段:
    
    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 (關鍵)。
  3. 注入 WinHTTP:
    
    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, ...);
    
  4. 持久化更新: 後續響應中的 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)

現代化替代建議

  • WebView2 (Edge Chromium 內核): 替代舊 WebBrowser,支持現代 Web 標準,Cookie 管理更規範 (ICoreWebView2CookieManager)。
  • C++ REST SDK (cpprestsdk) / libcurl: 替代 WinHTTP,跨平台、API 更友好、自動 Cookie Jar 支持。
  • Headless Chrome (Puppeteer/Playwright C++ 綁定): 完全繞過 GUI 自動化,直接腳本控制瀏覽器完成登錄與數據抓取。

MFC + WebBrowser + WinHTTP 屬於「經典組合」,核心難點在於 **WinINet (IE Cookie) 與 WinHTTP (獨立會話) 的 Cookie 手動橋接**。掌握 InternetGetCookieEx/SetCookieEx + WinHttpAddRequestHeaders 同步模式,即可實現穩健的網頁自動化登錄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved