aardio封装库) 微软开源的js引擎(ChakraCore)
前言
做爬虫肯定少不了JavaScript引擎的使用,比如在Python中现在一般用pyexecjs2来执行JavaScript代码,另外还有一些其他执行JavaScript的库:
https://github.com/eight04/node_vm2: rpc调用nodejs,需要安装nodehttps://github.com/eight04/deno_vm: rpc调用deno,需要安装denohttps://github.com/wistn/pyChakraCore: 调用ChakraCore.dll
aardio执行js
如果本地安装有nodejs,aardio范例里也有rpc调用node执行JavaScript的例子。
但是rpc调用需要依赖本地的nodejs环境,给别人使用也不方便,需要让人先安装nodejs。而ChakraCore这个微软开源的js引擎可以直接调用dll来实现,不需要额外依赖。所以这篇文章我来封装下aardio下的ChakraCore。
有了js引擎的话,又可以利用JavaScript优秀的库资源来丰富aardio的库。比如加载crypt-js给aardio增加一些加密算法(AES、DES等)。
下载地址
封装好的代码可以到github下载
下载地址:https://github.com/kanadeblisst00/aardio-extlibs
开始封装
仓库地址:https://github.com/chakra-core/ChakraCore
编译dll
仓库给出的编译好的dll文件还是2020年的,但是代码最近一直在更新,所以最好是自己编译一个,防止之前的有bug还没修复到。
根据官方给的文档,下载源码后使用vs2017打开Build下的Chakra.Core.sln,然后改一下编译的架构为x86。右键生成解决方案,一步就过了,没有什么坑(最喜欢编译这种项目了)。

