猿人学题库十一题——人均会解js——采坑式学习

44 篇文章 3 订阅
37 篇文章 58 订阅

猿人学题库十一题——人均会解jsl

 

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

在 Network 找到 对应的请求,在Response中查看返回的内容(这里注意 一下,会找到俩个 challenge/11 的请求)

2. 模拟请求数据

      再次用 postman 模拟请求,显示要登陆

在 请求的Header信息里面 cookie直接复制,

或者在 浏览器的 Application 里面的cookie栏,复制 seesionid 参数携带后在请求(这里可以看到 Expires有效期)

携带 cookie 访问后 ,请求到了数据,但是貌似不是想要的数据,是script的

回过头在 Network ,在第一步发现的 俩个 challenge/11 对比一下,

发现第二个 cookie 多了个参数,那就是在第一个的script 里面做的操作了,接下来我们分析 第一个请求的 script 的代码

3. script  JS分析

var x = "div@Expires@@captcha@while@length@@reverse@0xEDB88320@substr@fromCharCode@662@@0@@@LBWywKW@1500@@cookie@@36@createElement@JgSe0upZ@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@Dec@Tue@eval@@window@href@3@String@attachEvent@false@toLowerCase@09@clD@Array@@26@@Path@@@@f@if@@@D@@addEventListener@@@try@return@location@toString@@@50@@@pathname@@@@setTimeout@@replace@a@innerHTML@@@@1608263915@else@@document@V@@@@http@join@for@@DOMContentLoaded@6@e@@@@@new@catch@var@@2@30@split@@function@1@charAt@12@__jsl_clearance@0xFF@firstChild@search@k@chars@charCodeAt@2FZyf@parseInt@8@@match@RegExp@fq@challenge@@g@onreadystatechange@@d@GMT".replace(/@*$/, "").split("@"),
    y = "1L N=22(){1i('17.v=17.1e+17.29.1k(/[\\?|&]4-2k/,\\'\\')',i);1t.k='26=1q.c|e|'+(22(){1L t=[22(N){16 N},22(t){16 t},(22(){1L N=1t.n('1');N.1m='<1l v=\\'/\\'>1H</1l>';N=N.28.v;1L t=N.2h(/1y?:\\/\\//)[e];N=N.a(t.6).A();16 22(t){1A(1L 1H=e;1H<t.6;1H++){t[1H]=N.24(t[1H])};16 t.1z('')}})(),22(N){1A(1L t=e;t<N.6;t++){N[t]=2e(N[t]).18(m)};16 N.1z('')}],N=['C',[(-~~~{}<<-~~~{})+(-~~~{}<<-~~~{})],'1u',[(-~[]+[]+[[]][e])+[-~-~{}]],'2j',[(-~[]+[]+[[]][e])+[-~[]-~[]-~!/!/+(-~[]-~[])*[-~[]-~[]]],(-~[]+[]+[[]][e])+(-~[-~-~{}]+[[]][e]),(-~[]+[]+[[]][e])+[(+!![[][[]]][23])]],'h',[(1N-~[-~-~{}]+[]+[[]][e])],'%2d',[(-~[]+[]+[[]][e])+(-~[-~-~{}]+[[]][e])],'1D',[(-~[]+[]+[[]][e])+(-~[-~-~{}]+[[]][e])],'aa3b05a1d76ff1b1a8258dd49970718a',(-~[-~-~{}]+[[]][e]),'10'];1A(1L 1H=e;1H<N.6;1H++){N[1H]=t[[23,e,23,1N,23,w,23,1N,23,1N,23,w,23,e,23][1H]](N[1H])};16 N.1z('')})()+';2=r, 25-q-1O B:1b:F 2q;H=/;'};M((22(){15{16 !!u.12;}1K(1E){16 z;}})()){1t.12('1C',N,z)}1r{1t.y('2n',N)}",
    f = function (x, y) {
        var a = 0, b = 0, c = 0;
        x = x.split("");
        y = y || 99;
        while ((a = x.shift()) && (b = a.charCodeAt(0) - 77.5)) c = (Math.abs(b) < 13 ? (b + 48.5) : parseInt(a, 36)) + y * c;
        return c
    }, z = f(y.match(/\w/g).sort(function (x, y) {
        return f(x) - f(y)
    }).pop());
