前言:

最近在做中国移动爬虫的过程中,首先遇到的就是 在某个请求中,有一个名为“WT_PFC"的cookie键值是由前端JavaScript生成的,没有进入到HttpWebResponse中。事实上,C#不会去执行客户端脚本 ,用到的HttpWebRequest不是一个真正意义上的web浏览器,它只会下载它所请求的地址的html信息,它永远不会去执行JavaScript或者ajax,同时WebClient这个类间接地也是调用了HttpWebRequest来请求的,所以结论是一致的。

但是由于其他的请求的Request需要Sent该Cookie,所以查了很多资料,基本上只能 重新构建 js 算法 或者使用 WebBrowser自动去执行页面js

IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
string s = @"function confirm() {";
s += @"return true;";
s += @"}";
s += @"function alert() {}";
win.execScript(s, "javascript");

, 但这些都不是最好最快的方法。我采用的是以下的

C# 代码动态编译JavaScript代码的方式得出 JavaScript函数被调用之后的 返回值。

1.Cookie(WT_FPC):

2. 通过HttpWatch查到的生成该cookie的js代码,我提炼出了生成该Cookie的方法,并按格式写成如下形式:

public static function GetWT_FPC(){

    var $t = "2";
var $u = new Date();
var $v = new Date($u.getTime() + 315360000000);
var $w = new Date($u.getTime()); if ($t.length < 10) {
var $x = $u.getTime().toString();
for (var i = 2; i <= (32 - $x.length); i++) $t += Math.floor(Math.random() * 16.0).toString(16);
$t += $x;
};
$t = encodeURIComponent($t);
return "WT_FPC=id=" + $t + ":lv=" + $u.getTime().toString() + ":ss=" + $w.getTime().toString() ;
};

  请注意:请按以上的格式书写 脚本函数,即加上"public static ". 方法体不用动。

3.JsHelper(动态编译Js代码):

我把上面js代码放到本地"WT_FPC.js"文件中

public static class JsHelper {
/// <summary>
/// 执行JS方法
/// </summary>
/// <param name="methodName">方法名</param>
/// <param name="para">参数</param>
/// <returns></returns>
public static string GetJsMethd(string methodName, object[] para) {
string path = AppDomain.CurrentDomain.BaseDirectory + "WT_FPC.js";
string str2 = File.ReadAllText(path);
StringBuilder sb = new StringBuilder();
sb.Append("package aa{");
sb.Append(" public class JScript {"); sb.Append(str2);
sb.Append("}}"); CompilerParameters parameters = new CompilerParameters(); parameters.GenerateInMemory = true; CodeDomProvider _provider = new Microsoft.JScript.JScriptCodeProvider(); CompilerResults results = _provider.CompileAssemblyFromSource(parameters, sb.ToString()); Assembly assembly = results.CompiledAssembly; Type _evaluateType = assembly.GetType("aa.JScript"); object obj = _evaluateType.InvokeMember("GetWT_FPC", BindingFlags.InvokeMethod,
null, null, para); return obj.ToString();
}
}

注意:以上的helper代码如果报错的话,99%都是由于 Js代码的问题,即js代码不规范或者 变量缺少定义之类。

4. C#代码调用helper获得执行结果

//设置Cookie"WT_FPC"
string wt_fpc = JsHelper.GetJsMethd("GetWT_FPC", null);
CookieCollection hcc = new CookieCollection();
Cookie wtcookie = new Cookie() {
Expires = DateTime.Now.AddYears(10),
Path = "/",
Domain = ".10086.cn",
Name = "WT_FPC",
Value = wt_fpc.Substring(wt_fpc.IndexOf('=') + 1, wt_fpc.Length - 7)//
};
hcc.Add(wtcookie);
HttpHelperNew.cookie.Add(wtcookie);

  

5. 小经验: 有时候 JavaScript前端生成的cookie,有时候 服务器端并不 校验,也就是,如果把这个cookie值不通过js代码动态得到,直接 写死的话 也应该可以。

6. 其他:

一:如果需要用C#执行前端js 函数计算的结果,比如 前端js的加密结果,在能找到js代码前提下,可以把js写在本地的html 页面里面,然后C#代码去访问 即可。so easy!

二: Java 中使用WebClient获取js执行完返回的值。

