webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整
来源:互联网 发布:js div 左右滑动 编辑:程序博客网 时间:2024/06/06 07:10
在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后再通过webBrowser1.Document.Cookie获取其Cookie,再将其用到HttpWebRequest里用来访问自己需要的页。
一直用的都没有问题,但最近在对一个网站操作时总是不能获取完整Cookie,百思不得其解,使用Fiddler2对比发现,不能获取到的Cookie里最后有一个HttpOnly的标识,顺藤摸瓜发现原来webBrowser1.Document.Cookie里是取不到HttpOnly的Cookie的,也找到解决方法:
using System; using System.ComponentModel; using System.Net; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; internal sealed class NativeMethods { #region enums public enum ErrorFlags { ERROR_INSUFFICIENT_BUFFER = 122, ERROR_INVALID_PARAMETER = 87, ERROR_NO_MORE_ITEMS = 259 } public enum InternetFlags { INTERNET_COOKIE_HTTPONLY = 8192, //Requires IE 8 or higher INTERNET_COOKIE_THIRD_PARTY = 131072, INTERNET_FLAG_RESTRICTED_ZONE = 16 } #endregion #region DLL Imports [SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)] internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved); #endregion } /// <SUMMARY></SUMMARY> /// 取得WebBrowser的完整Cookie。 /// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie /// public class FullWebBrowserCookie { [SecurityCritical] public static string GetCookieInternal(Uri uri, bool throwIfNoCookie) { uint pchCookieData = 0; string url = UriToString(uri); uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY; //Gets the size of the string builder if (NativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero)) { pchCookieData++; StringBuilder cookieData = new StringBuilder((int)pchCookieData); //Read the cookie if (NativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero)) { DemandWebPermission(uri); return cookieData.ToString(); } } int lastErrorCode = Marshal.GetLastWin32Error(); if (throwIfNoCookie || (lastErrorCode != (int)NativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS)) { throw new Win32Exception(lastErrorCode); } return null; } private static void DemandWebPermission(Uri uri) { string uriString = UriToString(uri); if (uri.IsFile) { string localPath = uri.LocalPath; new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand(); } else { new WebPermission(NetworkAccess.Connect, uriString).Demand(); } } private static string UriToString(Uri uri) { if (uri == null) { throw new ArgumentNullException("uri"); } UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString); return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), 2083).ToString(); } }
可能有用的资料:
Retrieve HttpOnly Session Cookie in WebBrowser
C#下利用WebBrowser完整获取COOKIE
- webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整
- Document.Cookie 取Cookies不完整 API取设Cookies
- php 取不到cookie值
- cookie的httponly属性
- COOKIE的HttpOnly属性
- cookie httponly
- 服务端写入cookie客户端取不到的解决办法
- 为什么用JS取不到cookie的值?解决方法如下!
- Document.Cookie 取得的Cookies不完整問題
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie .
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie
- asp.net,cookie,写cookie,取cookie
- javascript正则表达式的贪婪模式与非贪婪模式对比
- 介绍一个小工具 Linqer
- 关于URLEncoder的编码和URLDecode解码
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- 正式成为ABAPer
- webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整
- 简明 Python 教程
- 'nasmw' 不是内部或外部命令,也不是可运行的程序
- Android 模拟器中修改host文件无效的解决办法
- 磁盘空间不足(一)
- 在C#中使用代理的方式触发事件 (委托和事件 )
- linux常用命令-rm和rmdir
- ASIHTTPRequest清除keyChain方法
- 错误整理