猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习

猿人学题库十四题——css加密-雪碧图/数据干扰等

 

1.  首先 进入 浏览器的开发者工具,

打开就是 俩个无线debugg,正常的操作过掉

1.  找到 debugg 对应的行数,右击选择 never pause here ,刷新 就不会再此处 停下了

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第1张图片

虽然 这样过掉了,但是你会 发现 特别异常的卡,(我怀疑浏览器卡关闭重开,电脑卡了重启发现还是一样的),

这样根本不好调试 代码,就无法找到 js 的逻辑,(后来发现 虽然用 never pause here过了,但这不是真真的跳过debug了,只是在 debug处 不暂停而已,JS代码还是在无线执行消耗内存卡的吧,卡的导致无法调试)

以下俩种解决思路:

1.1  中间人攻击 fiddler 自己返回 数据

1.2  浏览器的 Override 工具(这里可以查阅资料看看,有时间我补一篇博客)

2.  中间人攻击 fiddler

  • 可以参考 怎么 fiddler修改返回的数据  

先做个测试 对比一下数据:

2.1  fiddler 修改后返回的数据  (这里我已经修改 代码了

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第2张图片

2.2  正常请求返回的数据 

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第3张图片

可以看到俩个数据是一样的,我改后的html代码没有页数了,这里页数这里不用关注,因为我我们只要看到数据对应上就OK了。

3.  分析 JS 

看到源码的有大堆 JS 看不懂东西,ob混淆 

(这里我也不知道怎么区别是不是 ob混淆的,目前只知道这种,看不懂的JS丢进去就好了,补充博客)

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第4张图片

ob解混淆后来看下对比,这代码好看程度大大提升,容易看懂很多

 猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第5张图片         猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第6张图片

 

后面我就直接看 解混淆后的代码了,可以看到很多的方法,但是都是 定义JS方法,我们需要找到 函数执行的地方

1. 函数自执行函数

2. 等待 函数执行 

3. (function(){ })(window)  也是 自执行函数

         猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第7张图片               猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第8张图片 猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第9张图片

这一题 就这俩个地方,JS的只执行函数的方式很多,花里胡哨的有些可以看不懂。

然后 把  ajax 请求 返回 success 成功后面 { } 大括号里面 的代码 全部 换成 解混淆后的代码

在 用浏览器 请求,返回 fiddler 自定义修改后 数据(就是更换 解混淆JS的Html),请求还是会断在 无线debug 那里

但是我们 找出了,自执行函数的位置,就提前打断点,在自执行函数 里面 申明的JS方法,然后又自己执行,我们就在这里先打断点

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第10张图片

调试 下一个断点 就出现了,开始的那俩个 无线debug ,一直在有个方法里死循环(自己调用自己)

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第11张图片

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第12张图片

我们可以直接 重写这个 方法的上一个 栈方法 无线死循环的是 _0x1e51f8 我们重写 _0xde23e 函数

(这俩个函数是我静态保存的,每次请求是不一样的,你们要找到你们保存数据的方法)

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第13张图片

再次 刷新请求 ,除了断在自己打的断点上,无线debug已经没有了。

你会惊奇的发现,前面提到的 setInterval 定时里面也有这个函数 _0xde23e ,但是重写了就失效了

 

这里有个小问题,感觉上 setInterval的定时函数没有起到作用,我做测试的时候 在重写 _0xde23e 方法的上一层函数 _0x18be96,不重写 _0xde23e 函数,自执行函数的无线debug会过掉,但是 定时函数的_0xde23e方法的无线debug方法没有过掉,但是还是没有出现。

 

继续分析,

厉害的人 可能会直接略过前面的步骤,直接看到 下面这部分代码就知道了,ajax 请求成功后,获取数据,然后通过JS添加到前端显示。

但是 这里有个主意的点,通过JS方法把一些多余干扰的图片隐藏了,不然会把干扰的数据也获取到。

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第14张图片

把返回的 info 是HTML字符串,自己新建一个 HTML 可以打开看看

先 测试 一下,把 JS隐藏样式的代码注释掉,把 要隐藏的class打印在控制台查看,

同时 在这里 把 图片的base64编码的字符串 和 对应的 数字,纯手工 copy 到代码的 字典里吧,后面根据 图片找到 对应的 数值

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第15张图片

进一步 解析 隐藏class 的由来,主要有个 btoa 是个win自带的base64编码,js逆向加密中Base64方法替换

然后 其他的 就是 慢慢扣JS了,缺什么补什么,

var _0x20c24d = "." + _0x124e6b(btoa(data["key"] + data["value"])["replace"](/=/g, ""));

扣完请求后,模拟请求 ,发现 数据还是不对,数值的位置不对,这里用偏移了,这里植入 css 的知识

position :相对定位,当前元素 和 上一个元素的位置 关系

这里看到 img-number 的宽度是 9px 像素,数值框的 宽度是 69px 像素,(有些可能会遇到偏移出去了)

                    猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第16张图片                   猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第17张图片

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第18张图片

偏移量  [ 0 , 9 . -9 , 0 ]

数字      [ 1 , 6   1   7 ]

第一个偏移量 0 : 是第一个元素,偏移量还是0,那就是第一个值了
第二个偏移量 9∶  正常第二个元素对应第一个元素的位置关系为 0,加9的偏移量,那就是是第三个位置了 
第三个偏移量 -9∶ 第三个元素 对应 第二个元素的位置为 0 ,偏移量是 -9  就是往往前面移动,那就是第二个位置了
第四个偏移量 0∶  没有偏移,那就是第四个位置设有变化

这里 总结一下,四个元素 产生偏移量时,想要四个值都在 他们的 偏移求和 肯定等于 0,如果不等于 那就是 偏移到 外面的框或重叠了。

# 偏移量 逻辑 
a = [0.0, 1.0, -1.0, 0.0]
b =  [1, 6, 1, 7]
tem = b.copy()

for index,aa in enumerate(a):
    if aa:
        if aa>0:
            b[index+1] = tem[index]
        else:
            b[index-1] = tem[index]
print(b)

# [1, 6, 6, 7]   这就是 需要的结果 1167 

得到 正确的 数据,下面开始撸代码

4. 撸代码

var encode_version = "sojson.v5",
    ubbgr = "__0x8c0ec";
var _0x8f754e = 0;
var _0x130c55 = "";
var _0x690c11 = 8;


function _0x4a5ee7(_0x540928, _0x1c68c7, _0x55fb3a, _0xc73c5d, _0x32e9c6, _0x3a61fb, _0x1c075e) {
    return _0x4efd4f(_0x55fb3a ^ (_0x1c68c7 | ~_0xc73c5d), _0x540928, _0x1c68c7, _0x32e9c6, _0x3a61fb, _0x1c075e);
}

function _0x5284de(_0x15415d, _0x4be6fe, _0x245ee5, _0x438931, _0x452339, _0x1f7c91, _0x4ef10f) {
    return _0x4efd4f(_0x4be6fe ^ _0x245ee5 ^ _0x438931, _0x15415d, _0x4be6fe, _0x452339, _0x1f7c91, _0x4ef10f);
}

function _0x1a3ade(_0x5d7666, _0x36a29d, _0x3b74c1, _0x480b22, _0x30475b, _0x1dd9e9, _0x636b5) {
    return _0x4efd4f(_0x36a29d & _0x480b22 | _0x3b74c1 & ~_0x480b22, _0x5d7666, _0x36a29d, _0x30475b, _0x1dd9e9, _0x636b5);
}

function _0x1cb164(_0x16b706, _0xbd8b87) {
    return _0x16b706 << _0xbd8b87 | _0x16b706 >>> 32 - _0xbd8b87;
}

function _0x50651a(_0x7b44fe, _0x498d2c) {
    var _0x2b4226 = (_0x7b44fe & 65535) + (_0x498d2c & 65535);

    var _0x208fba = (_0x7b44fe >> 16) + (_0x498d2c >> 16) + (_0x2b4226 >> 16);

    return _0x208fba << 16 | _0x2b4226 & 65535;
}

function _0x4efd4f(_0x29aa42, _0x422c7a, _0x2dfb85, _0x367f62, _0x591028, _0x6038d7) {
    return _0x50651a(_0x1cb164(_0x50651a(_0x50651a(_0x422c7a, _0x29aa42), _0x50651a(_0x367f62, _0x6038d7)), _0x591028), _0x2dfb85);
}

function _0x56e427(_0x28552e, _0x519e35, _0x2d221d, _0x265f8e, _0x2baabe, _0x6a5908, _0xa03ce0) {
    return _0x4efd4f(_0x519e35 & _0x2d221d | ~_0x519e35 & _0x265f8e, _0x28552e, _0x519e35, _0x2baabe, _0x6a5908, _0xa03ce0);
}

function _0x2755cc(_0x3af3a2) {
    var _0x5150ad = Array();

    var _0x536650 = 255;

    for (var _0x57f6ed = 0; _0x57f6ed < _0x3af3a2["length"] * _0x690c11; _0x57f6ed += _0x690c11) _0x5150ad[_0x57f6ed >> 5] |= (_0x3af3a2["charCodeAt"](_0x57f6ed / _0x690c11) & _0x536650) << _0x57f6ed % 32;

    return _0x5150ad;
}

function _0x5f2dd4(_0x8dce70, _0x16e827) {
    _0x8dce70[_0x16e827 >> 5] |= 128 << _0x16e827 % 32;
    _0x8dce70[(_0x16e827 + 64 >>> 9 << 4) + 14] = _0x16e827;
    var _0x4351a3 = 1732584193;

    var _0x245564 = -271733879;

    var _0x80a9d = -1732584194;

    var _0x3c2f7b = 271733878;

    for (var _0x2bfaa7 = 0; _0x2bfaa7 < _0x8dce70["length"]; _0x2bfaa7 += 16) {
        var _0x308fc9 = _0x4351a3;
        var _0x5432b0 = _0x245564;
        var _0xb174aa = _0x80a9d;
        var _0x227f98 = _0x3c2f7b;
        _0x4351a3 = _0x56e427(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 0], 7, -680876936);
        _0x3c2f7b = _0x56e427(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 1], 12, -389564586);
        _0x80a9d = _0x56e427(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 2], 17, 606105819);
        _0x245564 = _0x56e427(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 3], 22, -1044525330);
        _0x4351a3 = _0x56e427(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 4], 7, -176418897);
        _0x3c2f7b = _0x56e427(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 5], 12, 1200080426);
        _0x80a9d = _0x56e427(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 6], 17, -1473231341);
        _0x245564 = _0x56e427(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 7], 22, -45705983);
        _0x4351a3 = _0x56e427(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 8], 7, 1770035416);
        _0x3c2f7b = _0x56e427(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 9], 12, -1958414417);
        _0x80a9d = _0x56e427(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 10], 17, -42063);
        _0x245564 = _0x56e427(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 11], 22, -1990404162);
        _0x4351a3 = _0x56e427(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 12], 7, 1804603682);
        _0x3c2f7b = _0x56e427(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 13], 12, -40341101);
        _0x80a9d = _0x56e427(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 14], 17, -1502002290);
        _0x245564 = _0x56e427(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 15], 22, 1236535329);
        _0x4351a3 = _0x1a3ade(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 1], 5, -165796510);
        _0x3c2f7b = _0x1a3ade(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 6], 9, -1069501632);
        _0x80a9d = _0x1a3ade(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 11], 14, 643717713);
        _0x245564 = _0x1a3ade(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 0], 20, -373897302);
        _0x4351a3 = _0x1a3ade(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 5], 5, -701558691);
        _0x3c2f7b = _0x1a3ade(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 10], 9, 38016083);
        _0x80a9d = _0x1a3ade(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 15], 14, -660478335);
        _0x245564 = _0x1a3ade(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 4], 20, -405537848);
        _0x4351a3 = _0x1a3ade(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 9], 5, 568446438);
        _0x3c2f7b = _0x1a3ade(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 14], 9, -1019803690);
        _0x80a9d = _0x1a3ade(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 3], 14, -187363961);
        _0x245564 = _0x1a3ade(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 8], 20, 1163531501);
        _0x4351a3 = _0x1a3ade(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 13], 5, -1444681467);
        _0x3c2f7b = _0x1a3ade(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 2], 9, -51403784);
        _0x80a9d = _0x1a3ade(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 7], 14, 1735328473);
        _0x245564 = _0x1a3ade(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 12], 20, -1926607734);
        _0x4351a3 = _0x5284de(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 5], 4, -378558);
        _0x3c2f7b = _0x5284de(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 8], 11, -2022574463);
        _0x80a9d = _0x5284de(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 11], 16, 1839030562);
        _0x245564 = _0x5284de(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 14], 23, -35309556);
        _0x4351a3 = _0x5284de(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 1], 4, -1530992060);
        _0x3c2f7b = _0x5284de(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 4], 11, 1272893353);
        _0x80a9d = _0x5284de(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 7], 16, -155497632);
        _0x245564 = _0x5284de(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 10], 23, -1094730640);
        _0x4351a3 = _0x5284de(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 13], 4, 681279174);
        _0x3c2f7b = _0x5284de(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 0], 11, -358537222);
        _0x80a9d = _0x5284de(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 3], 16, -722521979);
        _0x245564 = _0x5284de(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 6], 23, 76029189);
        _0x4351a3 = _0x5284de(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 9], 4, -640364487);
        _0x3c2f7b = _0x5284de(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 12], 11, -421815835);
        _0x80a9d = _0x5284de(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 15], 16, 530742520);
        _0x245564 = _0x5284de(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 2], 23, -995338651);
        _0x4351a3 = _0x4a5ee7(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 0], 6, -198630844);
        _0x3c2f7b = _0x4a5ee7(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 7], 10, 1126891415);
        _0x80a9d = _0x4a5ee7(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 14], 15, -1416354905);
        _0x245564 = _0x4a5ee7(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 5], 21, -57434055);
        _0x4351a3 = _0x4a5ee7(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 12], 6, 1700485571);
        _0x3c2f7b = _0x4a5ee7(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 3], 10, -1894986606);
        _0x80a9d = _0x4a5ee7(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 10], 15, -1051523);
        _0x245564 = _0x4a5ee7(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 1], 21, -2054922799);
        _0x4351a3 = _0x4a5ee7(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 8], 6, 1873313359);
        _0x3c2f7b = _0x4a5ee7(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 15], 10, -30611744);
        _0x80a9d = _0x4a5ee7(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 6], 15, -1560198380);
        _0x245564 = _0x4a5ee7(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 13], 21, 1309151649);
        _0x4351a3 = _0x4a5ee7(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b, _0x8dce70[_0x2bfaa7 + 4], 6, -145523070);
        _0x3c2f7b = _0x4a5ee7(_0x3c2f7b, _0x4351a3, _0x245564, _0x80a9d, _0x8dce70[_0x2bfaa7 + 11], 10, -1120210379);
        _0x80a9d = _0x4a5ee7(_0x80a9d, _0x3c2f7b, _0x4351a3, _0x245564, _0x8dce70[_0x2bfaa7 + 2], 15, 718787259);
        _0x245564 = _0x4a5ee7(_0x245564, _0x80a9d, _0x3c2f7b, _0x4351a3, _0x8dce70[_0x2bfaa7 + 9], 21, -343485551);
        _0x4351a3 = _0x50651a(_0x4351a3, _0x308fc9);
        _0x245564 = _0x50651a(_0x245564, _0x5432b0);
        _0x80a9d = _0x50651a(_0x80a9d, _0xb174aa);
        _0x3c2f7b = _0x50651a(_0x3c2f7b, _0x227f98);
    }

    return Array(_0x4351a3, _0x245564, _0x80a9d, _0x3c2f7b);
}

