• 【爬虫进阶】猿人学任务六之回溯(难度3.0)


    前言

    本文讲解猿人学web题目第6题,内容难点如下:颜文字,JSUnFuck

    分析

    • 打开题目网站,F12,点击XHR,找出数据接口
      在这里插入图片描述

    • 看到请求参数这里,m是加密的,q是两个时间戳
      在这里插入图片描述

    • 全局搜索加密参数,发现不好找,那我们从调用栈入手
      在这里插入图片描述

    • 前面两个jQuery直接跳过,从第三个开始找
      在这里插入图片描述

    • 进来之后,格式化一下代码,发现m参数就在这里,打上断点,看看怎么事
      在这里插入图片描述

    • F11单步跟一下,跳转进来
      在这里插入图片描述

    • 我们在r这里打一点断点,F8跟一下,r与m值一致!
      在这里插入图片描述

    • 调式过程中,发现上面有一个颜文字,解密工具(链接)
      在这里插入图片描述

    • 解密结果如下:
      在这里插入图片描述

    • 继续调式发现一个JsUnFuck,一直卡这里过不去,解密工具(链接)
      在这里插入图片描述

    • 解密结果为false
      在这里插入图片描述

    • 最后有个window无效置空
      在这里插入图片描述

    • q比较简单,就是一个时间戳,直接用python还原一下,就不多说明了!

    扣代码

    直接将整个代码拿下来

    Js改写

    把解密后的代码加进去

    window = global;
    var _n;
    window.o = 1;
    navigator = {};
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    try {
        var we, ke, xe = false;  
        xe && "Microsoft Internet Explorer" == navigator.appName ? (b.prototype.am = i,
            we = 26) : xe && "Netscape" != navigator.appName ? (b.prototype.am = e,
            we = 26) : (b.prototype.am = s,
            we = 28),
            b.prototype.DB = we,
            b.prototype.DM = (1 << we) - 1,
            b.prototype.DV = 1 << we;
    } catch (e) {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    把无效置空删掉

    function r(param1, param2) {
        param1 = parseInt(param1);
        param2 = parseInt(param2);
        return z(param1, param2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码过程

    import requests
    import execjs
    
    class test(object):
    
        def __init__(self):
            self.url = "https://match.yuanrenxue.com/api/match/6"
    
        def get_res(self):
            Headers = {
                "user-agent": "yuanrenxue.project"
            }
            # 打开文件加载js
            with open('案例.js', 'r', encoding='utf-8') as f:
                jsCode = f.read()
            Func = execjs.compile(jsCode.replace(u'\xa0', u''))
            all_sum = 0
            for j in range(1, 6):
                import time
                t = int(time.time()) * 1000
                m = Func.call('r', t, 1)
                q = '1' + '-' + str(t) + "|"
                params = {
                    "page": str(j),
                    "m": m,
                    "q": q
                }
                # print(params)
                res = requests.get(self.url, headers=Headers, params=params)
                for data in res.json()['data']:
                    print(data)
                    all_sum += data['value'] + data['value'] * 23
    
            print(all_sum)
    
    if __name__ == '__main__':
        d = test()
        d.get_res()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    结果

    在这里插入图片描述

    点关注不迷路,本文若对你有帮助,烦请三连支持一下 ❤️❤️❤️
    各位的支持和认可就是我最大的动力❤️❤️❤️

  • 相关阅读:
    Java中的SPI原理浅谈
    从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“
    领导:给你一个项目,如何开展性能测试工作。我:***
    Golang 继承
    紫草酸人血清白蛋白HSA纳米粒|乳香酸卵清白蛋白OVA纳米粒|表白桦脂酸人血清白蛋白纳米粒Epibetulinic Acid-HSA
    水库大坝安全评价导则:大坝运行管理评价
    dbeaver怎么批量执行sql
    【润学】计算机网络八股文英文版(1)
    2.Android系统启动
    二叉树汇总
  • 原文地址:https://blog.csdn.net/fun_sn/article/details/127851645