sdenv/README.md
2024-06-04 10:59:40 +08:00

7.7 KiB
Raw Permalink Blame History


sdenv

NPM version

sdenv是一个javascript运行时补环境框架与github上其它补环境框架存在较大区别sdenv是站在巨人的肩膀上实现的依赖于jsdom的强大dom仿真能力sdenv可以真实模拟浏览器执行环境作者在固定随机数与添加sdenv-extend的部分插件后可以达到瑞数vmp代码在sdenv运行生成的cookie值与浏览器生成的cookie值一致

依赖

作者开发时使用的是v20.10.0版本node预期最低要求是18版本由于未做其它版本可用性测试因此建议使用sdenv的node版本大于等于v20.10.0

编译node插件用的是node-gyp工具该工具需要有python环境和c环境(如windows系统需安装Visual StudioMac系统需要安装XCode),请根据工具文档进行系统环境搭建。

需要注意windows中安装Visual Studio时需要勾选使用C++的桌面开发选项

安装Visual Studio注意

可能出现的问题

  1. npm安装node-gyp报错请确保操作系统有c++编译环境与python环境报错示例感谢用户风流小混沌提供图片素材: npm安装报错
  2. 安装缓慢及canvas报错由于canvas安装会优先从github获取现成的包因此请在安装前先设置代理或者其它国内源如果安装仍然失败请使用npm官方源+代理方式重新尝试;

解决完报错后记得重新执行下依赖安装!

有其它问题请提issues

使用

npm包使用

  1. 创建自己的项目
  2. 项目中安装sdenvnpm i sdenv(请确保安装没有报错)
  3. 在项目中导入api并使用可以参考example目录下的用例
const { jsdomFromText, jsdomFromUrl, browser } = require('sdenv');

样例代码运行

注意样例代码仅供参考作者建议使用npm包方式使用sdenv框架!

源码方式

clone项目仓库后执行依赖安装npm i确保依赖安装成功后即可运行example目录下的样例文件了。

  1. 运行本地代码:use-local 样例调用
  2. 运行网站代码:use-remote 样例调用

docker方式

提供docker方式运行样例代码.

首先执行uname -a后查看架构类型,支持arm64x86_64

如果是arm64架构则执行命令:

  1. 运行本地代码:docker run --rm pysunday/sdenv:arm64 ./example/use-local/index.js
  2. 运行网站代码:docker run --rm pysunday/sdenv:arm64 ./example/use-remote/index.js

如果是x86_64架构则执行命令:

  1. 运行本地代码:docker run --rm pysunday/sdenv:x86_64 ./example/use-local/index.js
  2. 运行网站代码:docker run --rm pysunday/sdenv:x86_64 ./example/use-remote/index.js

docker打包

可以参考项目的Dockerfile.example文件,通过命令uname -a查看架构类型,然后取消对应的FROM语句注释,修改文件名为Dockerfile如arm64架构的Dockerfile文件内容

FROM pysunday/sdenv_base:arm64

RUN git clone https://github.com/pysunday/sdenv.git
WORKDIR /sdenv
RUN npm i

ENTRYPOINT ["/usr/local/bin/node"]

最后执行命令docker build -t pysunday/sdenv ./生成容器

运行容器内的样例代码与前面类似:

  1. 运行本地代码:docker run --rm pysunday/sdenv ./example/use-local/index.js
  2. 运行网站代码:docker run --rm pysunday/sdenv ./example/use-remote/index.js

如果需要在docker内调试代码作者建议使用npm包的方式使用sdenv然后通过映射方式调用docker

API

sdenv设计极其简单它的核心API只有一个即browser

browser(window: object, type: string)

传入window对象和需要拟真的浏览器类型browser方法会自动将浏览器特性集成到window对象中。

const { browser } = require('sdenv');
...
browser(window, 'chrome')

浏览器类型及支持情况:

类型 是否支持
Chrome Y
Firefox N
Safari N

jsdomFromText(config: object)

返回回调方法用于纯文本方式调用jsdom第一个参数为配置对象最终会作为第二个参数传入到jsdom中。

const { Script } = require("vm");
const { jsdomFromText } = require('sdenv');
const [jsdomer, cookieJar] = jsdomFromText({
    url: 'https://host/path',
    referrer: 'https://host/path',
    contentType: "text/html",
    runScripts: "outside-only", // 不会执行html文本中的js代码
})
const dom = jsdomer('<html>...</html>');
new Script('javascript代码').runInContext(dom.getInternalVMContext()); // 执行javascript代码
console.log('cookie值', cookieJar.getCookieStringSync('https://host'));

进一步阅读:

jsdom的JSDOM API

jsdomFromUrl(config?: object, cookieJar?: CookieJar)

返回回调方法用于链接形式调用jsdom第一个参数为配置对象与jsdomFromText方法不同该配置对象用于配置ResourceLoader建议至少传入ua值否则请求header中的ua内容会有jsdom标识需要注意的是该ua仅在jsdom层使用cookieJar非必传当需要延续cookie时需要传入。

const { jsdomFromUrl } = require('sdenv');
const config = { userAgent: 'native browser userAgent' };
const [jsdomer, cookieJar] = jsdomFromUrl(config); // 返回自动生成的cookieJar
const oneDom = await jsdomer('https://host/path');
const twoDom = await jsdomFromUrl(config, cookieJar)[0]('https://host/path'); // 使用已经存在的cookieJar因为要沿用上一次产生的cookie
console.log('cookie值', cookieJar.getCookieStringSync('https://host'));

进一步阅读:

jsdom的ResourceLoader API

jsdom的CookieJar API

jsdom的fromURL API

sdenv-extend使用说明

为了模拟浏览器执行环境需要将node环境与浏览器环境共有代码进行提取并提供返回环境对象用于sdenv内window与dom内容补充使用。

sdenv-extend具体功能可参考项目内README文档

sdenv-jsdom使用说明

sdenv-jsdom包是sdenv补环境框架能运行瑞数vmp网站并产生正确cookie的核心该包仓库fork自jsdom仓库并应对瑞数vmp对jsdom的检测做了代码修改因此sdenv可以过网站对jsdom的检测!

声明

该项目的开发基于瑞数vmp网站不能保证在其它反爬虫产品稳定使用出现问题请及时提issues或者提pull参与共建!

添加作者微信进技术交流群howduudu_tech(备注sdenv)

订阅号不定时发表版本动态及技术文章:码功

订阅号:码功