function _0x397d65(_0x41002e) {
    var _0x2c5f6d = "0123456789abcdef";
    var _0x389ccd = "";

    for (var _0x2101be = 0; _0x2101be < _0x41002e["length"] * 4; _0x2101be++) {
        _0x389ccd += _0x2c5f6d["charAt"](_0x41002e[_0x2101be >> 2] >> _0x2101be % 4 * 8 + 4 & 15) + _0x2c5f6d["charAt"](_0x41002e[_0x2101be >> 2] >> _0x2101be % 4 * 8 & 15);
    }

    return _0x389ccd;
}

function _0x124e6b(_0x280199) {
    return _0x397d65(_0x5f2dd4(_0x2755cc(_0x280199), _0x280199["length"] * _0x690c11));
}


var Base64 = {
    // private property
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

    // public method for encoding
    , encode: function (input)
    {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length)
        {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2))
            {
                enc3 = enc4 = 64;
            }
            else if (isNaN(chr3))
            {
                enc4 = 64;
            }

            output = output +
                this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
                this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
        } // Whend

        return output;
    } // End Function encode


    // public method for decoding
    ,decode: function (input)
    {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        while (i < input.length)
        {
            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64)
            {
                output = output + String.fromCharCode(chr2);
            }

            if (enc4 != 64)
            {
                output = output + String.fromCharCode(chr3);
            }

        } // Whend

        output = Base64._utf8_decode(output);

        return output;
    } // End Function decode


    // private method for UTF-8 encoding
    ,_utf8_encode: function (string)
    {
        var utftext = "";
        string = String(string).replace(/\r\n/g, "\n");

        for (var n = 0; n < string.length; n++)
        {
            var c = string.charCodeAt(n);

            if (c < 128)
            {
                utftext += String.fromCharCode(c);
            }
            else if ((c > 127) && (c < 2048))
            {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else
            {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        } // Next n

        return utftext;
    } // End Function _utf8_encode

    // private method for UTF-8 decoding
    ,_utf8_decode: function (utftext)
    {
        var string = "";
        var i = 0;
        var c, c1, c2, c3;
        c = c1 = c2 = 0;

        while (i < utftext.length)
        {
            c = utftext.charCodeAt(i);

            if (c < 128)
            {
                string += String.fromCharCode(c);
                i++;
            }
            else if ((c > 191) && (c < 224))
            {
                c2 = utftext.charCodeAt(i + 1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else
            {
                c2 = utftext.charCodeAt(i + 1);
                c3 = utftext.charCodeAt(i + 2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        } // Whend

        return string;
    } // End Function _utf8_decode

};

function get_class(data) {
//    var class_name = _0x124e6b(btoa(data["key"] + data["value"])["replace"](/=/g, ""));
    var class_name = _0x124e6b(Base64.encode(data["key"] + data["value"])["replace"](/=/g, ""));

    // btoa
    //    var s = new Buffer.from(data["key"] + data["value"], "binary").toString("base64")
    //    console.log(s)
    //    var class_name = _0x124e6b(s["replace"](/=/g, ""));

    console.log('class_name -->>',class_name)

    return class_name
}

data = {'status': '1', 'state': 'success', 'key': '1NrwivKFu3', 'value': 'w8125c9xlj', 'IV': 'qliuz', 'info': ''}


get_class(data)
# -*- encoding=utf-8 -*-
from operator import itemgetter
import requests
from parsel import Selector
import execjs
import re

cookies = {
    'Hm_lvt_337e99a01a907a08d00bed4a1a52e35d': '1608776277,1609252702,1609295123,1609308428',
    'sessionid': '8iaw2emkx9fedvjvq8sntsa7f986uy0n',
    'no-alert': 'true',
    'Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d': '1609308998',
}

headers = {
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Origin': 'http://www.python-spider.com',
    'Referer': 'http://www.python-spider.com/challenge/19',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}



img_dict = {
    "iVBORw0KGgoAAAANSUhEUgAAABoAAAAjCAMAAAC94eqZAAAAAXNSR0IArs4c6QAAAN5QTFRF+fv9od/9+fvb6axkUAAA2fv9+frlAAAAAABQ+d+jAEedFFuhbgAAFgAAyY0wAABC7fv9AB48Vqblq14Au/D9AAAamdn9PFxv8bdyfsT9aLHw+fHF+fO7ABhyAHrF+fv1fjAA+fvISJ3biYl6+cWD+eO7AACDaEwoiVQgQCoYmUQAIGCrQBgAAABqwYE4yaub+dmbcKPToVQAoVwY+fvt0aNysWo4kaPFQAAA4fP94adYgQAAcGBAiS4AFkyDNoHFeImL+euzIHa7ueP9AC6DUKHbcImLKEBiAIHFyef90jE/4QAAAQNJREFUKM9jYIADNn0bTXZ2QXFzSwZUIG+qww4FgoYCyDJMZuxIQJsVSY8eSERU3EFZnRfEckLokwAJcHuCmKoaIEVSMBlFW5AM1BQmYyDHRQQqxQzkyMI4DNIKQC5UG5sRkK2EsBmkkgtiBicLOzu/GEJKhgfOl0CogpgiDBQQAjP5gCw5ZF/CBcCKXJGlrEDGgF2rhXARBKgABdTAvrIGsiSRpQws2Nl10RwEBSAnc8AZjAMuBXIhDik8/gKHhiTW0DBBBDRSGHLDA9oDa8jjiy901zsiAhVP2sCWopSQOSjpEKGQGZR67ZwRqVcIPc27u0HTvL0AMTkFGCQ48xeWXAkAP2Ubepd6ecoAAAAASUVORK5CYII=": 0,
    "iVBORw0KGgoAAAANSUhEUgAAABoAAAAjCAMAAAC94eqZAAAAAXNSR0IArs4c6QAAAF1QTFRFAAAAoVQAPAkAxYQ8+cWD+fvnGQAA+fv9AFSj4fv97fv9+eaz8cmHYJ3TgavTueP9ibvlIFSLFhgYACRQoXJIIGCjAAAg+evT6bd6qWRYcEAYcBgA2aNY2buD+fv1QCX7aQAAAGBJREFUKM/ty0kOgCAUA9CvCCg4z/P9j2lgYWLoTzwA3bUvJc2GPs0elBeQbkEcnYqjMiWGvEBavQCSQhEmu7u5D2kZ/WW6ApKJg7kyGaau0RrS0LoCaKuNxvQmUqR/9ACWThad7ZHt3QAAAABJRU5ErkJggg==": 1,
    "iVBORw0KGgoAAAANSUhEUgAAABoAAAAjCAMAAAC94eqZAAAAAXNSR0IArs4c6QAAARdQTFRF+fv92fv9NAAA+fv1+fvlAAAYAIHFAAAA8fv9FgAAAAA6oVQA+e3Fmdn9od79+fvN8bp3AABKACA6ABhY+fvbNnC3FlyfhUYY+eWrVJ3Xqd/9aK/bbFo8DDuDuXQNcLf1QIXFACRinVwYxYk8fTYA+c2Lwe39Fna7iS4ASERAYDANXB4AIAAA+fvt+d2j+fvFWKXggcPxAEib+e/QgRgAcJ2r2aNYiTYA0e/9gQAA6cGDsWo4wYE4KBhQKBgAqVwA+d2zmYmL2ZlIAABiiYmLSBgAyd/1qef9+ee7UGZ6wYEA6fv9kcXlueP9mXpqMI3NQERiiYl6IFSLWAAAuYlQ6dWzSI3N2a9qYAAAyY1I6cGL8c2LYKvt2JmUjQAAAR1JREFUKM910mlbwjAMAOAhg3KfgqKgXCqIiAh4AIrgCXgrKOL//x0mkY7uWZZPXd+maddo2iKck+fypRCx19adZo6ffWHE+5MC1YJXKOHbNMTZpZnY8OYtfUBWlxTBnNwjjfVPxPjGv4RP4SOzKxe2V+Bzz2MkRYPLygOg63uqtLVcRbH+DRPbtF9Jjhah+2EiRYs+YL+QeskRkBsHgX66fKGS3gN60bioNYGOWMIT+4Kc0CmOHRyd4L/55eSwYpd0ha8T5SoFiiAu7ngPJFmPTR1W5rcoU0a+8KFcKatUZ15zWxix2qH2qFulkUfJhZjrrAlTfyg5JMkzpg7tluD+W4FkzMgO3ifpsHs62a5MkiXcskN5og7lqXZuQ38KGhzS8FaWQgAAAABJRU5ErkJggg==": 2,
    "iVBORw0KGgoAAAANSUhEUgAAABoAAAAjCAMAAAC94eqZAAAAAXNSR0IArs4c6QAAAWJQTFRF+fv96fv9mdn9+euz+fvt3aJQ+fvbAAAA+fv12fv9IAAA+fvIXabbvOH4rOn9iYmL9MWAwfv9AABlMAAAAAA4hMn9NgAAgQAA8d+7odHtQDAcuXINwYEYaHqLG1ajiVAcaK/t+c2Lve39+fPp+e/JAAAgADaDSA0AACRMFkyHpV4NAAAYTKDgoVQAXB4AAC6HaAAAwfH9iXZmIDZQFgAAAABEAACDeGZQDGaz4cWTAEByiYl6yev9+d+jUCQAIEhymUQA4dW7cKPTgUAYuYlQABiD+d2jmUgAMInNmYmLABhYgcX1QERi+fO7+evTQEQ4ABhy6cGDcJGj6cGLAHK76atiyfv9wYE4ADZqAGCrqZ2LaCpAaFQ48fv9mWAgcAAA4cWj2cW7UGZ6sWYA0aNyUDYgNo3NyY1IiWZQ0Z1IoYFQ+fvlAEibicHtIFSLqd/9ABgosdX1iS4AAESbQDZQaK/blFkJ4AAAAU5JREFUKM+Fk2VDAkEQhomTAUUBBQUMDKQUEQsbu7u7u/P/O3t7t7ssq86nmXvu3smzWP4359ldGOBtaaNcJpujYNpLAXTe9gA3/7eA7nXSXe/pChOnzc2ItxrjvZDuD3Sgv/BqEMcsRrGsEc0QNmcETVWoH2Aa24imfdSvQ3/fypC9E6DXRvXGEDXymspqMKYizvOD3JeNo+VTrDGgnAtJXVmhIo406vVbFWTlBFgVorWMP5QiaXXLs681Zph4lj95TFMy+F6kpvejWz4kIfvhhWfoiOQqTkYrmSLQv6hseZ2sKJNVshIoHKpYzweirWMlI1v6dP2q2Of7GwXnc6sNLhlldsg9gbQf7dJcC7kFaBfQSNx8oKXQW2vmu0xxGS9uHFg2bZd0fCMuKkn/gmCEBE/mi9FJMG/+WvdiXD4aAdGSw2K9V3EGEhP0nH4AdB0nRQhEwa4AAAAASUVORK5CYII=": 3,
    "iVBORw0KGgoAAAANSUhEUgAAABoAAAAlCAMAAABruAmEAAAAAXNSR0IArs4c6QAAAIFQTFRF+fv9hcb9+fDH+fvzQERAAAAYABhYAAAAAIHF4aNQ98WD5Pv9Fl+uXRgAFgAAXaro+fvbNAAAtWwY2aJQyYk4eC4A+duf8bx2oVgNgTYAFlyj3aVY2fv9+cuPWKPbod39qd/9gXpQQCoYwYE4+d+rSAAA+eezsef9ACQ4ABhqmUgAvyuUPQAAAKVJREFUKM/V0skSgjAQRdGGiC2oiBM4ASo4/v8H2smCIbxUWe58q1RO1V010ffzt8wTKGrFLspiF93n7CCTw3SMXVSbHKJkxzy+QJJcUKwRpZI7nEJAJlcSIikFBSFKbzqHKHmbHKKN5BaEKF8yz6aI/L3kzgRINbkBRU3Opk7OIlW1OYuyTq5P+oReD0IUMZ73K+Wj3q7y+9QPb3AFofN6/5vafQB+Gg2W8rL+LAAAAABJRU5ErkJggg==": 4,
    "iVBORw0KGgoAAAANSUhEUgAAABkAAAAlCAMAAACAj7KHAAAAAXNSR0IArs4c6QAAAS9QTFRF+fv9+d2h+fvt4fb9od/9AABQ+fv1AAAAAAAYGAAAcGBAADCI9Lt1wXwAsWYA+fnCdQAAACA6AAA9+erF+fvN98eDAEibUwAAiYmL8fv9gRgAQGByye39PwAAyd/1AABYWBgAFkyL6fv9DHK7ABgodLz5+eGryfv9NiQAVKHbRBgA3aRU+fnleLft7evtwe/9UCQA+fvbhTIAqeP9aK/tAAAgAABI8c2LmYmLaFRAqZ164cWjQFRqoVAAKBgAQHqz8d/NQDYg2ZlIuXIY4dXF6cGD+euzoVQAibvl4buLeImLaAAAeJ2rsWYYuXIA2fv9wZFiKFiLNlRq2Z1IWJHNQEQ4ueP9wauDQJnbAGqjyY0wIC56mdn9kaPFgcn9FmaziVgomUQAAFSjiWZQACRQopPdIwAAATlJREFUKM+Fk2dbwjAUhVtHb1pALXVUUVTEhQxxbwTFhXvv/f9/g8mlLenjzdN8SvI2NyfnnmpaxOjugfDo7PCIPqAicVCRZxVp6+KLSUpA7xDA6CJFpriA2DRFhICJQYrMcTJLAeMcgL2TAhZUAg4aQoCx+VMFsFNv7S3SZwI8Pcz7r8zeZmQBoTE+7JGE923Kda0ZnMZKCMrbYvF7hA8yjrHqRyZoTlBAc7hSYOiis2bdvZRagvQxjvrJDtc4SZIEO0yS8peKYCPpKCWiSbG4n5ZB/rBJRAjg8V8u/fu+JevRe3zPDScrr5K0M98DfSQckDg/wpbQ3j1hYZCQ1Zw4ctGMm7CQVfCq/KUpx7ou6sHy9Ylr7YhZshCUrufkZtsFSajzafr77Oo+7MjuxjrPgL11mo76Qf8AIxAgoP2MorAAAAAASUVORK5CYII=": 5,
    "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wgARCAAkABkDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAABgcABAUD/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSoVr5cTrC3dZVbRADIQpirpi1xG5J3rkjn//EABsQAAIDAQEBAAAAAAAAAAAAAAIEAQMFAAYV/9oACAEBAAEFAtbQspKMA7Bz2mFNDq7a59CfoB5NtPQnqloZ34GBFwIz93n4LO2QdVOqT+tudZUF1c+fSk11qVa+/8QAGREAAgMBAAAAAAAAAAAAAAAAAAEQMTJB/9oACAEDAQE/AXcPQ7OR/8QAGREAAgMBAAAAAAAAAAAAAAAAAAEQMTJB/9oACAECAQE/AVULIsnY/8QAKhAAAQIEAgkFAAAAAAAAAAAAAQIDAAQREhATFCIxMjNBUZGhISNScsH/2gAIAQEABj8CRKy3Hc8Re/Nqzu9I0CaVeDuqOEw+8oBDQPqe0VblXFN/ImkZiEJzU7bk6wwcac3cxRI6xaAAOkMuM6qV0qB5wRO0q2vb+xmB9u37Qgt8FrngUOJCknkYr7gHQKixlASMP//EACIQAQABBAICAgMAAAAAAAAAAAERACExURBxYZFBgaHB0f/aAAgBAQABPyEOZ+QuhxHmg6KvMQXay0mbYMmNX08eMSoRFRKdN/5DSOAiAezXHpqmCsUUGSAFgoRJKwrsDgiNWHUD91hXZVBHeqiKsK7gzP28Zs7BUSvWn5Jrau4y9vH/2gAMAwEAAgADAAAAEMyXS4If/8QAHBEAAgICAwAAAAAAAAAAAAAAAAERMUFRIYGR/9oACAEDAQE/EJJlhcd5FEuKJtnui2NL0yFR/8QAHhEAAQQBBQAAAAAAAAAAAAAAAAERMUEhUWFxgZH/2gAIAQIBAT8QYxbXPVGWR5I00nkiffyigsn/xAAgEAEAAgAHAQEBAAAAAAAAAAABESEAEDFBUWGBcZGh/9oACAEBAAE/EE0QKhJADUmbdA9Dg5SuI/QVhSdSFJJgrQqHRrnJ4wIlUkG7bAWriAg6MHgH6mCLqgoNJaQrCNTtOQGOpSQB8LHmILxpHAAqMDLq0WSBslxy5DrusbvqRTnzAnVAz1CiunBT1kCCy6SQbxeRTZieHvp71MXTSYr8yn9YnwDNyvKWv3L/2Q==": 6,
    "iVBORw0KGgoAAAANSUhEUgAAABkAAAAlCAMAAACAj7KHAAAAAXNSR0IArs4c6QAAAK5QTFRF+fv96fv9+fv1MozNgcX9ufP9TAAAAAAA+fvloVQAod39FgAAMwAASJ3bABh6AA1UAGOv+ffNwX4wfQAAaAAA+fHADHS7gTYAwYEN2ZtIue/9+fvF+dmb8fv98bx2AAByAAA0UKLgABhycLf1+euzAAAY4addFmaz+d+j9cmDwfP9mUQA+fvbic39AABI2fv9AC6DaK/tuXYYeBgAAESb4aNQgcX1yYkwWKPbiS4A4f6kdQAAALNJREFUKM+tk8cSgkAQRAdFV8GEATNiQjHn8P8/5oBHuw9UOddXHWa2VoROqWzQ2P8kdQcER64x4QOAuGLM8gVAp6teK+sX5JoKZgMgCRKvMwAe85I+K7wuKslLlvhRIqkiyUXBacNSkESeCmoFdJcrKSaRgoPDXr1hscpzIYeB+amZPwZk0WZmgYIJMpMea7bbKpkKiQn3iMQui7mr2e3ICsBt0j3hnb03qzZsfT9GFoLmA5nrDvr/6ZwVAAAAAElFTkSuQmCC": 7,
    "iVBORw0KGgoAAAANSUhEUgAAABoAAAAlCAMAAABruAmEAAAAAXNSR0IArs4c6QAAAVBQTFRF+fv96fv9AAA1+d+jTQAA+frb2fv9AAAANAAAFgAA+fv1IAAAG16l4aNQw/v9+frtAAAawe79AABQic39iYmL5Pn9qWAA8ceDUGZ6ADaDAFKjFkBymUUAAEab8fv9eLv1AACDACQ4DHK7+cmDZKXXaAAAWEIwaDsc6dOvufP9tYlQUKLgM3zAJFyTDCdE8dWf+fnl6cGHoc3tcKPTwYE4WBgAdLfx9cF6wYEAod/9eRgAZK3t8bdyzfH9+dmbUCQAoVwY2aNYAIHF2ff9iYlyABhA+euzAC6L+fvN+fPlgcX1FoHF2a9qAC56oVQAiYl6IDZA4buL6a9q8d+7MI3NueP9+e+7uZVimcXlgVQgFkCDAAB6mXpqmcXbAABIgUwYmbPTmdn9aFQ4YHKLyaNqod39ABh6oWAg8ePTAAByuXYY2Z1IyY1IFmazADZqAEqese4bOQAAAWpJREFUKM+1UldbAjEQPEUJnHieCopiF1EUBFTAjgXsvffe2/9/dLPJJXt+92qedjOb3cnMGsZ/naGrRB1je9G7qj9AZpA5pzLuArcCjJzQskZaEemNhsviccjvICfTkFbHsc/hLcdGHOiTIxsyqV2A7CUpkw5IUl1O4XwNpAURrwzAo2Y1OLsD0JGIfVDWNKVJTQK0RKBnT2iNE5xRCI6WFM0PiDvVV2aDjN3cU04pKY8vD0mf4rsIhSx2HTGMt2HQmLU16sm5EtUwPUf1zZ4qgX/G3Gadk0ejxBXzK4hXj+FyAqMLZ5Y5wdOY6LPu4oFuaYtyPP3Gng0tvIyQ4l8RcnMJ7W7CCZXaRGEguLQo33pHOB60RyjUDx17LE9IGYiQ3/NVEaD3JIUO4GbVkqtBnJS/QVsw2iY2FAPqN0INtcyZvDZdangmuj3xQrV7uLC487sPXFxmx7U0r9RkVilQvvt6A+z0sbj7Bdh2KpzcpBFrAAAAAElFTkSuQmCC": 8,
    "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wgARCAAkABoDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAQHBgEF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAF5VahGX1E9oVmH6/pYllWn9APImoS1VwNZ/8QAHhAAAQUAAgMAAAAAAAAAAAAAAwABAgQFBhESExX/2gAIAQEAAQUC1NMgTNn6/WbpTMVUW8+RrQl6uRLSpWAXIb05tYCdtNF05g1nk0Yhf6e+r1ENwVcDHt1qwqgl/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAExEUH/2gAIAQMBAT8Bdw6Ojo4I/8QAGREAAwEBAQAAAAAAAAAAAAAAAAExETJB/9oACAECAQE/AVNPNFBcioz/xAAoEAACAAMFCAMAAAAAAAAAAAABAgADBBAREhMxFCEiI0FCUVIzobH/2gAIAQEABj8CFLSi+cdT4jM23meuI3Q1LVLhqF+7J5fUYrrJDrrw32CvowSe5RGBaNzO9QYp3qTzprBio7d9gppqqso6PGIkADrGcvwyetnNG9dGGsbM7vl3+Yy5K3D9s//EACIQAQACAQQCAgMAAAAAAAAAAAERIQAQMUFxUZFhsaHB0f/aAAgBAQABPyGmc6JtsB5wl83Tb+M6NFiv70IbLufcfWg1xbfyp9aTFHIJZ65HOFFWCfU4Wl4cFA0hT3JM2V+axoMpU0Gbpux029t6XdiVsDDcGgBkbzd8ry6f/9oADAMBAAIAAwAAABDAB0qIH//EABsRAAICAwEAAAAAAAAAAAAAAAABITERQZGB/9oACAEDAQE/EIPooGsMjoW+dNpQ/8QAHREAAgEEAwAAAAAAAAAAAAAAAAEhETFBkWFxgf/aAAgBAgEBPxBI5OROqdlohwLHusGMuP/EACEQAQACAQMFAQEAAAAAAAAAAAERITEAEEFRYXGBkaHh/9oACAEBAAE/EKQ8CW8gpWboI9TEwfMERf1HfRd5dkAyrAM1SWbEchQwgEe7tEzBLlKz8GwUWFZAhYWCkLM9zrr8u4ijxHvnS+oBqCFlwH9bdhHcmBFhZgIqrUf5njqFeNPACDGgk/tUdjZ8BMBRlJREeiOoiPYJ4ET80OA2VZ6g5dv/2Q==": 9
}

with open('./ob解混淆js/扣JS代码.js', encoding='utf-8') as f:
    Str_code = f.read()
js = execjs.compile(Str_code)



def get_imgnum(Count,i):
    data = {
        'page': i
    }

    response = requests.post('http://www.python-spider.com/api/challenge19', headers=headers, cookies=cookies, data=data,
                             verify=False)
    res_josn = response.json()
    print('res_josn  ',res_josn)

    result = js.call('get_class', res_josn)

    res_info = res_josn['info']
    sel = Selector(text=res_info)
    td_infos = sel.xpath('//td[@class="info"]')
    print('td_infos ',len(td_infos),td_infos)
    for td_info in td_infos:
        # print(result)
        # print('./img[@class!="%s"]/@src'%(result))
        # Num_imgs = td_info.xpath('./img[@class!="%s"]/@src'%(result)).getall()
        # Num_imgs_not = td_info.xpath('./img').getall()
        Num_imgs = td_info.xpath('./img[not(contains(@class,"%s"))]' % (result)).getall()
        # print('Num_imgs_not -->', result, len(Num_imgs_not))
        # print('Num_imgs -->', len(Num_imgs))
        left_nums = []
        num_s = []
        for Num_img in Num_imgs:
            left_num = re.findall('(?<=style="left:).+?(?=px")', Num_img)[0]
            img_num = re.findall('(?<=data:image/png;base64,).+?(?=")', Num_img)[0]

            # print(img_num)
            # print(left_num)
            left_nums.append(int(left_num) / 9)
            num_s.append(str(img_dict[img_num]))

        print()
        print()
        print(len(left_nums), left_nums)
        print(len(num_s), num_s)

        tem = num_s.copy()
        for index, left_num in enumerate(left_nums):
            # 不为 0,才有 偏移量
            if left_num:
                if left_num > 0:
                    num_s[index + int(left_num)] = tem[index]
                else:
                    num_s[index - abs(int(left_num))] = tem[index]

        ImgN = int(''.join(num_s))
        print('ImgN ',ImgN,type(ImgN))

        Count += ImgN

    return Count


Count = 0
for i in range(1,101):
    Count = get_imgnum(Count,i)


print('Count -->>',Count)

 

总结 :

这一题俩个难点,

第一个无限debug:

              无限debugg 通过fiddler修改返回的相应数据,

              浏览器的 Overides 把请求的数据保存到 本地,相同的请求就会先去返回本地的文件

第二个就是 css 反爬 .css反爬,有俩个注意的点,

              第一个是会隐藏一些多余的图片,通过JS方法获取class的值修改css样式,通过分析JS获取class的值,过滤掉隐藏的图片

              第二个是通过 css的样式对图片进行偏移,扰乱正确的顺序,这里要分析偏移量的逻辑,还原正确的顺序就可以得到正确的数据了

 

 

             [分享]  猿人学·爬虫逆向高阶课   https://j.youzan.com/2fCUDs ,可以私信交流学习

猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习_第19张图片

 

 

你可能感兴趣的:(JS逆向,爬虫,python,python,爬虫,JS逆向,猿人学题库)