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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1409678.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

25计算机考研院校数据分析 | 同济大学

同济大学(Tongji University),简称“同济”,是中华人民共和国教育部直属,由教育部、国家海洋局和上海市共建的全国重点大学,是历史悠久、享有盛誉的中国著名高等学府,是国家“双一流”、“211工…

kubectl_入门_Pod控制器

Pod控制器 在k8s中,按照pod的创建方式可以将其分为两类 自主式pod:k8s直接创建出来的pod,这种pod删除后就没有了,也不会重建控制器创建的pod:通过控制器创建的pod,这种pod删除了之后还会自动重建 1. 什么…

Ollamallama

Olllama 直接下载ollama程序,安装后可在cmd里直接运行大模型; llama 3 meta 开源的最新llama大模型; 下载运行 1 ollama ollama run llama3 2 github 下载仓库,需要linux环境,windows可使用wsl; 接…

Windows下载MingGW

因为要配置vscode的c/c环境,需要下载一个编译器,gcc官方推荐开源的MingGW-W64,看了几个下载方法,决定用最简单的离线安装。 niXman/mingw-builds-binaries/releases 32位的操作系统:i686,64位的操作系统&a…

【C++】学习笔记——string_3

文章目录 六、string类5. string类的操作6. string类的转换7. string类的模拟实现 未完待续 搭配文档食用 六、string类 5. string类的操作 上面的函数中,有些是不常用的,咱们只挑几个重要的进行讲解。 c_str 就是将字符串转换成 C语言 字符串的格式。…

java+jsp+Oracle+Tomcat 记账管理系统论文(二)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

微软如何打造数字零售力航母系列科普06 - 如何使用微软的Copilot人工智能

如何使用微软的Copilot人工智能? Copilot和ChatGPT有很多相似之处,但微软的聊天机器人本身就有一定的优势。以下是如何对其进行旋转,并查看其最引人注目的功能。 ​​​​​​​ (资料来源:Lance Whitney/微软&…

吴恩达2022机器学习专项课程(一)8.2 解决过拟合

目录 解决过拟合(一):增加数据解决过拟合(二):减少特征特征选择缺点 解决过拟合(三):正则化总结 解决过拟合(一):增加数据 收集更多训…

openKylin 2.0 Alpha2 X86 安装教程

原文链接:openKylin 2.0 Alpha2 X86 安装教程 Hello,大家好啊!今天我们将讨论如何在VMware Workstation上安装openKylin 2.0 Alpha2 X86版。openKylin是一个基于Linux的操作系统,旨在提供高性能、可靠性强的系统体验。在虚拟化软件…

【16-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

C++ 模拟实现 priority_queue(优先队列)

目录 一,优先队列简介 二,priority_queue 的内部实现原理 三,模拟实现 priority_queue 1,模板参数与数据结构 2,构造 3,辅助功能(堆的有序化,建立堆) 4&#xff0…

202012青少年软件编程(Python)等级考试试卷(一级)

第 1 题 【单选题】 运行下方代码段,输出是6,则输入的可能是( )。 a eval(input())print(a)A :8%2 B :8/2 C :3*2 D :3**2 正确答案:C 试题解析: 第 2 题 【单选题】 关于Python变量,下列叙述正确的是&#x…

【智能算法】鹦鹉优化算法(WO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2024年,J Lian等人受到鹦鹉学习行为启发,提出了鹦鹉优化算法(Parrot Optimizer, PO)。 2.算法原理 2.1算法思想 PO灵感来自于在驯养的鹦鹉中观察到的…

八皇后问题-使用递归回溯方法用c语言实现

学习的视频&#xff1a;懒猫老师 https://www.bilibili.com/video/BV1wJ411U7Gy/?spm_id_from333.337.search-card.all.click&vd_sourceda60f9e1bc3321cae28c29fe80e9b078 代码&#xff1a; 编译&#xff1a;gcc test.c -g #include <stdio.h> #include<st…

【openLooKeng集成Hive连接器完整过程】

【openLooKeng集成Hive连接器完整过程】 一、摘要二、正文2.1 环境说明2.2 Hadoop安装2.2.1. 准备工作2.2.2 在协调节点coordinator上进行安装hadoop2.2.3、将Hadoop安装目录分发到从节点worker2.2.4、在协调节点coordinator上启动hadoop集群2.3 MySQL安装2.4 Hive安装及基本操…

数据结构算法——链表带环问题——数学深度解析

前言:本节内容主要是讲解链表的两个问题 &#xff1a;1、判断链表是否带环&#xff1b; 2、一个链表有环&#xff0c; 找到环的入口点。 本节内容适合正在学习链表或者链表基础薄弱的友友们哦。 我们先将问题抛出来&#xff0c;友友们可以自己去力扣或者牛客网去找相应题目&…

el-tabs作为子组件使用页面空白

文章目录 前言一、问题展示二、源码分析三、解决方案 前言 如果el-tabs是子组件&#xff0c;父组件传值value / v-model为空字符&#xff0c;这个时候在watch中监听value / v-model就会发现监听的数据会被调用为‘0’。一定是作为子组件引用&#xff0c;且在watch进行监听&…

【Java探索之旅】包管理精粹 Java中包的概念与实践

文章目录 &#x1f4d1;前言一、封装1.1 封装的概念1.2 访问限定修饰符 二、封装扩展&#xff08;包&#xff09;2.1 包的概念2.2 带入包中的类2.3 自定义包2.4 常见的包 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;封装是面向对象编程的核心概念之一…

令牌技术详解

1. 问题引出 之前我们讲 Cookie 和 Session 时提到过一个用户登录的场景&#xff1a;当用户登录时&#xff0c;服务器端可以把用户的登录信息存在Session中 并返回给客户端对应的SessionID&#xff0c;客户端会把这个SessionID存在Cookie 中当下次访问该服务器时&#xff0c;…

【C语言/数据结构】经典链表OJ习题~第二期——链中寻环

&#x1f388;&#x1f388;&#x1f388;欢迎采访小残风的博客主页&#xff1a;残风也想永存-CSDN博客&#x1f388;&#x1f388;&#x1f388; &#x1f388;&#x1f388;&#x1f388;本人码云 链接&#xff1a;残风也想永存 (FSRMWK) - Gitee.com&#x1f388;&#x1f…