本帖最后由 helian147 于 2021-10-31 16:25 编辑
【我只是一个搬运工,有出处的会注明出处,未注明的那是找不到出处了】
一、python调用node.js执行js文件
1、node.js
http://nodejs.cn/learn/nodejs-accept-arguments-from-the-command-line
node获取参数值的方法是使用 Node.js 中内置的 process 对象。
process.argv属性是一个包含所有命令行调用参数的数组:第一个参数node命令完整路径。第二个参数是正被执行文件完整路径。所有其他参数从第三个位置开始。
可以使用循环迭代所有的参数(包括 node.js 路径和文件路径)
[JavaScript] 纯文本查看 复制代码 process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`)
})
也可以通过创建一个排除了前两个参数的新数组来仅获取其他的参数
[JavaScript] 纯文本查看 复制代码 const args = process.argv.slice(2);
console.log(x(args[0]));
以下是由node.js的process衍生的具体方式。
2、python的subprocess模块check_output函数
示例,一个入参时:
[Python] 纯文本查看 复制代码 from subprocess import check_output
js_open = check_output(['node', r'new.js', str_wzws], timeout=100)
url_path = js_open.decode('utf8').strip()
new.js
[JavaScript] 纯文本查看 复制代码 var args = process.argv.splice(2);
console.log(x(args[0]));
示例,两个入参时:
[Python] 纯文本查看 复制代码 from subprocess import check_output
js_open = check_output(['node', r'new.js', '3', '6'], timeout=100)
new.js
[JavaScript] 纯文本查看 复制代码 var args = process.argv.splice(2);
console.log(add(parseInt(args[0]), parseInt(args[1])));
示例,python代码内直接调用js代码的指定函数时:
[Python] 纯文本查看 复制代码 from subprocess import check_output
JSCode = r'''
function add(x, y) {
return x + y;
}
function sub(x, y) {
return x - y;
}
function foo(x) {
return x;
}
'''
def test():
jscode = JSCode + 'process.stdout.write(add(3, 2).toString())'
rtn = check_output('node', input=jscode, universal_newlines=True, timeout=100)
print(rtn)
if __name__ == '__main__':
test()
3、python的os.system函数
示例:
[Python] 纯文本查看 复制代码 import os
path = r'd:\\'
os.chdir(path)
os.system('node new.js"')
new.js 无入参
[JavaScript] 纯文本查看 复制代码 ccc = _0xcff1b8("WZWS_CONFIRM_PREFIX_LABEL14947589");
console.log(ccc);
示例:
[Python] 纯文本查看 复制代码 import os
path = r'd:\\'
os.chdir(path)
arg1 = "WZWS_CONFIRM_PREFIX_LABEL3049479"
os.system('node new.js %s' %(arg1))
new.js 有入参:
[JavaScript] 纯文本查看 复制代码 var args = process.argv.splice(2);
console.log(_0xcff1b8(args[0]));
4、python的os.popen函数
os.popen(command[, mode[, bufsize]])
command :使用的命令
mode :模式权限可以是 'r'(默认) 或 'w'。
bufsize :文件缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。
负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。
返回值:文件描述符号为fd的打开的文件对象
示例:
[Python] 纯文本查看 复制代码 import os
# test.js 待执行的JS的文件
# %s %s 传递给JS文件的参数
a = os.popen('node test.js %s %s' % (1, 2))
b = a.read()
print(b)
示例:
[Python] 纯文本查看 复制代码 import os
path = r'd:\\'
os.chdir(path)
arg1 = "WZWS_CONFIRM_PREFIX_LABEL3049479"
a = os.popen('node new.js %s' %(arg1))
print(a.read().strip())
new.js
[JavaScript] 纯文本查看 复制代码 var args = process.argv.splice(2);
console.log(_0xcff1b8(args[0]));
例子:https://www.52pojie.cn/thread-1450900-1-1.html
attakids 为js文件名, 后面2个入参
[Python] 纯文本查看 复制代码 import os
nodejs = os.popen('node attakids DECODE ' + enc_url + ' ' + hashlib.md5((Host + Token).encode()).hexdigest())
dec_url = nodejs.read().replace('\n', '')
nodejs.close()
二、python使用pyexejs模块执行js文件
pyexecjs调用/但已不再维护。
1、安装
[Shell] 纯文本查看 复制代码 pip install pyexecjs
2、调用js代码
示例:
[Python] 纯文本查看 复制代码 import execjs
jstext = """
...: function hello(str){return str;}
...: """
ctx = execjs.compile(jstext)
a = ctx.call("hello", "hello aiyc")
print(a)
call()第一个参数是调用js中的函数名,也就是hello。后面aiyc就是参数,也就是js中需要传入到str的参数。
如果js中存在多个参数,就直接在后面打个逗号,然后接着写下一个参数。
3、调用js文件
[Python] 纯文本查看 复制代码 from pprint import pprint
import execjs
import pathlib
import os
js_path = pathlib.Path(os.path.abspath(os.path.dirname(__file__)))
js_path = js_path / "crypto.js"
with js_path.open('r', encoding="utf-8") as f:
script = f.read() # 读取 js 文件
c = "1234"
# 传入python中的变量
add = ('''
aesEncrypt = function() {
result={}
var t = CryptoJS.MD5("login.xxx.com"),
i = CryptoJS.enc.Utf8.parse(t),
r = CryptoJS.enc.Utf8.parse("1234567812345678"),
u = CryptoJS.AES.encrypt(''' + "'{}'".format(c) + ''',i, {
iv: r
});
result.t=t.toString()
result.i =i.toString()
result.r =r.toString()
result.u =u.toString()
return result
};
''')
script = script + add # 拼接JS 代码(add 和 script)
print("script",script)
x = execjs.compile(script)
result = x.call("aesEncrypt") # 调用Call方法执行aesEncrypt函数,return 出来的JS是 object, 也就是 Python 中字典
print(result)
result.t = t.toString()
result.i = i.toString()
reslut.r = r.toString()
result.u = u.toString()
return reslut
通过 format 字符串拼接的形式,将 Python 中的变量,也就是上面的变量 c写入到 js 代码中,从而通过调用 js 函数,在没有参数的情况下修改js代码中的特定变量的值。
调用Call方法执行aesEncrypt函数,return 出来的js是 object, 也就是 Python 中字典。如果需要在Python中拿到object,建议把它转换成一个json字符串,而不是直接把结果return出来。
4、报错
报错:‘gbk’ codec can’t encode character ‘\xa0’
打开js文件时,修改编码:
[Python] 纯文本查看 复制代码 with open(r'dzf.js', 'r', encoding="utf-8") as f:
script = f.read().encode('gb2312', 'ignore').decode('gb2312')
js = execjs.compile(script)
报错:转义错误。
一般都是base64d的代码出现,将\ 改成\\
三、python使用selenium模块执行js文件
selenium调用js,常用于加密参数与window环境联动时。
示例:
[Python] 纯文本查看 复制代码 js = "一段 JS"
result = browser.execute_script(js)
示例:
[Python] 纯文本查看 复制代码 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
def get_text(id,attr):
### 拼接字符串注意{}要写出{{}}
script=("""
let bt=BrowserType();
let id='{id}';
let attr='{attr}';
let supporter =bt.supporter;
const run=function(){{
let all_str = $(id).getAttribute(attr)
let end_index=supporter.length+58
Base64._keyStr = all_str.substring(0, end_index)
let charset = all_str.substring(64, all_str.length)
let encoded = Base64.decode(charset,supporter);
return encoded
}}
return run()
""").format(id=id,attr=attr)
return script
chrome_option = Options()
chrome_option.add_argument("--headless")
chrome_option.add_argument("--disable-gpu")
chrome_option.add_argument('--ignore-certificate-errors') # SSL保存
browser = webdriver.Chrome(options=chrome_option)
wait = WebDriverWait(browser, 10)
# 启动浏览器,获取网页源代码
mainUrl = "http://127.0.0.1:5002/"
browser.get(mainUrl)
result=browser.execute_script(get_text("base64","data"))
print(result)
time.sleep(3)
browser.quit()
js代码:
[JavaScript] 纯文本查看 复制代码 function run(id, attr,supporter) { // run的js源代码
let all_str = $(id).getAttribute(attr)
let end_index = supporter.length+58
Base64._keyStr = all_str.substring(0, end_index)
let charset = all_str.substring(64, all_str.length)
let encoded = Base64.decode(charset,supporter);
$(id).value = encoded;
}
通过 execute_script(get_text("base64","data"))去执行函数,这个函数实际上就是返回一段 JS 代码,就是去模拟构造 run 所需要的一些参数,然后把最终的结果返回回去。
如果里面存在拼接字符串的时候,注意花括号实际上要写两个。
如果需要在后面需要获取 js 返回的值,上面代码需要加上 return 来返回 run 函数的结果。
|