http://www.pbc.gov.cn/publish/zhengcehuobisi/637/index.html
想从此网站中选取当日连接,然后获取汇率数据,结果最近不知道发什么神经,给搞了js加密,用webclient跟webrequest均失败,js加密破解一层后也还是不会获取真实地址,没办法,技术不到家,求各种高人帮忙啊~
------解决思路----------------------
你有两种办法解决,一个是用fiddlercore,直接拦截http数据。
另一个是分析一下抓包的过程,你会发现浏览器请求了三次http://www.pbc.gov.cn/publish/zhengcehuobisi/637/index.html
第一次获取cookie,第二次302跳转,第三次带着前两次的cookie访问网站,就给出来数据了
Cookie: wzwsconfirm=e8c83b5c7829fad0c6e16c1de47eb246; wzwstemplate=Ng==; wzwschallenge=-1; ccpassport=c14b5f460dcd23a4fddff3881ab60e29
------解决思路----------------------
根据大神的指示,发现只要带着正确的“wzwsconfirm”,“wzwstemplate”,“wzwschallenge”三个cookie,访问网站,网站会302跳转并反馈“ccpassport”的cookie,有了这个就能正常取数据了。具体的可以用httpwebrequest来做,加上cookiecontainer就行了,这里不多罗嗦了。
关键是如何算出那三个cookie,两个方法,一是取回js代码,设法让在C#中执行,这个你已经在做了;另一个就是把js的代码转成C#的,下面就是转好的代码,当然质数表将是我长期的痛。。。
private string Doubi1(string wzwschallenge, string wzwschallengex, int prefixlabel)
{
char[] tmp = (wzwschallenge + wzwschallengex).ToCharArray ();
int[] zhishu={2,3,5,7,11,13,17,19,23,29,31};
int hash = 0;
int i = 0;
for (i = 0; i < tmp.Length; i++)
{
hash += (int)tmp[i];
}
hash *= zhishu[prefixlabel];// 3;
hash += 111111;
return "WZWS_CONFIRM_PREFIX_LABEL" + prefixlabel + hash;
}
private string Doubi2(string str)
{
string outstr;
int i, len,c1, c2, c3;
char[] encoderchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".ToCharArray ();
char[] strchar = str.ToCharArray();
len = str.Length;
i = 0;
outstr= "";
while (i < len)
{
c1 = (int)strchar[i++] & 0xff;
if (i == len)
{
outstr += encoderchars[c1 >>2];
outstr += encoderchars[(c1 & 0x3) << 4];
outstr += "==";
break;
}
c2 = (int)strchar[i++];
if (i == len)
{
outstr += encoderchars[c1 >> 2];
outstr += encoderchars[((c1 & 0x3) << 4)
------解决思路----------------------
((c2 & 0xf0) >> 4)];
outstr += encoderchars[(c2 & 0xf) << 2];
outstr += "=";
break;
}
c3 = (int)strchar[i++];
outstr += encoderchars[c1 >> 2];
outstr += encoderchars[((c1 & 0x3) << 4)
------解决思路----------------------
((c2 & 0xf0) >> 4)];
outstr += encoderchars[((c2 & 0xf) << 2)
------解决思路----------------------
((c3 & 0xc0) >> 6)];
outstr += encoderchars[c3 & 0x3f];
}
return outstr;
}