while (z++) try {
    //  可以 看到 这里 有个 eval 函数执行
    eval(y.replace(/\b\w+\b/g, function (y) {
        return x[f(y, z) - 1] || ("_" + y)
    }));
    break
} catch (_) {
}

把 eval 的函数打印,复制出来分析,

可以看到 有个document.cookie的地方,就是赋值 cookie的地方,我们直接用 Nodejs 运行 运行这段JS ,( win10 直接下载,下一步下一步安装就好了 )

document.cookie的地方 是在 _N 的函数里吗,注意是 运行这个 _N 函数 

var _N = function () {
    setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')', 1500);

    //  可以看到 这里有 document.cookie 设置 cookie的地方
    document.cookie = '__jsl_clearance=1608255988.846|0|' + (function () {
        var _t = [function (_N) {
                return _N
            }, function (_t) {
                return _t
            }, (function () {
                var _N = document.createElement('div');
                _N.innerHTML = '<a href=\'/\'>_1H</a>';
                _N = _N.firstChild.href;
                var _t = _N.match(/http?:\/\//)[0];
                _N = _N.substr(_t.length).toLowerCase();
                return function (_t) {
                    for (var _1H = 0; _1H < _t.length; _1H++) {
                        _t[_1H] = _N.charAt(_t[_1H])
                    }
                    ;
                    return _t.join('')
                }
            })(), function (_N) {
                for (var _t = 0; _t < _N.length; _t++) {
                    _N[_t] = parseInt(_N[_t]).toString(36)
                }
                ;
                return _N.join('')
            }],
            _N = ['clD', [(-~~~{} << -~~~{}) + (-~~~{} << -~~~{})], 'V', [(-~[] + [] + [[]][0]) + [-~-~{}]], 'fq', [(-~[] + [] + [[]][0]) + [-~[] - ~[] - ~!/!/ + (-~[] - ~[]) * [-~[] - ~[]]], (-~[] + [] + [[]][0]) + (-~[-~-~{}] + [[]][0]), (-~[] + [] + [[]][0]) + [(+!![[][[]]][1])]], 'LBWywKW', [(2 - ~[-~-~{}] + [] + [[]][0])], '%2FZyf', [(-~[] + [] + [[]][0]) + (-~[-~-~{}] + [[]][0])], '6', [(-~[] + [] + [[]][0]) + (-~[-~-~{}] + [[]][0])], '_62c0090340bd5e05fee305fefccef466', (-~[-~-~{}] + [[]][0]), 'D'];
        for (var _1H = 0; _1H < _N.length; _1H++) {
            _N[_1H] = _t[[1, 0, 1, 2, 1, 3, 1, 2, 1, 2, 1, 3, 1, 0, 1][_1H]](_N[_1H])
        }
        ;
        return _N.join('')
    })() + ';Expires=Tue, 12-Dec-30 09:50:26 GMT;Path=/;'
};
if ((function () {
    try {
        return !!window.addEventListener;
    } catch (e) {
        return false;
    }
})()) {
    document.addEventListener('DOMContentLoaded', _N, false)
} else {
    document.attachEvent('onreadystatechange', _N)
}

用 NodeJS 运行,会报错,有些window的变量 nodejs环境是没有的,要直接定义,

如下提示   document is not defined  ,document 变量没有定义 

这个里 直接添加 document 的变量,再次运行,还是报错,有说 document.attachEvent 是一个 方法,也自己定义

在定义方法的时候,要注意原理的函数的,参数,有几个参数配几个参数

参数 补齐后,可以看到 cookie的 _jsl_clearance 的值

这就是 我们要 cookie的值,我把我 添加的 自定义变量 放上来

document = {
    'attachEvent' : function(){},
    'addEventListener':function(){},
    'createElement':createElement,
};

