《Python3网络爬虫开发实战(第二版)》配套案例 spa6

Scrape | Moviehttps://spa6.scrape.center/

请求影片列表api时,不仅有分页参数,还多了一个token,通过重发请求发现token有时间限制,所以得逆向token的生成代码。

通过xhr断点定位到接口请求位置

刷新页面或者点翻页按钮,触发断点

在调用堆栈中往下找到token出现的地方

在onFetchData找到了请求构造的地方

在这里添加断点,希望找到token生成的算法

切页面发现这里确实传递了token

查看'token': _0x263439是在哪里生成的

可以看到

javascript 复制代码
_0x263439 = Object(_0x2fa7bd['a'])(this['$store']['state']['url']['index'])

接下来看看他们具体内容:

this'$store''state''url''index'其实就是一个固定值"/api/movie",即请求接口的地址

Object(_0x2fa7bd'a')是一个方法

点击进入方法声明的地方

跳转到function _0x456254(),这里就是token生成的逻辑

接下来就慢慢的扣代码了。

本地新建一个js文件用于还原token生成逻辑

由前面可知,token生成就是对api的url进行加密

javascript 复制代码
_0x263439 = Object(_0x2fa7bd['a'])(this['$store']['state']['url']['index'])

其中Object(_0x2fa7bd'a')对应函数_0x456254,this'$store''state''url''index'为固定值"/api/movie"

翻译过来就是

javascript 复制代码
console.log(_0x456254('/api/movie'))

然后补_0x456254的代码,直接复制过来,然后缺啥补啥

执行一下,查看报错

提示说缺_0x189cbb

由于代码是Webpack打包的,继续往下扣感觉是无底洞。我们换个思路,重新审视function _0x456254()

可以推测出应该是加密编码相关的工具,直接把他们补充完整就行,这步直接交给ai完成

XML 复制代码
你是一名JS逆向专家,请给下面的代码补充完整环境(_0x189cbb以及_0x34777a),使用常用的加密库
var _0x189cbb = _0x34777a('3452'), _0x358b1f = _0x34777a('27ae')['Base64'];

function _0x456254() {
    for (var _0x5da681 = Math['round'](new Date()['getTime']() / 0x3e8)['toString'](), _0x2a83dd = arguments['length'], _0x31a891 = new Array(_0x2a83dd), _0x596a02 = 0x0; _0x596a02 < _0x2a83dd; _0x596a02++)
        _0x31a891[_0x596a02] = arguments[_0x596a02];
    _0x31a891['push'](_0x5da681);
    var _0xf7c3c7 = _0x189cbb['SHA1'](_0x31a891['join'](','))['toString'](_0x189cbb['enc']['Hex'])
      , _0x3c8435 = [_0xf7c3c7, _0x5da681]['join'](',')
      , _0x104b5b = _0x358b1f['encode'](_0x3c8435);
    return _0x104b5b;
}

console.log(_0x456254('/api/movie'))

ai给出的结果

javascript 复制代码
// 环境补全(模拟原代码的_0x34777a函数)
function _0x34777a(id) {
    const CryptoJS = require('crypto-js');  // 引入加密库
    
    // 根据不同的id返回不同的加密模块
    const cryptoModules = {
        '3452': {  // SHA1相关功能
            SHA1: CryptoJS.SHA1,
            enc: {
                Hex: CryptoJS.enc.Hex
            }
        },
        '27ae': {  // Base64编码功能
            Base64: {
                encode: function(str) {
                    // 模拟原代码的Base64编码逻辑
                    return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
                }
            }
        }
    };
    
    return cryptoModules[id] || {};
}

// 初始化加密对象(完全还原原代码的变量名)
var _0x189cbb = _0x34777a('3452');  // 获取SHA1功能模块
var _0x358b1f = _0x34777a('27ae')['Base64'];  // 获取Base64编码模块

// 原函数保持不变
function _0x456254() {
    for (var _0x5da681 = Math['round'](new Date()['getTime']() / 0x3e8)['toString'](), _0x2a83dd = arguments['length'], _0x31a891 = new Array(_0x2a83dd), _0x596a02 = 0x0; _0x596a02 < _0x2a83dd; _0x596a02++)
        _0x31a891[_0x596a02] = arguments[_0x596a02];
    _0x31a891['push'](_0x5da681);
    var _0xf7c3c7 = _0x189cbb['SHA1'](_0x31a891['join'](','))['toString'](_0x189cbb['enc']['Hex'])
      , _0x3c8435 = [_0xf7c3c7, _0x5da681]['join'](',')
      , _0x104b5b = _0x358b1f['encode'](_0x3c8435);
    return _0x104b5b;
}

// 测试输出
console.log(_0x456254('/api/movie'));

直接运行,有输出

尝试发起请求,验证token正确

所以没必要继续深挖代码寻找_0x189cbb、_0x358b1f到底在哪实现,直接手动补环境就行了。

下面看看token的具体内容到底是什么:

总结就是:

  1. 获取当前时间戳(秒级)并转为字符串
  2. 计算url的sha1
  3. 将sha1用逗号时间戳
  4. 对结果进行编码(Base64)后返回
相关推荐
沫璃染墨1 分钟前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书
CCIE-Yasuo2 分钟前
个人电脑搭建AI-Qwen3-8B-学习记录
人工智能·python·学习
怕浪猫5 分钟前
12个UI组件库,Star最低的下载最多
前端·javascript·面试
溪语流沙11 分钟前
【Web全栈进阶】Vue3起步:组件、模板语法、响应式数据
前端·javascript·vue.js·css3
贾宝玉的玉宝贾20 分钟前
FreeSWITCH 简单图形化界面 70 - 监听/密语的lua脚本
开发语言·junit·lua·voip·freeswitch·sip·ippbx
Wang's Blog21 分钟前
Java 项目部署之 Docker工具快速入门: 镜像命令从 pull 到 load 的完整实操
java·开发语言·docker
北京盛世宏博26 分钟前
异地机房采集踩坑笔记:以太网温湿度记录仪跨网段通信调试实战
开发语言·笔记·单片机·php·传感器·温湿度
Wang's Blog29 分钟前
Java 项目部署之 Docker工具快速入门: Docker 数据卷命令与挂载实操
java·开发语言·docker
小猴子爱上树32 分钟前
跨马翻译:批量图片翻译+视频字幕+智能抠图,跨境电商翻译工具
python·音视频
霸道流氓气质39 分钟前
AI 应用异常检测与根因分析:语义漂移检测、因果图推理与LLM-as-Judge的 Java 生产级实现
java·开发语言·人工智能