Python 解决execjs._exceptions.ProgramError: ReferenceError: document is not defined报错问题

Doria ·
更新时间:2024-11-10
· 824 次阅读

今天用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


作者:郑德帅



defined document NOT IS Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号