猿人学-爬虫刷题:第一题解题思路

本文介绍了在猿人学爬虫挑战中解题的思路,涉及JavaScript加密参数m的分析和解密。通过F12查看接口,发现m参数是一个加密的字符串,需要找到加密逻辑。在源码中找到oo0O0函数,经过eval和base64解码后发现是MD5加密逻辑。最后提取加密方法并应用到代码中,完成解题。
摘要由CSDN通过智能技术生成

缘由

前几天在v2ex看到网站的宣传,点开后觉得挺有趣,试着做了一下。下面分享下解题思路。
题目链接: 猿人学爬虫第一题

在这里插入图片描述


思路

打开f12看一下

登录接口:
在这里插入图片描述

分页数据接口:在这里插入图片描述

看起来只要请求登录接口获取cookie后,再请求五次分页接口后,拿到返回接口,计算得到平均值就ok。但分页接口query参数中有一个字段m,需要注意,是带上的加密参数,需要在网页源码中找到推导加密过程。也是这道题的意义所在。

观察参数m的值:
5d86db93a825e2a005525f2f7265ef68 通过某种加密得到的加密串
1617712120这个很像一个时间戳
而这两个值看起来是有关联的,开始源码

1、找到m的赋值代码

得知是由一个时间戳运算后得到,oo0O0相当于加密函数

var timestamp = Date.parse(new Date()) + 100000000;

// 赋值
var m = oo0O0(timestamp.toString()) + window.f;
var list = {
   
    "page": window.page,
    "m": m + '丨' + timestamp / 1000
}
2、oo0O0加密函数与window.f

函数oo0O0接受参数mw,但通过读代码,发现函数只是返回一个空字符串,而window.f这个变量在源码全局搜索是没有找到,所以觉得这个函数应该是对window.f做了赋值操作,通过一些代理或字符替换手段达到赋值的效果。

function oo0O0(mw) {
   
    window.b = '';
    for (var i = 0, len = window.a.length; i < len; i++) {
   
        console.log(window.a[i]);
        window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c)
    }
    var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
    var J = function (o, E) {
   
        o = o - 0x0;
        var N = U[o];
        if (J['bSSGte'] === undefined) {
   
            var Y = function (w) {
   
                var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',
                    T = String(w)['replace'](/=+$/, '');
                var A = '';
                for (var C = 0x0, b, W, l = 0x0; W = T['charAt'](l++); ~W && (b = C % 0x4 ? b * 0x40 + W : W, C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {
   
                    W = m['indexOf'](W)
                }
                return A
            };
            var t = function (w, m) {
   
                var T = [],
                    A = 0x0,
                    C, b = '',
                    W = '';
                w = Y(w);
                for (var R = 0x0, v = w['length']; R < v; R++) {
   
                    W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)
                }
                w = decodeURIComponent(W);
                var l;
                for (l = 0x0; l < 0x100; l++) {
   
                    T[l] = l
                }
                for (l = 0x0; l < 0x100; l++) {
   
                    A = (A + T[l] + m['charCodeAt'](l % m['length'])) % 0x100, C = T[l], T[l] = T[A], T[A] = C
                }
                l = 0x0, A = 0x0;
                for (var L = 0x0; L < w['length']; L++) {
   
                    l = (l + 0x1) % 0x100, A = (A + T[l]) % 0x100, C = T[l], T[l] = T[A], T[A] = C, b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T[l] + T[A]) % 0x100])
                }
                return b
            };
            J['luAabU'] = t, J['qlVPZg'] = {
   }, J['bSSGte'] = !
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值