爬虫与反爬虫的斗争:可知阅读平台——第一弹
今天,2月15日,蓄谋已久的写码计划开始!星期六是个难得的好机会,疫情在家上网课之余,网上这些免费资源一个也不能少!凭借着这点破技术和不太灵活的脑袋,也像模像样的撸起爬虫来,nodejs+python~大佬轻喷,真的不会js..
别着急~这只是first step,相关内容将于近期更新~
初步试探脚本
话说可知这个平台我也是后知后觉,本来我是在爬悦读(电子工业出版社)的,后来发现gayhub(感谢gayhub的那些大佬,毕竟我的脚本也是“抄袭”了他们的嘛)上有说可知也是与电子社类似的api,而且出版社更多?!这么诱人的东西,自然很多人爬啦....没多久可知就升级加密,也难爬了。
我知道的二位大佬貌似都因为不同的原因,停止更新了脚本了。作为一个伸手党(呸),脚本狗,我们要发挥伟大的创造精神,没有条件我们创造条件也要上,自己动手丰衣足食,撸脚本!
先尝试一下脚本(脚本来源自己gayhub搜,反正repo就那几个吧),提示接口超出限制
,看来是接口被改了,分析一波,盲猜参数一波,基本确定token这个效验key是能通过效验的,也就是说我们提交的数据是被认可的,效验不过的会提示授权被拒绝
,然后IP就被拉黑了。
逆向JS
没有条件也要硬着头皮创造条件!我决定自己亲自逆向一波这个js(F12手动滑稽~)。当然各位大佬们一定料到了,这可知的脚本也非同一般。F12找到引用JS,打开发现:
.....
var _0x211566 = _0x2e2908(this, function() {
var _0x11c898 = function() {
return '\x64\x65\x76';
}
, _0x4fcd45 = function() {
return '\x77\x69\x6e\x64\x6f\x77';
};
var _0x5ac6de = function() {
var _0x2e7c1c = new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');
return !_0x2e7c1c['\x74\x65\x73\x74'](_0x11c898['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
};
var _0x3fbdaa = function() {
var _0x284d18 = new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');
return _0x284d18['\x74\x65\x73\x74'](_0x4fcd45['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
};
var _0x4dc0c5 = function(_0x5bbe45) {
var _0x391fc1 = ~-0x1 >> 0x1 + 0xff % 0x0;
if (_0x5bbe45['\x69\x6e\x64\x65\x78\x4f\x66']('\x69' === _0x391fc1)) {
_0x521335(_0x5bbe45);
}
};
....
woc,这加密....小白哭了,根据那个gayhub上那个脚本作者所说,'\x69\x6e\x64\x65\x78\x4f\x66'
这个是每个字符的16进制编码,想想这东西怎么难得倒我一个会python的script kid呢
撸一个把16进制编码转换回字符的脚本:
import re
f = open("a.js") #待处理de js
lines = f.readlines()
fo = open("b.js","w") #Output
for line in lines:
#print(line)
s=line
#小白的垃圾正则表达式,大佬勿喷
for o in re.findall(r'\\x[0-9a-zA-Z\_]{2}',line):
s=s.replace(o[1:],chr(int("0"+o[1:],16)))
s=s.replace("\\","")
fo.write(s)
fo.close()
经过处理后:
.....
var _0x211566 = _0x2e2908(this, function() {
var _0x11c898 = function() {
return 'dev';
}
, _0x4fcd45 = function() {
return 'window';
};
var _0x5ac6de = function() {
var _0.7c1c = new RegExp('w+ *() *{w+ *['|"].+['|"];? *}');
return !_0x2e7c1c['test'](_0x11c898['toString']());
};
var _0x3fbdaa = function() {
var _0(4d18 = new RegExp('([x|u](w){2,4})+');
return _0x284d18['test'](_0x4fcd45['toString']());
};
var _0x4dc0c5 = function(_0x5bbe45) {
var _0x391fc1 = ~-0x1 >> 0x1 + 0xff % 0x0;
if (_0x5bbe45['indexOf']('i' === _0x391fc1)) {
_0x521335(_0x5bbe45);
}
};
....
我们看到\x..\x..
这种16进制串已经转化成了字符串。
阅读JS
然并卵,这样处理之后仍然有很多_0x的函数...真的很恶心...然而找到和authorize提交相关的代码时却发现提交的参数基本相同啊,bind的也是一样...计算机玄学...
进一步猜测,F12捕获的authorize请求二次访问也会提示超出限制
,目测这可能跟某时间效验有关?咱也不知道,咱也不敢问...
试着用浏览器来爬取
看来脚本爬虫只能是奢望了.....小白的无助,唉.....想到前几天看到的文泉学堂的tampermonkey脚本,我是不是也可以撸一个脚本出来实现自动下载呢?目标锁定在如何获取下载链接和得到私钥or解密密钥明文上
js小白继续惨叫....基本靠Google&Gayhub 加持....
先撸一个截取authorize回来请求的脚本(感谢万能的Google&Gayhub)
// ==UserScript==
// @name keledge
// @namespace http://tampermonkey.net/
// @version 0.1
// @grant GM_xmlhttpRequest
// @description try to take over the world!
// @author You
// @match m.keledge.com/*
// @grant GM_setClipboard
// @grant none
// ==/UserScript==
let allText = {};
(function (open) {
XMLHttpRequest.prototype.open = function () {
if (arguments[1].includes("authorize")) {
console.log("Authorize");
this.addEventListener("load", function () {
let responseOBJ = JSON.parse(this.responseText);
alert(responseOBJ.Data.Url);
}, false);
}
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
然而作用不大,能得到url和一个rsa加密后的解密key...怎么才能得到加密key呢,翻了一遍那些看不懂的js,眼瞎看不到与私钥生成相关的函数,怎么办呢...小白陷入了沉思...
66666666666666