爬虫与反爬虫的斗争:可知在线阅读平台——第一弹

今天,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,眼瞎看不到与私钥生成相关的函数,怎么办呢...小白陷入了沉思...

标签: none

仅有一条评论

  1. 66666666666666

添加新评论