try{
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
//设置webClient的相关参数
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
//webClient.getOptions().setTimeout(50000);
webClient.getOptions().setThrowExceptionOnScriptError(false);
//模拟浏览器打开一个目标网址
HtmlPage rootPage= webClient.getPage(url);
System.out.println("为了获取js执行的数据 线程开始沉睡等待");
Thread.sleep(3000);//主要是这个线程的等待 因为js加载也是需要时间的
System.out.println("线程结束沉睡");
String html = rootPage.asText();
System.out.println(html);
}catch(Exception e){
}

  

【原创】网站抓包HttpWebRequest不返回Javascript生成的Cookie的解决办法的更多相关文章

  1. JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  2. 【ASP.NET 问题】ASP.NET 网站404页面返回200,或者302的解决办法

    做网站在优化网站时遇到了跳转404页面却返回 200.302状态的问题,这样的话搜索引擎会认为这个页面是一个正常的页面,但是这个页面实际是个错误页面,虽然对访问的用户而言,HTTP状态码是“404”还 ...

  3. php history.back返回后表单数据丢失的解决办法

    js使用history.back返回表单数据丢失的主要原因就是使用了session_start();的原因,该函数会强制当前页面不被缓存.本文章向码农介绍php history.back返回后表单数据 ...

  4. iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解

    写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS ...

  5. Fiddler是最强大最好用的Web调试工具之一--网站抓包分析

    Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...

  6. Javascript加载速度慢解决办法

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢.解决办法:换一个js包含的方式,让javascript加载速度倍 ...

  7. fiddler抓取手机上https数据配置和失败的解决办法

    1. 设置fiddler,Tools-Options...      抓取https的话,勾选红框中的内容 2. fiddler默认监听端口8888 3. 查看本机IP 4. 打开手机 设置-无线局域 ...

  8. ASP.NET MVC 使用jquery.form.js 异步上传 在IE下返回值被变为下载的解决办法

    错误记录: <script type="text/javascript"> $(function () { $(document).off("ajaxSend ...

  9. struts2使用Convention Plugin在weblogic上以war包部署时,找不到Action的解决办法

    环境: struts 2.3.16.3 + Convention Plugin 2.3.16.3 实现零配置 现象:以文件夹方式部署在weblogic(10.3.3)上时一切正常,换成war包部署,运 ...

随机推荐

  1. python数据结构之栈、队列的实现

    这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...

  2. 常用的sql脚本 游标遍历操作

    Declare @id int DECLARE cursor_data CURSOR FOR --这里是取得数据源 OPEN cursor_data FETCH FROM cursor_data IN ...

  3. 【推荐】最新国外免费空间网站Hostinger

    英国最大的免费网站托管服务提供商! http://api.hostinger.co.uk/redir/6703404 Hostinger免费版包括以下内容:  - 2000 MB的磁盘空间 - 100 ...

  4. worksteal thread pool

    worksteal的场景 对于一个线程池,每个线程有一个队列,想象这种场景,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列却是空的,现象就是有的线程处于饥饿状态,而有的线程处于消化不良的状态 ...

  5. jQuery诞生记-原理与机制

    一.看似偶然的东西实际是必然会发生的 我大学时候在图书馆翻过一本很破旧的书,讲生物理论的,主要内容就是探讨生命的产生是偶然还是必然.里面很多亚里士多德都看不懂的公式计算什么的,还有模拟原始地球环境出现 ...

  6. 版本控制与vermagic

    http://hychen.wuweig.org/blog/2009/10/09/rao-guo-linux-driver-vermagicjian-cha/ cd scripts grep 'dir ...

  7. 【Xamarin报错】 COMPILETODALVIK : UNEXPECTED TOP-LEVEL error java.lang.OutOfMemoryError: Java heap space

    Xamarin Android 编译报错: COMPILETODALVIK : UNEXPECTED TOP-LEVEL error java.lang.OutOfMemoryError: Java ...

  8. preg_match_all正则表达式的基本使用

    了解正则表达式之前,须要掌握一些常用的正则表达式的基础知识,这些如果能记得最好记得,记不住须要用的时候能查到就行,就多个特殊字符,所以说正则表达式玩的就是特殊,具体大家可以查看更加细致的说明. pre ...

  9. 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByTagName

    按照标签名获取元素 -- getElementsByTagName 标准 DOM 1在Element和Document两个interface中均有定义,原型NodeList getElementsBy ...

  10. ios ZBar扫二维码奇奇怪怪的错误

    Undefined symbols for architecture armv7: "_CVPixelBufferGetHeight", referenced from: -[ZB ...