今天用execjs调用JS时,发现报错execjs._exceptions.ProgramError: ReferenceError: document is not defined
如图:
错误类型:文档对象未定义,解决方法,定义对象即可,习惯性定义变量嘛
var document ;?
emmmmmmmmmmmmmmm....不行的,继续报错
execjs._exceptions.ProgramError: TypeError: Cannot read property 'createElement' of undefined
若是报错:execjs._exceptions.ProgramError: ReferenceError: window is not defined。就不用说了,直接定义windows对象是可以解决的。
网上查了一堆,说正确的解决方法是(虽然不行)...下面这样:
项目路径下执行 npm命令安装jsdom
npm install jsdom
这是因为execjs除了nodejs,
还需要浏览器环境,浏览器上还需要document
以及window
对象,所以我们要还要安装环境
在执行JS代码前面加上
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`Hello world
`);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;
同时将执行的代码改为
#js_obj = execjs.compile(js_codex)修改成
js_obj = execjs.compile(js_code,cwd='node_modules'),
#node_modules的文件
如果这样写的话,有个更大的坑在后头等着你(当然是对我这个JS代码来说,或许对其他是可行的咯)
execjs._exceptions.ProgramError: TypeError: Cannot read property '0' of null
很好理解,null,空值不能读取下标为0的元素,虽然理解是好理解,但是,说实话,很坑,坑在哪,需要捋清到底是那个数组元素出问题了,也就是你需要将所有JS代码研究一遍,注意这里的研究并不是看逻辑就行了,而是需要细读所有的JS代码了,这你就得原地爆炸。
正确的解决方法:replace()
是的,就是这么简单
最初报错的JS(格式化后)
var cookie = '__jsl_clearance=1585039003.595|0|' + (function() {
var _1K = [function(_M) {
return _M
}, function(_1K) {
return _1K
}, (function() {
var _M = document.createElement('div');
_M.innerHTML = '_1I';
_M = _M.firstChild.href;
var _1K = _M.match(/https?:\/\//)[0];
_M = _M.substr(_1K.length).toLowerCase();
return function(_1K) {
for (var _1I = 0; _1I > -~[])],
[6], (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + (-~[] << -~[]) + ((-~[] <> -~(+!-{})) + 4 + []), [2 + (2 ^ (+!-{}))], ((+![]) + [] + [
[]
][0]), (((+!-{}) | (-~[] <> -~(+!-{}))) + []), (2 + [] + [])
];
for (var _M = 0; _M > -~(+!-{}))) + [])],
[
[(+!-{})] + (2 + [] + [])
], 'D', '9XXGugKxWw2Dq6BI%', (((+!-{}) | (-~[] <> -~(+!-{}))), (2 + [] + [])
][_1I[_M]])
};
return _1I.join('')
})() + ';Expires=Tue, 24-Mar-20 09:36:43 GMT;Path=/;'
处理后的
var cookie = '__jsl_clearance=1585039003.595|0|' + (function() {
var _1K = [function(_M) {
return _M
}, function(_1K) {
return _1K
}, (function() {
var _M = 'www.mps.gov.cn';
return function(_1K) {
for (var _1I = 0; _1I > -~[])],
[6], (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + (-~[] << -~[]) + ((-~[] <> -~(+!-{})) + 4 + []), [2 + (2 ^ (+!-{}))], ((+![]) + [] + [
[]
][0]), (((+!-{}) | (-~[] <> -~(+!-{}))) + []), (2 + [] + [])
];
for (var _M = 0; _M > -~(+!-{}))) + [])],
[
[(+!-{})] + (2 + [] + [])
], 'D', '9XXGugKxWw2Dq6BI%', (((+!-{}) | (-~[] <> -~(+!-{}))), (2 + [] + [])
][_1I[_M]])
};
return _1I.join('')
})() + ';Expires=Tue, 24-Mar-20 09:36:43 GMT;Path=/;'
仔细观察替换前后的JS代码
关于replace的具体内容,就是将含有document的部分代码换成相应目标网站的就行了。
示例代码:
import re
cookieJs = '''
var cookie = '__jsl_clearance=1585039003.595|0|' + (function() {
var _1K = [function(_M) {
return _M
}, function(_1K) {
return _1K
}, (function() {
var _M = document.createElement('div');
_M.innerHTML = '_1I';
_M = _M.firstChild.href;
var _1K = _M.match(/https?:\/\//)[0];
_M = _M.substr(_1K.length).toLowerCase();
return function(_1K) {
for (var _1I = 0; _1I > -~[])],
[6], (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + (-~[] << -~[]) + ((-~[] <> -~(+!-{})) + 4 + []), [2 + (2 ^ (+!-{}))], ((+![]) + [] + [
[]
][0]), (((+!-{}) | (-~[] <> -~(+!-{}))) + []), (2 + [] + [])
];
for (var _M = 0; _M > -~(+!-{}))) + [])],
[
[(+!-{})] + (2 + [] + [])
], 'D', '9XXGugKxWw2Dq6BI%', (((+!-{}) | (-~[] <> -~(+!-{}))), (2 + [] + [])
][_1I[_M]])
};
return _1I.join('')
})() + ';Expires=Tue, 24-Mar-20 09:36:43 GMT;Path=/;'
'''
textReplace = re.findall(r'(document.*?toLowerCase\(\))',cookieJs,re.S)
if textReplace:
cookieJs ="var window = {};" + cookieJs.replace(textReplace[0],"'www.mps.gov.cn'")
print(cookieJs)
到此,这串cookieJs代码就可以正常调用了。
转载注明:转自https://blog.csdn.net/qq_36853469/article/details/105075131
作者:郑德帅