execjs的学习

article/2025/9/11 1:10:49

execjs的学习

1.基本使用
pip install pyExecJs #安装模块
apt-get install nodejs # execjs模块基于node运行的,(此方式是在Linux中使用 windows请安装node包)import execjs
js="""
// 函数
function getnow(){var timestamp=new Date().getTime();return timestamp;
}
// 变量
var name="12353454";
"""# 通过compile命令转成一个js对象
execjs.compile(js) #第二个参数cwd可以传入环境
# 调用function方法
res = docjs.call('getnow')
print(res)
# 调用变量方法
res = docjs.eval('name')
print(res)

2.记一次错误调用解决

import execjsdef generate_visitor_id():js = '''const jsdom = require("jsdom");const { JSDOM } = jsdom;const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);window = dom.window;document = window.document;function r(){function t(){return n?15&n[e++]:16*Math.random()|0}var n=null,e=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(n=r.getRandomValues(new Uint8Array(31)));for(var o,i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",a="",s=0;s<i.length;s++)o=i[s],"x"===o?a+=t().toString(16):"y"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}'''p = execjs.compile(js)return p.call('r')if __name__ == '__main__':vid = generate_visitor_id()print(vid)
2.记一次分析js
事故1:

python运行execjs中出现编码问题

报错如下

“”"
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 41: illegal multibyte sequence
“”"
解决方法:

原因是有一个程序在使用TextIOWrapper 类创建对象时默认使用了cp936的编码,也就是gbk编码,读取不了utf-8的字符,
所以我们可以修改下 subprocess.py 文件的默认编码方式为utf-8即可在代码行656有个初始化,直接修改默认即可,如下

在这里插入图片描述

事故2:

报错如下:

execjs._exceptions.ProgramError: Error: Cannot find module ‘jsdom’

因为在node里也是只能运行js语法,window 和 document等对象是没有的但是node有个库jsdom可以生成对应环境

https://www.npmjs.com/package/jsdom

解决方案如下:

全局安装命令
npm i jsdom -g然后js中写入
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
放入运行函数在全局安装jsdom后,在node里按上面的写法是没有问题的,但是我们要在python中使用的话,不能在全局安装
如果在全局安装,使用时会报如下错误,说找不到jsdom
execjs._exceptions.ProgramError: Error: Cannot find module 'jsdom'
解决办法有两种
1.就是在python执行文件所在的运行目录下,使用npm安装jsdom
2. 使用cwd参数,指定模块的所在目录,比如,我们在全局安装的jsdom,在cmd里通过npm root -g 可以查看全局模块安装路径: C:\Users\Lenovo\AppData\Local\node-v12.16.1-win-x64\node-global\node_modules
完整代码如下
import execjsdef generate_visitor_id():js = '''const jsdom = require("jsdom");const { JSDOM } = jsdom;const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);window = dom.window;document = window.document;function r(){function t(){return n?15&n[e++]:16*Math.random()|0}var n=null,e=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(n=r.getRandomValues(new Uint8Array(31)));for(var o,i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",a="",s=0;s<i.length;s++)o=i[s],"x"===o?a+=t().toString(16):"y"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}'''p = execjs.compile(js,cwd=r"C:\Users\Lenovo\AppData\Local\node-v12.16.1-win-x64\node-global\node_modules")return p.call('r')if __name__ == '__main__':vid = generate_visitor_id()print(vid)

参考链接:

https://www.cnblogs.com/huchong/p/11044238.html

https://blog.csdn.net/qq_37619987/article/details/104184340


http://chatgpt.dhexx.cn/article/sLIEKxTh.shtml

相关文章

python3调用js的库之execjs

针对现在大部分的网站都是使用js加密&#xff0c;js加载的&#xff0c;并不能直接抓取出来&#xff0c;这时候就不得不适用一些三方类库来执行js语句 执行JS的类库&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node 这里主要讲一下execjs&#xff0c;一…

java基础知识复习(上半)

java基础知识复习 java为什么被发明&#xff1f; Green项目的确立&#xff0c;应用于像电视盒一样的消费类电子产品&#xff0c;语言本身本身中立。java的三大版本&#xff1f; javaSE的定位在于客户端&#xff0c;只要用于桌面应用软件的编程。 javaME的定位在于嵌入式系统…

go学习笔记接口部分

Go学习笔记 接口接口定义方法练习 11.1 simple_interface.go&#xff1a;练习 11.2 interfaces_poly2.go&#xff1a; 接口嵌套接口如何判断接口类型方法一varI.(T)方法二type-switch练习 11.4 simple_interface2.go&#xff1a; 测试一个值是否实现了某个接口接口方法设计的注…

多设备monkey测试工具_基于Tkinter GUI操作

V1.0版本 先看下效果吧&#xff1a; 简单的介绍下&#xff1a; 1.设备列表区域&#xff1a;用于展示当前连接的所有设备 2.monkey参数区域&#xff1a;用于显示即将执行的monkey参数 3.日志区域&#xff1a;用于显示必要日志&#xff08;其实没啥卵用&#xff0c;就是看着高…

Python日常小技巧(持续更新中)

目录 快速定位元组内容对字典进行排序json的获取(dumps,dump,loads,load)查找字典中相同的key统计列表中元素的个数字典按输入顺序输出历史记录的存储对有多个分割符的字符串进行分割对文件中的时间格式进行转换 字符串的居中&#xff0c;左右对齐列表并行/串行计算字符串判断是…

