JS逆向爬虫---请求参数加密②【某麦数据analysis参数加密】

主页链接:

https://www.qimai.cn/rank

analysis逆向

完整参数生成代码如下:

javascript 复制代码
const {JSDOM} = require('jsdom')
const dom = new JSDOM('<!DOCTYPE html><p>hello</p>')
window = dom.window


function customDecrypt(n, t) {
    t = t || generateKey();  // 如果没有提供 t,则使用默认密钥
    // 将字符串 n 分割成字符数组
    n = n.split("");
    for (var i = 0; i < n.length; i++) {
        // 对字符 n[i] 进行异或运算
        n[i] = String.fromCharCode(n[i].charCodeAt(0) ^ t.charCodeAt((i + 10) % t.length));
    }
    // 将字符数组拼接成字符串
    return n.join("");
};

// 拼接a字符串
function a_for_bs64(t){
    var z = window;
    var Z = "Object";
    var i7 = "keys";
    var Zt = "params";
    var M = "forEach";
    var n;
    var N2 = "hasOwnProperty";
    var a = [];
    var b = "push";
    var Ot ="sort" ;
    var I1 = "join";
    var _ = "";


    z[Z][i7](t[Zt])[M](function (n) {
        t[Zt][N2](n) && a[b](t[Zt][n])
    });
    a = a[Ot]()[I1](_);

    console.log(a);
    return a
}


function  analysis_gen(t){
    var d = "xyz517cda96efgh";
    var currentDate = new Date();
    // 获取毫秒级时间戳
    var timestampInMilliseconds = currentDate.getTime();
    a_start = a_for_bs64(t);
    console.log('a_start==>',a_start)
    a_mid_1 = btoa(a_start);
    // MzIwMjMtMTEtMDYzNmFsbGNuaXBob25l
    console.log('a_mid_1==>',a_mid_1);
    time_period = timestampInMilliseconds - 1661224081041;
    // time_period = 38050153244;
    a_end = a_mid_1+"@#"+t.url+"@#"+time_period+"@#"+"3";
    console.log("a_end==>",a_end);
    // 我生成的  MjAyMy0xMS0wNjMzNmFsbGNuaXBob25l@#/rank/indexPlus/brand_id/1@#38050153244@#3
    // 页面生成 "MjAyMy0xMS0wNjMzNmFsbGNuaXBob25l@#/rank/indexPlus/brand_id/1@#38050153244@#3"
    data = customDecrypt(a_end, d);
    e  = btoa(data);
    console.log(e);
    return e
};


// 接受一个t的对象
const t = {
    "url": "/rank/indexPlus/brand_id/0",
    "params": {
        "brand": "all",
        "country": "cn",
        "device": "iphone",
        "genre": "36",
        "date": "2023-11-06",
        "page": 3
    },
    "baseURL": "https://api.qimai.cn",
};
// 将 params 对象拼接为查询字符串
const params = new URLSearchParams(t.params).toString();

// 构建完整的 URL
const fullURL = `${t.baseURL}${t.url}?analysis=${analysis_gen(t)}&${params}`;

console.log(fullURL);

// 完整生成流程
// 1. 获取加密请求数据对象
// 2. 生成需要加密的字符串a_start
// 3. base64编码生成密文 a_mid_1
// 4. 获取毫秒时间戳与定义差值
// 5. 拼接密文,时间戳差值,请求uri,参数等,生成代编码字符串a_end
// 6. 结合密钥d生成待编码字符串 data
// 7. base64编码字符串生成最终的analysis参数
相关推荐
春蕾夏荷_7282977252 分钟前
pyside2 打包发布exe文件
python
Boop_wu6 分钟前
[Java 算法] 栈
java·开发语言·算法
代码煮茶6 分钟前
Vue3 虚拟列表实战 | 解决长列表性能问题(十万条数据流畅渲染,附原理)
前端·javascript·vue.js
来自远方的老作者7 分钟前
第7章 运算符-7.5 比较运算符
开发语言·数据结构·python·算法·代码规范·比较运算符
南境十里·墨染春水8 分钟前
C++笔记 Lambda表达式
开发语言·c++·笔记
We་ct12 分钟前
LeetCode 201. 数字范围按位与:位运算高效解题指南
开发语言·前端·javascript·算法·leetcode·typescript
程序员榴莲13 分钟前
Java(十二)抽象类
java·开发语言
蜡笔小马18 分钟前
01.[特殊字符] 构建你的第一个 AI 智能体:从 DeepSeek 到结构化对话
人工智能·python·langchain
木子欢儿19 分钟前
在 Fedora 上配置 Go 语言(Golang)开发环境
开发语言·后端·golang
超级大只老咪29 分钟前
线性递推通用模板
java·开发语言·算法