生成的dll文件在Build\VcBuild\bin\x86_release下,只需要ChakraCore.dll这一个文件。
封装思路
封装这个库用了不少时间,基本是参考上面pyChakraCore的代码。就不说具体怎么做的(无非就是参考Python的代码和看github和官方文档吗,碰到不会的在搜索一下),有兴趣的可以自己看看库代码,下面说说怎么使用。
测试这个dll无法使用aardio的内存加载,也就是说打包的时候只能带上这个dll,不能直接打包进exe。
案例
说几个简单使用的案例,因为还没有深度使用,后面想到什么在增加吧
例子1
import console;
import ChakraCore;io.open()var core = ChakraCore();
core.start();console.dump(core.run('(()=>{return Uint8Array.from([1,2,3,4]).buffer;})()'))
console.dump(core.run('(()=>{let a = {"a":1,"b":2};return a;})()'))
console.dump(core.callFunction('pretty', {"a":1,"v":"111"}))
console.dump(core.run('console.log("aaaaa",undefined,null,false,{a:1,b:2},function(){})'))console.pause(true);
例子2
先定义函数再调用
import console;
import ChakraCore;io.open()var core = ChakraCore();
core.start();core.run("function add(a,b){return a+b;}
")
var a = 1;
var b = 2;
console.log("a+b=", core.callFunction("add", a,b))console.pause(true);
例子3
注册aardio函数为JavaScript函数,这里以atob和btoa这两个函数为例,ChakraCore没有自带这两个函数,而浏览器有,所以我们用aardio来实现。我在库代码里已经内置了console.log和setTimeout,有兴趣的可以自己看怎么实现。
import console;
import ChakraCore;
import crypt.bin;
io.open()var core = ChakraCore();
core.start();var btoa = function(ptr_callee, isConstructCall, ptrj_arguments, argumentCount, callbackState){// ptr_callee不知道是什么// isConstructCall表示是不是构造方法// ptrj_arguments是参数的数组// argumentCount是参数的个数// callbackState也不知道是什么var pointerSize = 4;var jStr = ..raw.convert(ptrj_arguments, {ptr p}, pointerSize).p;var aStr = ChakraCore.jValueToString(jStr);var result = crypt.bin.encodeBase64(aStr);var jResult = core.JsCreateString(result,#result,);return jResult;
};var atob = function(ptr_callee, isConstructCall, ptrj_arguments, argumentCount, callbackState){var pointerSize = 4;var jStr = ..raw.convert(ptrj_arguments, {ptr p}, pointerSize).p;var aStr = ChakraCore.jValueToString(jStr);var result = crypt.bin.decodeBase64(aStr);var jResult = core.JsCreateString(result,#result,);return jResult;
}core.registerMethod(btoa, "btoa");
core.registerMethod(atob, "atob");
var result = core.run('btoa("Hello, world")')
console.log("btoa: ", result)
console.log("atob: ", core.callFunction("atob", result))
console.pause(true);
而且比较有意思的是,这样注册的JavaScript函数打印出来的也是function () { [native code] },可惜和浏览器还是有区别,浏览器会加上函数名function btoa() { [native code] }
例子4
调用crypt-js实现下加密AES CBC加密算法
import console;
import ChakraCore;io.open()var core = ChakraCore();
core.start();core.run($"~\lib\ChakraCore\.res\crypto-js.js")var js = /*
let key = CryptoJS.enc.Utf8.parse("1234567890000000");
let iv = CryptoJS.enc.Utf8.parse("1234567890000000");let s = "Hello World";
let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(s), key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7
});var eData = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
console.log("加密字符串: ", eData);let decrypted = CryptoJS.AES.decrypt(eData,key, { iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7
});
let dData= decrypted.toString(CryptoJS.enc.Utf8).toString();
console.log("解密字符串: ", dData);
*/core.run(js)
console.pause(true);相关文章:
aardio封装库) 微软开源的js引擎(ChakraCore)
前言 做爬虫肯定少不了JavaScript引擎的使用,比如在Python中现在一般用pyexecjs2来执行JavaScript代码,另外还有一些其他执行JavaScript的库: https://github.com/eight04/node_vm2: rpc调用nodejs,需要安装nodehttps://github.…...
LeetCode-hot100题解—Day6
原题链接:力扣热题-HOT100 我把刷题的顺序调整了一下,所以可以根据题号进行参考,题号和力扣上时对应的,那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…...
【Linux】gcc/g++的使用
🎉博主首页: 有趣的中国人 🎉专栏首页: Linux 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解Linux中gcc/g使用的相关内容。 如果看到最后您觉得这篇文章写得不错…...
2024-5-3学习笔记 虚拟继承原理
目录 原理 总结 前面提到过,解决菱形继承产生的数据二义性问题和数据冗余,就需要用到虚拟继承,关于它是如何解决的,我们来一起研究。 class Person { public :string _name ; // 姓名 }; class Student : virtual public Perso…...
C语言什么是“野指针”?
一、问题 “野指针”是⼀个⽐较陌⽣的术语,那么它到底是什么呢? 二、解答 当程序⾥声明了⼀个指针⽽又没有给这个指针赋值,使其指向⼀个地址时,这样的指针就称为“野指针”。 “野指针”会随意地指向⼀个地址。当对这个指针进⾏操…...
LeetCode--所有质数、质数对
1.0 Q: 输出 100 以内所有质数 1.1 /* 第一层循环控制检查到哪个数* 第二层通过遍历除以每个比他小的数的方式,检查每个数是不是质数* 由于要遍历检查,设置一个标记,只要任意一次循环可以整除,我们就设置该标记为不是质数 */boolean isPrime true;for (int i 2; i < 100…...
JavaScript异步编程——05-回调函数
我们在前面的文章《JavaScript 基础:异步编程/单线程和异步》中讲过,Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时,⼤部分情况都是通过回调函数来进⾏。 (如果你还不了解单线程和异步的概念,可以先去回顾上一…...
JAVA基础之jsp标准标签
jsp动作标签实现实例化一个实体类 <jsp:useBean id"标识符" class"java类名" scope"作用范围"> 传统的java方式实例化一个实体类 Users user new Users(); <%%> id: 对象名 * class:类 创建对象时,完全限定名(包名…...
VM16激活码以及连接centos7过慢的问题
一、激活码 任选一个,直到能用为止 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 FA1M0-89YE3-081TQ-AFNX9-NKUC0 二-连接centos7过慢的问题 先备份/etc/ssh/sshd_config,备份命令为 cp /etc/ssh/sshd_config /etc/…...
MySQL 迁移到 Oracle 需要注意的问题
MySQL /Oracle 常见问题 1. VARCHAR/VARCHAR2/NVARCHAR 差异: MySQL 的 VARCHAR 是以字符为单位计算的,Oracle 的 VARCHAR 是 以字节为单位计算的,所以对中文的存储 Oracle 是 MySQL 的 2 倍 (GBK)和 3 倍(UTF8) 2. NULL 差异 A. MySQL…...
【数字经济】上市公司供应链数字化数据(2000-2022)
数据来源: 时间跨度:2000-2022年 数据范围:各上市企业 数据指标: 样例数据: 参考文献:[1]刘海建,胡化广,张树山,等.供应链数字化的绿色创新效应[J].财经研究,2023,49(03):4-18. 下载链接:https:…...
通过AOP实现项目中业务服务降级功能
最近项目中需要增强系统的可靠性,比如某远程服务宕机或者网络抖动引起服务不可用,需要从本地或者其它地方获取业务数据,保证业务的连续稳定性等等。这里简单记录下业务实现,主要我们项目中调用远程接口失败时,需要从本…...
LeetCode:盛最多水的容器
文章收录于LeetCode专栏 盛最多水的容器 给你n个非负整数a1,a2,…,an,每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线,垂直线i的两个端点分别为(i, ai) 和 (i, 0)。找出其中的两条线,使得它们与…...
阿里云 OSS桶对象存储攻防
目录 Bucket权限配置错误-公开访问 Bucket桶爆破 特定的Bucket策略配置 Bucket Object遍历...
外网禅道配置
exportfs -avrf 修改代码,避免启动太慢:vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop...
MM模块学习一(供应商创建,物料类型的定义及功能)
物料管理流程: 源头:采购需求->采购申请 MRP:物料需求计划。运行物料需求计划的结果,根据物料的性质来判断是外购(采购申请)或者是生产(计划订单->生产订单)。 采购申请&am…...
玩comfyui踩过的坑之使用ComfyUI_Custom_NODES_ALEKPET翻译组件问题
环境: 秋叶安装包,安装ComfyUI_Custom_NODES_ALEKPET组件或者直接下载网盘中的包,直接解压包到comfyui根目录/custom_nodes/,重启后,按指导文件操作。 注意:网盘指导包中有配置好的流程json文件࿰…...
(类)偏特化Partial Specialization
当编写一个模板特化,涉及部分但不是全部模板参数时,它被称为偏特化(Partial Specialization)。【注意,偏特化是针对类模板而言,函数模板不可偏特化,只能全特化】 偏特化是C模板编程中的一种技术…...
TypeScript 基础学习笔记:interface 与 type 的异同
🔥 个人主页:空白诗 文章目录 TypeScript 学习笔记:interface 与 type 的异同🎣 引言🚀 快速入门1️⃣ Interface(接口)📋 定义🤝 实现💡 特点 2️⃣ Type Al…...
【管理咨询宝藏95】SRM采购平台建设内部培训方案
本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏95】SRM采购平台建设内部培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 重点是建设一个适应战略采…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
