在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后再通过webBrowser1.Document.Cookie获取其Cookie,再将其用到HttpWebRequest里用来访问自己需要的页。

一直用的都没有问题,但最近在对一个网站操作时总是不能获取完整Cookie,百思不得其解,使用Fiddler2对比发现,不能获取到的Cookie里最后有一个HttpOnly的标识,顺藤摸瓜发现原来webBrowser1.Document.Cookie里是取不到HttpOnly的Cookie的,也找到解决方法:

  1. using System;
  2. using System.ComponentModel;
  3. using System.Net;
  4. using System.Runtime.InteropServices;
  5. using System.Security;
  6. using System.Security.Permissions;
  7. using System.Text;
  8.  
  9. internal sealed class NativeMethods
  10. {
  11. #region enums
  12.  
  13. public enum ErrorFlags
  14. {
  15. ERROR_INSUFFICIENT_BUFFER = ,
  16. ERROR_INVALID_PARAMETER = ,
  17. ERROR_NO_MORE_ITEMS =
  18. }
  19.  
  20. public enum InternetFlags
  21. {
  22. INTERNET_COOKIE_HTTPONLY = , //Requires IE 8 or higher
  23. INTERNET_COOKIE_THIRD_PARTY = ,
  24. INTERNET_FLAG_RESTRICTED_ZONE =
  25. }
  26.  
  27. #endregion
  28.  
  29. #region DLL Imports
  30.  
  31. [SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport("wininet.dll", EntryPoint = "InternetGetCookieExW", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
  32. internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved);
  33.  
  34. #endregion
  35. }
  36.  
  37. /// <SUMMARY></SUMMARY>
  38. /// 取得WebBrowser的完整Cookie。
  39. /// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie
  40. ///
  41. public class FullWebBrowserCookie
  42. {
  43.  
  44. [SecurityCritical]
  45. public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)
  46. {
  47. uint pchCookieData = ;
  48. string url = UriToString(uri);
  49. uint flag = (uint)NativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;
  50.  
  51. //Gets the size of the string builder
  52. if (NativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))
  53. {
  54. pchCookieData++;
  55. StringBuilder cookieData = new StringBuilder((int)pchCookieData);
  56.  
  57. //Read the cookie
  58. if (NativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))
  59. {
  60. DemandWebPermission(uri);
  61. return cookieData.ToString();
  62. }
  63. }
  64.  
  65. int lastErrorCode = Marshal.GetLastWin32Error();
  66.  
  67. if (throwIfNoCookie || (lastErrorCode != (int)NativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS))
  68. {
  69. throw new Win32Exception(lastErrorCode);
  70. }
  71.  
  72. return null;
  73. }
  74.  
  75. private static void DemandWebPermission(Uri uri)
  76. {
  77. string uriString = UriToString(uri);
  78.  
  79. if (uri.IsFile)
  80. {
  81. string localPath = uri.LocalPath;
  82. new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand();
  83. }
  84. else
  85. {
  86. new WebPermission(NetworkAccess.Connect, uriString).Demand();
  87. }
  88. }
  89.  
  90. private static string UriToString(Uri uri)
  91. {
  92. if (uri == null)
  93. {
  94. throw new ArgumentNullException("uri");
  95. }
  96.  
  97. UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString);
  98. return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), ).ToString();
  99. }
  100. }

webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整【转】的更多相关文章

  1. webBrowser.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整

    在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后 ...

  2. cookie的secure、httponly属性设置

    cookie的secure.httponly属性设置 转载自:http://www.cnblogs.com/alanzyy/archive/2011/10/14/2212484.html 一.属性说明 ...

  3. Cookie中设置了 HttpOnly,Secure 属性,有效的防止XSS攻击,X-Frame-Options 响应头避免点击劫持

    属性介绍: 1) secure属性当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输(ssl),即 只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证, 如果是 HT ...

  4. Java中Cookie常用操作类(Spring中操作Cookie)

    说明:Cookie下用Key取值没有快速的方法,只能便利循环去取. 技巧:置0则cookie会立即删除,设置-1,负值则会在关闭浏览器后删除.切记一定要增加路径:setPath("/&quo ...

  5. cookie和session,sessionStorage、localStorage和cookie的区别

    1.cookie 含义: 存储在访问者的计算机中的变量,即存储在客户端 创建一个cookie /* getCookie方法判断document.cookie对象中是否存有cookie,若有则判断该co ...

  6. cookie生命周期expires 时间过期,但是cookie没有被浏览器清理的问题

    cookie生命周期expires 时间过期,但是cookie没有被浏览器清理的问题 今天用nodejs起了一个web服务,使用art-template模板引擎渲染出来的页面,在这里我设置了一个coo ...

  7. 写一个带文本菜单的程序,菜单项如下 (1) 取五个数的和 (2) 取五个数的平均值 (X) 退出。

    问题: 写一个带文本菜单的程序,菜单项如下(1)    取五个数的和 (2)     取五个数的平均值(X)    退出. 由用户做一个选择, 然后执行相应的功能.当用户选择退出时程序结束. 实现: ...

  8. python requests库爬取网页小实例:爬取网页图片

    爬取网页图片: #网络图片爬取 import requests import os root="C://Users//Lenovo//Desktop//" #以原文件名作为保存的文 ...

  9. ORACLE中关于使用between在MyBatis中取不同的区间值和取反

    最近在项目中使用between取不同的区间值问题,由于区间跨度大,而且区间多,又是前端传过来的参数,所以使用in和exists比较麻烦.然后就考虑使用between.现将使用方法记录一下. 假如表有个 ...

随机推荐

  1. Aixs2 使用总结,持续更新中 ...

    参考博客:http://zhangjunhd.blog.51cto.com/113473/23692     消息交换模式. 目前Axis2支持三种模式:In-Only.Robust-In和In-Ou ...

  2. DevExpress控件之"XtraForm——窗体"

    1.AutoScaleMode:确定当屏幕分辨率或字体更改时窗体或控件将如何缩放. Dpi:根据显示分辨率控制缩放.常用分辨率为96和120Dpi: Font:根据类使用的字体(通常为系统字体)的维度 ...

  3. linux安装php环境,yum安装php环境

    用yum来管理安装Apache PHP Mysql的基本安装.1. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件.yum -y install httpd php mys ...

  4. JAVA:认识多线程

    曾经古老的DOS操作系统是单任务的.还没有线程的概念,系统在每次仅仅能做一件事情.比方你在copy东西的时候不能rename文件名称. 为了提高系统的利用效率,採用批处理来批量运行任务. 如今的操作系 ...

  5. 78. Longest Common Prefix【medium】

    Given k strings, find the longest common prefix (LCP).   Example For strings "ABCD", " ...

  6. C++ 11 auto关键字

    熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如Python,可以直接声明变量,在运行时进行类型检查.随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今 ...

  7. 用C++画光(三)——色散

    写在前面 源码:https://github.com/bajdcc/GameFramework/blob/master/CCGameFramework/base/pe2d/Render2DScene5 ...

  8. 旋转加载loading和点点加载loadingdemo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. css实现遮罩层(解决透明背景上的文字不透明)

    .PopUp_layer{   position:fixed;   top: 0;   left: 0;   right:0;   bottom:0;   width:100%;   height:1 ...

  10. Python中写一个乒乓球类的游戏

    最近开始学Python,感觉挺好玩的,既有脚本语言的灵活性,又有丰富的类库与面向对象的特点,开发起来很方便. 游戏的规则和乒乓球一样,如果妙蛙种子掉地上了就算输,你可以用蓝色的跷跷板弹它,使他不落到地 ...