在用python执行js代码时,突然遇到一个问题,execjs怎么才能正常调用js的第三方库使用js内置方法

当时我也是查了好多资料才解决的,截至我写这篇文章,网上的解决方法几乎搜不到,全都是execjs的使用方法,所以记录一下给大家分享出来

作为一个入门的爬虫工程师,经常会遇到破解js的情况
对于一些Python实现起来比较麻烦的js代码(其实就是懒),当然会借助execjs来执行js代码

先说一下解决方案吧
简单来说就是指定一下node_modules路径,然后记得js库要全局安装

ctx = execjs.compile(js,cwd=r"/usr/local/node-v10.15.1/lib/node_modules")

查看nodejs中module位置的方法

npm root -g

其实看到这里,问题已经解决了,如果我说的还算清楚,到这里看官已经可以关闭窗口继续工作了,下面是例子

简单说一下问题,遇到一小段加密算法,截取出来如下图

将这段代码改写,先测试这段代码是否能够得到我需要的结果,代码如下

const h = require('crypto-js');
var p = {stringify: function(b) {var e = h.enc.Hex.parse(b.salt.toString()).toString(h.enc.Latin1);b = b.ciphertext.toString(h.enc.Latin1);return h.enc.Latin1.parse("_zyxsm__" + e + b).toString(h.enc.Base64)},parse: function(b) {b = h.enc.Base64.parse(b).toString(h.enc.Latin1);if ("_zyxsm__" !== b.substr(0, 8))throw Error("Error parsing salt");var e = b.substr(8, 8);b = b.substr(16);return h.lib.CipherParams.create({ciphertext: h.enc.Latin1.parse(b),salt: h.enc.Latin1.parse(e)})}
};
q = {encrypt: function(b, e) {return h.AES.encrypt(b, e, {format: p}).toString()},decrypt: function(b, e) {return h.AES.decrypt(b, e, {format: p}).toString(h.enc.Utf8)}
};enstr = q.encrypt("HelloWorld","yiyun369scm");
console.log(enstr);
destr = q.decrypt("X3p5eHNtX1+z+VHnazVA9JQG4KWUVTU3on/G8SqdlU4=","yiyun369scm");
console.log(destr);

简单改一下,改写成能在python中运行的代码

const h = require('crypto-js');
var p = {stringify: function(b) {var e = h.enc.Hex.parse(b.salt.toString()).toString(h.enc.Latin1);b = b.ciphertext.toString(h.enc.Latin1);return h.enc.Latin1.parse("_zyxsm__" + e + b).toString(h.enc.Base64)},parse: function(b) {b = h.enc.Base64.parse(b).toString(h.enc.Latin1);if ("_zyxsm__" !== b.substr(0, 8))throw Error("Error parsing salt");var e = b.substr(8, 8);b = b.substr(16);return h.lib.CipherParams.create({ciphertext: h.enc.Latin1.parse(b),salt: h.enc.Latin1.parse(e)})}
};encrypt = function(b, e) {return h.AES.encrypt(b, e, {format: p}).toString()
};
decrypt = function(b, e) {return h.AES.decrypt(b, e, {format: p}).toString(h.enc.Utf8)
};

这时候使用execjs执行发现报错

execjs._exceptions.ProgramError: Error: Cannot find module 'crypto-js'

就是找不到指定的库嘛
加上开头的方法就可以解决了

