sdenv

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

依赖

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

安装

由于document.all需要由c代码动态生成而固定编译环境下的编译产物只能在相同编译环境下运行因此安装sdenv后需要动态编译生成node文件

  1. 安装:npm i sdenv
  2. 编译c代码cd node_modules/sdenv && yarn build

在编译过程未实现自动化之前可直接clone项目使用

使用

因为项目核心功能基于jsdom且jsdom对dom的实现非常完善因此使用sdenv之前建议有一定html与javascript语言开发基础然后参考example目录下的样例文件:

  1. use-local
    const fs = require('fs');
    const path = require('path');
    const { Script } = require("vm");
    const logger = require('../../utils/logger');
    const browser = require('../../browser/');
    const { jsdomFromText } = require('../../utils/jsdom');
    
    const baseUrl = "https://wcjs.sbj.cnipa.gov.cn"
    
    const files = {
      html: path.resolve(__dirname, 'output/makecode_input_html.html'),
      js: path.resolve(__dirname, 'output/makecode_input_js.js'),
      ts: path.resolve(__dirname, 'output/makecode_input_ts.json'),
    }
    
    function getFile(name) {
      const filepath = files[name];
      if (!filepath) throw new Error(`getFile: ${name}错误`);
      if (!fs.existsSync(filepath)) throw new Error(`文件${filepath}不存在请使用rs-reverse工具先获取文件`);
      return fs.readFileSync(filepath);
    }
    
    function initBrowser(window, cookieJar) {
      window.$_ts = JSON.parse(getFile('ts'));
      window.onbeforeunload = async (url) => {
        const cookies = cookieJar.getCookieStringSync(baseUrl);
        logger.debug('生成cookie', cookies);
        process.exit();
      }
      browser(window, 'chrome');
    }
    
    async function loadPages() {
      const htmltext = getFile('html');
      const jstext = getFile('js');
      const [jsdomer, cookieJar] = jsdomFromText({
        url: `${baseUrl}/sgtmi`,
        referrer: `${baseUrl}/sgtmi`,
        contentType: "text/html",
        runScripts: "outside-only",
      })
      const dom = jsdomer(htmltext);
      initBrowser(dom.window, cookieJar);
      new Script(jstext).runInContext(dom.getInternalVMContext());
    }
    
    loadPages()
    
  2. use-remote
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
    const logger = require('../../utils/logger');
    const browser = require('../../browser/');
    const { jsdomFromUrl } = require('../../utils/jsdom');
    
    const baseUrl = "https://wcjs.sbj.cnipa.gov.cn"
    
    async function loadPages() {
      const [jsdomer, cookieJar] = jsdomFromUrl({
        userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
      });
      const dom = await jsdomer(`${baseUrl}/sgtmi`);
      window = dom.window
      window.onbeforeunload = async (url) => {
        const cookies = cookieJar.getCookieStringSync(baseUrl);
        logger.debug('生成cookie', cookies);
        process.exit();
      }
      browser(window, 'chrome');
    }
    
    loadPages()
    

sdenv-extend使用说明

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

sdenv-extend初始化只执行一次初始化成功后生成的环境对象可以使用Object.sdenv()(vm中使用非node)获取。

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

声明

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

由于初期版本只做了chrome浏览器的拟真且项目文档不完善作者会陆续补充可以加入技术交流群与订阅号持续关注

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

订阅号会定期发表技术文章:码功

Description
基于jsdom和瑞数vmp开发的补环境框架
Readme BSD-3-Clause 1.7 MiB
Languages
JavaScript 75.8%
HTML 15.3%
C++ 8.3%
Python 0.6%