function createElement(){
        return {
            'innerHTML':'',
            'firstChild':{
                'href':'http://www.python-spider.com/challenge/11'
            }
        }
    }

function  setTimeout (){ }


# 后面 这里只是 测试用,
# 当用 python改写代码的时候 要改一下,变成一个JS方法,返回  document.cookie 的值
_N()
console.log(document.cookie)


# 这是 我后面用到的 
function get_cookie() {
   eval(JSCode);
   _N();
   console.log('document -->>', document.cookie)

   __jsl_clearance = document.cookie.split(';')[0].split('=')[1]
    
   return __jsl_clearance
}

4. 模拟请求

用 python 代码模拟请求,在用  execjs 执行 js ,获取 cookie的值

import requests
import execjs
from parsel import Selector


cookies = {
    'Hm_lvt_337e99a01a907a08d00bed4a1a52e35d': '1608000795,1608000796,1608016679,1608255922',
    'sessionid': 's5db2omcug9roanhjk32sgtgasjjswyb',
    '__jsl_clearance': '1608255976.636^|0^|clD4VpfqhdaLBWywKWy^%^2FZyfi6d_9de88e3d1d9a550788fdcaec6bd9e1833D',
    'Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d': '1608255980',
}

headers = {
    'Proxy-Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Upgrade-Insecure-Requests': '1',
    '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',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}

def Get_Cookie():
    response = requests.get('http://www.python-spider.com/challenge/11', headers=headers, cookies=cookies, verify=False)
    response_JS = response.text[8:-9]
    print('初始的 JS ------>>>', response_JS)
    response_JS = response_JS.replace('eval', 'JSCode = ')
    print('eval 改  变量 -->>>', response_JS)

    Golab_Var = """
        var document = {
            'cookie': '',
            'createElement': createElement,
            'attachEvent':attachEvent
        };

        function setTimeout(a,b) {
        
        }

        function attachEvent() { }

        function createElement(a) {
            return {
                'firstChild': {'href': 'http://www.python-spider.com/challenge/11'}
            }
        }
    """

    End_JS = """
    function get_cookie() {
        eval(JSCode);
        _N();
        console.log('document -->>', document.cookie)

        __jsl_clearance = document.cookie.split(';')[0].split('=')[1]
    
        return __jsl_clearance
        }
    """


    str_JS = Golab_Var + response_JS+End_JS
    # print('Golab+response_JS -->>', str_JS)
    js = execjs.compile(str_JS)  # 加载 JS 代码
    result = js.call("get_cookie")
    print(result)

    return result


Get_Cookie()



# 打印
1608271060.514|0|clD4VpfqhdaLBWywKWy%2FZyfi6d_26cb550b862d05d2e7c21675a23dfc0e3D

好,到这一步,打印出来就没问题了,可以获取 cookie的值,在携带 这个cookie的值 发送请求,就可以获取 数据了


def GetData(__jsl_clearance):

    cookies['__jsl_clearance'] = __jsl_clearance
    response = requests.get('http://www.python-spider.com/challenge/11', headers=headers, cookies=cookies, verify=False)
    # print(response.text)

    res = Selector(response.text)

    trS = res.xpath('//tr[@class="odd"]//td/text()').getall()

    # 答案
    Count = 0
    for tr in trS:
        Count += int(tr.strip())
    print('Count -->>',Count)


# 获取 cookie参数,把参数 携带 请求
__jsl_clearance = Get_Cookie()
GetData(__jsl_clearance)


# 答案
Count -->> 44183

到这里请求数据,使用xpath获取需要的数据,就ok了。

 

总结 :

这里与前面的session设置cookie有一些区别,session的是返回cookie是在reponse headers的 set-cookie自动设置的,而这一题是在请求的script里面的JS代码里面修改 cookie的,需要分析js代码,找到cookie生成和修改的地方,然后模拟这段 JS 代码,获取 cookie的值,然后携带cookie参数去请求真实的数据。

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.含笑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值