py执行js代码+补充浏览器环境

py执行js代码

一、node.js编译代码

环境准备:node.js

- v1.js

  function func(arg) {
      return arg + 'i666';
  }
  let data = func("老铁");
  console.log(data)

- python执行执行本地命令:`node v1.js`

python
  import os
  import subprocess
  
  # 根据自己的操作系统去修改(相当于python的sys.path,加载安装的模块)
  os.environ["NODE_PATH"] = "/usr/local/lib/node_modules/"  
  
  signature = subprocess.getoutput('node v1.js')
 

二、pyexecjs编译代码

本质还是调用node.js去编译代码。

准备环境:

- node.js

- pyexecjs模块

pip install pyexecjs
 

例如

- v2.js

  function func(arg) {
      return arg + '666';
  }

- 执行js代码

  ```python
  import execjs
  import os
  
  os.environ["NODE_PATH"] = "/usr/local/lib/node_modules/"
  with open('v2.js', mode='r', encoding='utf-8') as f:
      js = f.read()
  
  JS = execjs.compile(js)
  
  sign = JS.call("func", "微信")
  print(sign) # 微信666
  ```


本质上都是依赖node.js

- 电脑上安装上node.js之后(编译器,相当于装CPython解释器)
- 自动安装npm(第三方包管理器,相当于pip)

补充浏览器环境[提前安装]

环境准备:

- node.js

- jsdom(通过后端node+js代码实现伪造浏览器环境

  npm install node-gyp@latest sudo npm explore -g npm -- npm i node-gyp@latest
  
  npm install jsdom -g

  注意:上述安装成功后已可以模拟浏览器环境。‘’

npm查看包路径 : npm root -g

一、方式1

const jsdom = require("jsdom");
const {JSDOM} = jsdom;

const resourceLoader = new jsdom.ResourceLoader({
    userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36",
});

const html = `<!DOCTYPE html><p>Hello world</p>`;


const dom = new JSDOM(html, {
    url: "https://www.toutiao.com",
    referrer: "https://example.com/",
    contentType: "text/html",
    resources: resourceLoader,
});

console.log(dom.window.location)
console.log(dom.window.navigator.userAgent)
console.log(dom.window.document.referrer)


python执行
import os
import subprocess

# 根据自己的操作系统去修改(相当于python的sys.path,加载安装的模块)
os.environ["NODE_PATH"] = "/usr/local/lib/node_modules/"  

res = subprocess.getoutput('node v10.js')
 

二、方式2

const jsdom = require("jsdom");
const {JSDOM} = jsdom;

const resourceLoader = new jsdom.ResourceLoader({
    userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36"
});

const html = `<!DOCTYPE html><p>Hello world</p>`;
const dom = new JSDOM(html, {
    url: "https://www.toutiao.com",
    referrer: "https://example.com/",
    contentType: "text/html",
    resources: resourceLoader,
});


//window = {}
window = global;  //node的全局变量+一些常用函数

const params = {
    location: {
        hash: "",
        host: "www.toutiao.com",
        hostname: "www.toutiao.com",
        href: "https://www.toutiao.com",
        origin: "https://www.toutiao.com",
        pathname: "/",
        port: "",
        protocol: "https:",
        search: "",
    },
    navigator: {
        appCodeName: "Mozilla",
        appName: "Netscape",
        appVersion: "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",
        cookieEnabled: true,
        deviceMemory: 8,
        doNotTrack: null,
        hardwareConcurrency: 4,
        language: "zh-CN",
        languages: ["zh-CN", "zh"],
        maxTouchPoints: 0,
        onLine: true,
        platform: "MacIntel",
        product: "Gecko",
        productSub: "20030107",
        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",
        vendor: "Google Inc.",
        vendorSub: "",
        webdriver: false
    }
};

Object.assign(global,params);//复制


//在下面如果你使用
location.href
navigator.appCodeName
window.location.href
window.appCodeName

注意:在nodejs中默认代码中会有一个global的关键字(全局变量)。

v1 = 123;
console.log(global);

global.v1 = 123
global.v2 = 123
global.navigator = {
    ...
}
console.log(v1,v2);
navigator.userAgent


 

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值