HRESULT CLoginDlg::GetCookie(CString& cookie) { DWORD size; InternetGetCookieEx(_T("http://tieba.baidu.com/"), _T("BDUSS"), NULL, &size, INTERNET_COOKIE_HTTPONLY, NULL); // size为字节数 BOOL result = InternetGetCookieEx(_T("http://tieba.baidu.com/"), _T("BDUSS"), cookie.GetBuffer(size), &size, INTERNET_COOKIE_HTTPONLY, NULL); // BUG:size在XP下单位是字节,在win10是字符数,XP下传字符数会返回缓冲不够 HRESULT hr = HRESULT_FROM_WIN32(GetLastError()); cookie.ReleaseBuffer(); if (result) { if (cookie.GetLength() < 100 || !StringIncludes(cookie, _T("BDUSS="))) return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); // 无效的Cookie cookie += _T(";"); return S_OK; // 成功 } return hr; }
// 使用IE Cookie void CLoginDlg::OnBnClickedButton3() { DWORD size = 1024 * 1024; BOOL result = InternetGetCookieEx(_T("http://tieba.baidu.com/"), NULL, m_cookie.GetBuffer(size), &size, INTERNET_COOKIE_HTTPONLY, NULL); m_cookie.ReleaseBuffer(); BOOL jump = TRUE; CheckResult: if (!result) { if (jump) goto Win10; AfxMessageBox(_T("获取Cookie失败!"), MB_ICONERROR); return; } if (!StringIncludes(m_cookie, _T("BDUSS="))) { if (jump) goto Win10; AfxMessageBox(_T("请先在IE浏览器登陆百度账号并选中下次自动登录!"), MB_ICONERROR); return; } GetLoginUserName(); if (m_userName == _T("")) { AfxMessageBox(_T("获取用户名失败!"), MB_ICONERROR); return; } AfxMessageBox(_T("登录完毕,不要在IE退出账号以免cookie失效,可以直接清除cookie"), MB_ICONINFORMATION); EndDialog(IDOK); return; Win10: size = 1024 * 1024; result = SUCCEEDED(IEGetProtectedModeCookie(L"http://tieba.baidu.com/", NULL, m_cookie.GetBuffer(size), &size, INTERNET_COOKIE_HTTPONLY)); jump = FALSE; goto CheckResult; }
static gboolean read_ie_login_cookie(const char *web_host, char **username_p, char **password_p) { WCHAR staticBuffer[1024]; WCHAR *allocBuffer = NULL; WCHAR *cookieBuffer = staticBuffer; DWORD cookieSize = sizeof(staticBuffer) / sizeof(staticBuffer[0]); char *cookie = NULL; HippoBSTR authUrl; *username_p = NULL; *password_p = NULL; makeAuthUrl(web_host, &authUrl); retry: *cookieBuffer = 0; if (!InternetGetCookieEx(authUrl, L"auth", cookieBuffer, &cookieSize, 0, NULL)) { HRESULT error = GetLastError(); if (error == ERROR_INSUFFICIENT_BUFFER) { cookieBuffer = allocBuffer = new WCHAR[cookieSize]; if (!cookieBuffer) goto out; goto retry; } else { hippoDebugLogW(L"Failed to get auth cookie %d", (int) error); cookieSize = 0; } } WCHAR *p = cookieBuffer; WCHAR *nextCookie = NULL; for (WCHAR *p = cookieBuffer; p < cookieBuffer + cookieSize; p = nextCookie + 1) { HippoBSTR host; HippoBSTR username; HippoBSTR password; nextCookie = wcschr(p, ';'); if (!nextCookie) nextCookie = cookieBuffer + cookieSize; while (*p == ' ' || *p == '\t') // Skip whitespace after ; p++; if (!startsWith(p, L"auth=")) continue; p += 5; // Skip 'auth=' HippoUStr cookieValue(p, (int) (nextCookie - p)); if (hippo_parse_login_cookie(cookieValue.c_str(), web_host, username_p, password_p)) { //hippoDebugLogU("using cookie '%s'", cookieValue.c_str()); break; } //hippoDebugLogU("skipping cookie '%s'", cookieValue.c_str()); } out: delete[] allocBuffer; return (*username_p && *password_p); }