当前位置: 首页 > news >正文

aardio封装库) 微软开源的js引擎(ChakraCore)

前言

做爬虫肯定少不了JavaScript引擎的使用,比如在Python中现在一般用pyexecjs2来执行JavaScript代码,另外还有一些其他执行JavaScript的库:

  • https://github.com/eight04/node_vm2: rpc调用nodejs,需要安装node
  • https://github.com/eight04/deno_vm: rpc调用deno,需要安装deno
  • https://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函数,这里以atobbtoa这两个函数为例,ChakraCore没有自带这两个函数,而浏览器有,所以我们用aardio来实现。我在库代码里已经内置了console.logsetTimeout,有兴趣的可以自己看怎么实现。

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 基础&#xff1a;异步编程/单线程和异步》中讲过&#xff0c;Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时&#xff0c;⼤部分情况都是通过回调函数来进⾏。 &#xff08;如果你还不了解单线程和异步的概念&#xff0c;可以先去回顾上一…...

JAVA基础之jsp标准标签

jsp动作标签实现实例化一个实体类 <jsp:useBean id"标识符" class"java类名" scope"作用范围"> 传统的java方式实例化一个实体类 Users user new Users(); <%%> id: 对象名 * class:类 创建对象时,完全限定名(包名…...

VM16激活码以及连接centos7过慢的问题

一、激活码 任选一个&#xff0c;直到能用为止 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 差异&#xff1a; MySQL 的 VARCHAR 是以字符为单位计算的&#xff0c;Oracle 的 VARCHAR 是 以字节为单位计算的&#xff0c;所以对中文的存储 Oracle 是 MySQL 的 2 倍 (GBK)和 3 倍(UTF8) 2. NULL 差异 A. MySQL…...

【数字经济】上市公司供应链数字化数据(2000-2022)

数据来源&#xff1a; 时间跨度&#xff1a;2000-2022年 数据范围&#xff1a;各上市企业 数据指标&#xff1a; 样例数据&#xff1a; 参考文献&#xff1a;[1]刘海建,胡化广,张树山,等.供应链数字化的绿色创新效应[J].财经研究,2023,49(03):4-18. 下载链接&#xff1a;https:…...

通过AOP实现项目中业务服务降级功能

最近项目中需要增强系统的可靠性&#xff0c;比如某远程服务宕机或者网络抖动引起服务不可用&#xff0c;需要从本地或者其它地方获取业务数据&#xff0c;保证业务的连续稳定性等等。这里简单记录下业务实现&#xff0c;主要我们项目中调用远程接口失败时&#xff0c;需要从本…...

LeetCode:盛最多水的容器

文章收录于LeetCode专栏 盛最多水的容器 给你n个非负整数a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线i的两个端点分别为(i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与…...

阿里云 OSS桶对象存储攻防

目录 Bucket权限配置错误-公开访问 Bucket桶爆破 特定的Bucket策略配置 Bucket Object遍历...

外网禅道配置

exportfs -avrf 修改代码&#xff0c;避免启动太慢&#xff1a;vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop...

MM模块学习一(供应商创建,物料类型的定义及功能)

物料管理流程&#xff1a; 源头&#xff1a;采购需求->采购申请 MRP&#xff1a;物料需求计划。运行物料需求计划的结果&#xff0c;根据物料的性质来判断是外购&#xff08;采购申请&#xff09;或者是生产&#xff08;计划订单->生产订单&#xff09;。 采购申请&am…...

玩comfyui踩过的坑之使用ComfyUI_Custom_NODES_ALEKPET翻译组件问题

环境&#xff1a; 秋叶安装包&#xff0c;安装ComfyUI_Custom_NODES_ALEKPET组件或者直接下载网盘中的包&#xff0c;直接解压包到comfyui根目录/custom_nodes/&#xff0c;重启后&#xff0c;按指导文件操作。 注意&#xff1a;网盘指导包中有配置好的流程json文件&#xff0…...

(类)偏特化Partial Specialization

当编写一个模板特化&#xff0c;涉及部分但不是全部模板参数时&#xff0c;它被称为偏特化&#xff08;Partial Specialization&#xff09;。【注意&#xff0c;偏特化是针对类模板而言&#xff0c;函数模板不可偏特化&#xff0c;只能全特化】 偏特化是C模板编程中的一种技术…...

TypeScript 基础学习笔记:interface 与 type 的异同

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 TypeScript 学习笔记&#xff1a;interface 与 type 的异同&#x1f3a3; 引言&#x1f680; 快速入门1️⃣ Interface&#xff08;接口&#xff09;&#x1f4cb; 定义&#x1f91d; 实现&#x1f4a1; 特点 2️⃣ Type Al…...

【管理咨询宝藏95】SRM采购平台建设内部培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏95】SRM采购平台建设内部培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 重点是建设一个适应战略采…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...