python解决js加密问题

首先贴上爬取网址 http://datamining.comratings.com/exam
查看元素发现里面js如下:


eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('l E(a){5 b=9.q;5 c=b.G("; ");M(5 i=0;i<c.D;i++){5 d=c[i].G("=");j(a==d[0]){g d[1]}}g""}m=E(\'m\');5 7="Q+/=";K=R.N;l r(a){5 b,i,k;5 c,e,n;k=a.D;i=0;b="";O(i<k){c=a.o(i++)&P;j(i==k){b+=7.8(c>>2);b+=7.8((c&p)<<4);b+="==";s}e=a.o(i++);j(i==k){b+=7.8(c>>2);b+=7.8(((c&p)<<4)|((e&A)>>4));b+=7.8((e&B)<<2);b+="=";s}n=a.o(i++);b+=7.8(c>>2);b+=7.8(((c&p)<<4)|((e&A)>>4));b+=7.8(((e&B)<<2)|((n&S)>>6));b+=7.8(n&L)}g b}l H(){5 w=f.10||9.v.z||9.u.z;5 h=f.11||9.v.C||9.u.C;j(w*h<=12){g I}5 x=f.13;5 y=f.Z;j(x+w<=0||y+h<=0||x>=f.t.W||y>=f.t.V){g I}g X}l J(){j(H()){}Y{5 a="";a="T="+r(m.U(1,3))+"; F=/";9.q=a;a="e="+r(m)+"; F=/";9.q=a;f.14(K)}}J();',62,67,'|||||var||encoderchars|charAt|document|||||c2|window|return|||if|len|function|session|c3|charCodeAt|0x3|cookie|f1|break|screen|body|documentElement||||clientWidth|0xf0|0xf|clientHeight|length|getCookie|path|split|findDimensions|true|reload|url|0x3f|for|href|while|0xff|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|location|0xc0|c1|substr|height|width|false|else|screenY|innerWidth|innerHeight|120000|screenX|open'.split('|'),0,{}))

一看就是很懵逼,不知道写的什么 。于是笔者开始百度,碰到一个博客说看见eval 就变成console.log 然后用谷歌浏览器控制台console.log一下
python解决js加密问题
下面那串代码我格式化了一下 发现了新天地

function getCookie(a) {
	var b = document.cookie;
	var c = b.split("; ");
	for (var i = 0; i < c.length; i++) {
		var d = c[i].split("=");
		if (a == d[0]) {
			return d[1]
		}
	}
	return ""
}
session = getCookie('session');
var encoderchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
url = location.href;

function f1(a) {
	var encoderchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var b, i, len;
	var c, c2, c3;
	len = a.length;
	i = 0;
	b = "";
	while (i < len) {
		c = a.charCodeAt(i++) & 0xff;
		if (i == len) {
			b += encoderchars.charAt(c >> 2);
			b += encoderchars.charAt((c & 0x3) << 4);
			b += "==";
			break
		}
		c2 = a.charCodeAt(i++);
		if (i == len) {
			b += encoderchars.charAt(c >> 2);
			b += encoderchars.charAt(((c & 0x3) << 4) | ((c2 & 0xf0) >> 4));
			b += encoderchars.charAt((c2 & 0xf) << 2);
			b += "=";
			break
		}
		c3 = a.charCodeAt(i++);
		b += encoderchars.charAt(c >> 2);
		b += encoderchars.charAt(((c & 0x3) << 4) | ((c2 & 0xf0) >> 4));
		b += encoderchars.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6));
		b += encoderchars.charAt(c3 & 0x3f)
	}
	return b
}

function findDimensions() {
	var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
	var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
	if (w * h <= 120000) {
		return true
	}
	var x = window.screenX;
	var y = window.screenY;
	if (x + w <= 0 || y + h <= 0 || x >= window.screen.width || y >= window.screen.height) {
		return true
	}
	return false
}

function reload() {
	if (findDimensions()) {} else {
		var a = "";
		a = "c1=" + f1(session.substr(1, 3)) + "; path=/";
		document.cookie = a;
		a = "c2=" + f1(session) + "; path=/";
		document.cookie = a;
		window.open(url)
	}
}
reload();

观察代码发现 function f1(a) 是将session 加密生成一个c1 和 c2 字符串 放入cookie 传给服务端
所以我们在爬虫时 也要移植这个js代码到python中 生成同样的c1和c2
这个代码看懂了也能自己移植 笔者独立完成时使用的是js2py的模块 我们在创建test.js文件将f1 的js 粘贴到文件中

req_url = 'http://datamining.comratings.com/exam?tdsourcetag=s_pctim_aiomsg'
s = requests.session()
headers = {
    'Cookies':'session=f8d667c6b0edd7524d37aaae917806cf; c1=OGQ2; 		c2=ZjhkNjY3YzZiMGVkZDc1MjRkMzdhYWFlOTE3ODA2Y2Y='
}
html = s.get(req_url).text
mycookie = s.cookies['session']
print(html)
with open('test.js','r') as f:
     html2 = f.read()
myfunction=js2py.eval_js(html2) #将js 代码直接导入
c2 = myfunction(mycookie)         #传入cookie中存放的session
c1 = myfunction(mycookie[1:4]) #观察格式代码js 不难看出需要session 的1到3四个字符


s.cookies['c1'] = c1  #设置cookie内容
s.cookies['c2'] = c2
response2 = s.get("http://datamining.comratings.com/exam3") #访问目标网站

http://datamining.comratings.com/exam3” 这个url 是跳转页面后查看页面源码 不难发现里面ifram 标签的src 是exam3

至此我们成功跳转到目标网站
同时这里面也用到了 request.session 读者自行百度
此页面 刷新一次才会出现c1,c2 必然会用request.session 保持访问时同一次 不会中断连接