Flink 学习三 Flink 流 process function API

Flink 学习三 Flink 流&process function API 1.Flink 多流操作 1.1.split 分流 (deprecated) 把一个数据流根据数据分成多个数据流 1.2 版本后移除 1.2.分流操作 (使用侧流输出) public class _02_SplitStream {public static void main(String[] args) throws Excep…

基于Unity3D实现的牙医病人小游戏【100011407】

1 总体设计 1&#xff09;基本技术路线 运用面向对象的设计理念&#xff0c;设计了病人类&#xff0c;牙医类&#xff0c;候诊椅类&#xff0c;诊疗椅类等&#xff0c;通过对这些类的封装&#xff0c;创立各个类的对象&#xff0c;并调用类的成员函数。 2&#xff09;总体结…

Java IO,BIO、NIO、AIO

操作系统中的 I/O 以上是 Java 对操作系统的各种 IO 模型的封装&#xff0c;【文件的输入、输出】在文件处理时&#xff0c;其实依赖操作系统层面的 IO 操作实现的。【把磁盘的数据读到内存种】操作系统中的 IO 有 5 种&#xff1a; 阻塞、 非阻塞、【轮询】 异步、 IO复…

TensorFlow2.0学习笔记-3.模型训练

3.模型训练 3.1.Keras版本模型训练 • 构建模型&#xff08;顺序模型、函数式模型、子类模型&#xff09; • 模型训练&#xff1a; model.fit() • 模型验证&#xff1a; model.evaluate() • 模型预测&#xff1a; model.predict() • 使用样本加权和类别加权 回调函数 •…

sql注入学习

提示&#xff1a;萌新学习路程的记录型文章&#xff0c;有错误的地方欢迎大佬们指正。 文章目录 前言一、SQLi-Labs1、SQLi-Labs下载、安装&#xff08;环境搭建)(1) 首先下载解压并移动sqli-labs(2) 找到sql-connections下的db-creds.inc进行修改(3) 打开网页&#xff1a;http…

从客户端中检测到有潜在危险的 request.form值[解决方法]

当页面编辑或运行提交时,出现“从客户端中检测到有潜在危险的request.form值”问题,该怎么办呢?如下图所示: 下面博主汇总出现这种错误的几种解决方法:问题原因:由于在asp.net中,Request提交时出现有html代码或javascript等字符串时,程序系统会认为其具有潜在危险的值。…

sadadas

dasdasdasdasdasd

python_day3_集合与运算/文件读写、修改详解/字符编码转换/函数和函数式编程(return/参数详解/局部变量与全局变量/递归/高阶函数)

Python_集合与运算/文件读写、修改详解/字符编码详解/函数和函数式编程/函数式编程之参数/局部变量与全局变量/递归/高阶函数 在这里得感谢&#xff0c;老师Alex金角大王(路飞学城IT) Python(给兄弟们挂个&#x1f517;) >_<…因为有的是自己理解&#xff0c;如有错误&a…

svn添加新项目的步骤

1.服务端给一个地址&#xff1a;拉取代码 2.上传代码&#xff08;不含没有module的build文件夹和以下文件夹&#xff09;

项目新添加页面svn上传

你项目当中新添加了页面上传SVN&#xff0c;需要先把新添加的页面Add到SVN上&#xff0c; 右击新添加的页面出现TortoiseSVN — Add&#xff0c;然后上传整个项目就可以了&#xff0c;SVN上就有新添加的页面了。 如下图

Eclipse用SVN上传新项目

首先右击项目–>team --> share project 选择repository为svn–>点击next 使用已有的资源库的位置&#xff0c;如下图所示&#xff1a; 使用项目名称作为文件夹名 --> 点击Finish --> 输入用户名和密码(此步不一定每个人都有)&#xff0c;如下图所示&#xff1a…

IDEA添加新项目到SVN

1.打开IDEA &#xff0c;上面工具栏选择VCS 选择把项目交给SVN管理 2.选择SVN 3、右键项目选择如下 4.点击绿色的号&#xff0c;选择一个SVN仓库的地址&#xff0c;下面可以选择上传到SVN仓库的目录格式&#xff0c;然后点击Share 5.默认1.8 6.右键项目选择-->Subversion--…

项目上传到SVN

步骤1、首先在服务器上安装svn。 步骤2、然后找到svn 选择VisualSVN Server Manager 在Repositories下新建Repository name 步骤3、在MyEclipse中右击项目&#xff0c;Team–>Share Project–>SVN–>创建新的资源位置或使用已有的资源位置&#xff08;最好新建&#…

idea上传新项目至svn仓库

linux下安装svn服务器&#xff0c;idea上传新项目 linux下安装svn服务器,配置svn仓库 就不写了,百度一大把 导入项目: 点击号 linux下svn://开头,输入svn服务器创建的仓库地址,也可连接http:// 输入svn仓库配置的账号.密码 导入

Eclipse中SVN上传项目

上传新项目到SVN服务器 选中你要上传的项目&#xff0c;右键-->Team-->Share Project&#xff0c;选中SVN-->Next。 前提是已经安装SVN插件&#xff1a;https://blog.csdn.net/weixin_44306005/article/details/95487732 如图所示进行下一步操作&#xff1a; 如图所…