Skip to content

Jsdom补环境

更新: 2025/2/24 字数: 0 字 时长: 0 分钟

Jsdom简介

**Jsdom是一个补环境的三方库,它的作用就是创建一个浏览器对象,在下面的实战中我们会使用到它。**先在终端执行如下命令进行安装:

npm install jsdom

安装好了以后,就会在用户目录下出现一个 jsdom 文件夹:

20230719111645

问财选股

难度:中等

地址:https://www.iwencai.com/

问财选股是同花顺旗下的智能投顾平台。首先我们进入网站,在搜索栏随便输入一个关键词5G进行搜索,找到 get-robot-data 数据来源接口:

20230717154549

观察 get-robot-data 接口请求参数,有 CookieHexin-V 两个重要的参数,而且 Hexin-V 参数的值和 Cookiev 字段的值相同:

20230717155233

我们先来定位 Hexin-V 参数,但发现无论是通过 Initiator 追溯请求,还是通过全局搜索 Hexin-V 关键词,都无法准确定位该参数的生成逻辑位置。这时我们就转而寻找 Cookiev 字段逻辑位置,毕竟它们的值都相同。这里我们通过Hook代码注入来定位,点击 Sources 面板中左侧的 Snippets 选项,选择 New snippet 新建一个片段,命名为 hook_cookie 片段,在片段中写入Hook代码,点击右下方的运行按钮进行注入,控制台有输出时,就说明代码注入成功了:

20230717170827

!> 注意:页面刷新时,浏览器会清理缓存,因此页面刷新后,Hook代码需要重新注入才会生效。

现在我们再次搜索时,Hook代码就断住了,通过右侧边栏我们可以看到生成的 v 的值,现在我们就跟着 Call Stack 回调栈一层层往上跟栈:

20230717173932

跟到上一步,发现就是变量 c 赋值给了 document.cookie 属性,而变量 c 中加密参数是 t 外部变量传进来的:

20230717175220

继续跟栈到上一层,发现 t 外部变量是由 n 变量赋值的,而 n 变量又是 rt.update() 函数的返回值:

20230717175704

我们跟进到 rt.update() 函数里面发现是 D 函数,其返回值是 O 函数:

20230719093357

这里我们看一下全部的代码发现并不长,于是就可以套用Webpack的处理流程。首先,我们新建一个 问财选股 的文件夹,在浏览器 Sources 选项卡中的 Overrides 中将其添加进来,然后清空浏览器缓存,刷新页面,全局搜索 rt.update() 关键词,根据名称信息确定点击下面的文件,右键文件标题,选择 Save of overrides 进行覆盖:

20230719095132

覆盖后,在左侧会出现该文件的替换文件,我们在最上方定义一个 v_value 变量:

20230719095616

接着在调用 O 函数位置前面用声明的 v_value 变量接收 O 函数,注意不要加 () 括号,否则就是调用:

20230719095936

然后在最下方通过 v_value() 来调用 O 函数并输出返回值,注意修改文件后要进行 Ctrl+S 保存修改内容:

20230719100622

保存修改后,我们刷新网页,在控制台我们可以看到输出的 O 函数的返回值了:

20230719101333

现在我们将全部的代码拷贝到新建的js文件中,清空浏览器中的覆盖js文件,在本地的Node环境中运行,发现报 document is not defined 错误:

20230719101741

这里我们就使用Jsdom补环境来补环境,首先导入jsdom,在下面实例化一个浏览器的网页对象,并进行相关的环境引入,再次执行,报了一个 navigator is not defined 错误:

20230719144353

我们再补上一个 navigator = window.navigator; 环境,再次执行就发现能正常生成我们所需要的 v_value 值了:

20230719145432

?> 提示:如果执行 Error: HTMLCanvasElement.prototype.getContext (without installing the canvas npm package) 报错,说明没有安装 canvas 库,执行命令 npm install canvas 安装一下就可以了。

?> 提示:这个网站的js代码只是检测了环境,因此我们通过Jsdom补上就可以了,但如果使用到环境中的一些属性,我们就必须去手扣它的环境了。