# encoding: utf-8
'''
@author: fengyinws
@contact: fengyinws@163.com
@software: pycharm
@file: excute_js.py
@time: 2019/3/19 10:26
@desc:
'''
import execjs
def execute_js(js):# ctx = execjs.compile(js)ctx = execjs.compile(js, cwd=r"/usr/local/node-v10.15.1/lib/node_modules")res = ctx.call('encrypt', "helloworld", "yiyun369scm")print(res)if __name__ == '__main__':js = """const h = require('crypto-js');
var p = {stringify: function(b) {var e = h.enc.Hex.parse(b.salt.toString()).toString(h.enc.Latin1);b = b.ciphertext.toString(h.enc.Latin1);return h.enc.Latin1.parse("_zyxsm__" + e + b).toString(h.enc.Base64)},parse: function(b) {b = h.enc.Base64.parse(b).toString(h.enc.Latin1);if ("_zyxsm__" !== b.substr(0, 8))throw Error("Error parsing salt");var e = b.substr(8, 8);b = b.substr(16);return h.lib.CipherParams.create({ciphertext: h.enc.Latin1.parse(b),salt: h.enc.Latin1.parse(e)})}
};encrypt = function(b, e) {return h.AES.encrypt(b, e, {format: p}).toString()
};
decrypt = function(b, e) {return h.AES.decrypt(b, e, {format: p}).toString(h.enc.Utf8)
};
"""execute_js(js)

到这里我们就可以正常使用了

execjs调用第三方js库相关推荐

  1. Android如何调用第三方SO库

    问题描述:Android如何调用第三方SO库: 已知条件: SO库为Android版本连接库(*.so文件),并提供了详细的接口说明: 已了解解决方案: 1.将SO文件直接放到libs/armeabi ...

  2. 如何在VC中调用第三方lib库(step by step)

    我们以调用Kvaser的库文件为例. 第三方的库一般会提供两个文件,一个是库文件.一个是头文件. Kvaser的库文件为canlib32.lib . 头文件为canlib.h 该库文件里,提供了一个名 ...

  3. Cloud for Customer里的使用的一个第三方js库,用于gzip处理

    可以从Chrome开发者工具里观察到这个第三方js文件的加载和内容: [外链图片转存失败(img-b2u1ArC4-1566695025554)(https://upload-images.jians ...

  4. Vue引入第三方js库

    情况一:无法通过npm install安装包引入 方法一:在index.html中引用script 直接在index.html中引用script,任何时候皆可用!! 注意:第三方js必须放在stati ...

  5. Python 使用execjs调用网页js 进行数据加密

    最近做一个数据采集项目的时候需要自动采集网站的招投标数据 ,随便打开一个网站 打开开发者模式,输入关键词,点击搜索,获得以下内容 可以看到请求链接和请求类型,请求类型Content-Type:是app ...

  6. Android NDK开发: 通过C/C++调用第三方so库

    文章目录 一.编写so库代码 二.安装Android NDK 三.编译so库 3.1 编辑Android.mk 3.2 编辑Application.mk 3.3 编译 四.集成到Android工程中 ...

  7. C C++ 调用第三方DLL库失败 LoadLibrary 返回NULL 并报 126 错误 解决办法

    在之前有写关于生成dll文件以及调用dll的方法:https://blog.csdn.net/Hilaph/article/details/104917856 而在vs2019新开一个项目并运行调用相 ...

  8. windows和android调用第三方C++库(静态库lib、动态库dll)

     官方wiki C++调用静态库StaticLibrary(lib) Linking Static Libraries https://wiki.unrealengine.com/Linking_St ...

  9. Vue 项目中引入本地第三方 JS 库

    一.在 inde.html 中使用 script 标签来引入 1.直接引入,全局可用 ESLint 语法检测会报错:'$' is not define // index.html<script ...

最新文章

  1. php httphelper,C#的HttpHelper类post ,get
  2. [Python web开发] Web框架开发基础 (一)
  3. Java 8中字符串拼接新姿势:StringJoiner
  4. 100级大橙武升级流程_DNF:女气功升级100级无暇手套,前后伤害对比。
  5. flask+uwsgi+supervisor+nginx在局域网服务器上部署实践
  6. JavaScript(三)—— JavaScript 函数/JavaScript 作用域/JavaScript 预解析/JavaScript 对象
  7. 删除某个路径下的文件夹
  8. c语言遍历文件内容_C/C++编程笔记:C语言开发电脑益智游戏【扫雷】(源代码分享)...
  9. 最近参加一个公司的入职培训
  10. oraccle 索引管理
  11. 金融账务体系业务知识——汇总
  12. linux cpu load命令,Linux性能检测常用的10个基本命令
  13. 【数据结构试验】树的基本操作
  14. 关于idea链接oracle数据库出现[08006][17002] IO 错误: Got minus one from a read call, connect lapse 1 ms., Authen
  15. WinCC7.5 笔记3-用表格和趋势图显示温度变化和风扇运转(变量记录)
  16. OSChina 周三乱弹 —— 我居然在 osc 里追剧
  17. Android应用程序中的DVM和Linux中进程的区别
  18. 501 -- Introduction to Unsupervised Method
  19. linux 程序结构,Objective-C 基本的程序结构
  20. 图像去燥——TV Loss

热门文章

  1. mac 爱普生打印机驱动_爱普生l201打印机驱动下载Mac版-爱普生L201驱动Mac版下载 V8.7.5-PC6苹果网...
  2. 后台管理系统Login 页面(部分)
  3. MATLAB利用仿射变换实现图像的缩放,旋转,剪切,平移操作
  4. 小白从零开始搭建阿里云服务器
  5. 苏州职业大学计算机考试成绩查询系统,苏州工业园区职业技术学院教务管理系统登录入口、成绩查询网上选课查分...
  6. 利用Flash制作一个可以自由拨动的时钟模具
  7. C# 发送邮件方法2
  8. 计算机视觉知识点之RCNN/Fast RCNN/Faster RCNN
  9. 栈与堆的区别(内存分配与数据结构)
  10. 用js代码实现四位验证码