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

今天用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(`<!DOCTYPE html><p>Hello world</p>`);
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 = '<a href=\'/\'>_1I</a>';
			_M = _M.firstChild.href;
			var _1K = _M.match(/https?:\/\//)[0];
			_M = _M.substr(_1K.length).toLowerCase();
			return function(_1K) {
				for (var _1I = 0; _1I < _1K.length; _1I++) {
					_1K[_1I] = _M.charAt(_1K[_1I])
				};
				return _1K.join('')
			}
		})()],
		_1I = [
			[(+!-{})] + ((+![]) + [] + [
				[]
			][0]), [(-~[] + [4] >> -~[])],
			[6], (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + (-~[] << -~[]) + ((-~[] << -~[]) ^ (+!-{})) + [
				[]
			][0]), [(+!-{})], (-~[] + (-~[] + [-~(+!-{})] >> -~(+!-{})) + 4 + []), [2 + (2 ^ (+!-{}))], ((+![]) + [] + [
				[]
			][0]), (((+!-{}) | (-~[] << -~[])) + [] + []), (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + []), (2 + [] + [])
		];
	for (var _M = 0; _M < _1I.length; _M++) {
		_1I[_M] = _1K[[0, 1, 2, 0, 2, 1, 0, 2, 1, 0, 1][_M]]([
			[(-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + [])],
			[
				[(+!-{})] + (2 + [] + [])
			], 'D', '9XXGugKxWw2Dq6BI%', (((+!-{}) | (-~[] << -~[])) + [] + []), [2 + (2 ^ (+!-{}))],
			[((+![]) + [] + [
				[]
			][0])], 'Yp', 'Uur', [window['callP' + 'hantom'] + [] + [
				[]
			][0]][0].charAt(([-~(+!-{})] + ~~'' >> -~(+!-{}))), (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 < _1K.length; _1I++) {
					_1K[_1I] = _M.charAt(_1K[_1I])
				};
				return _1K.join('')
			}
		})()],
		_1I = [
			[(+!-{})] + ((+![]) + [] + [
				[]
			][0]), [(-~[] + [4] >> -~[])],
			[6], (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + (-~[] << -~[]) + ((-~[] << -~[]) ^ (+!-{})) + [
				[]
			][0]), [(+!-{})], (-~[] + (-~[] + [-~(+!-{})] >> -~(+!-{})) + 4 + []), [2 + (2 ^ (+!-{}))], ((+![]) + [] + [
				[]
			][0]), (((+!-{}) | (-~[] << -~[])) + [] + []), (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + []), (2 + [] + [])
		];
	for (var _M = 0; _M < _1I.length; _M++) {
		_1I[_M] = _1K[[0, 1, 2, 0, 2, 1, 0, 2, 1, 0, 1][_M]]([
			[(-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + [])],
			[
				[(+!-{})] + (2 + [] + [])
			], 'D', '9XXGugKxWw2Dq6BI%', (((+!-{}) | (-~[] << -~[])) + [] + []), [2 + (2 ^ (+!-{}))],
			[((+![]) + [] + [
				[]
			][0])], 'Yp', 'Uur', [window['callP' + 'hantom'] + [] + [
				[]
			][0]][0].charAt(([-~(+!-{})] + ~~'' >> -~(+!-{}))), (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 = '<a href=\'/\'>_1I</a>';
			_M = _M.firstChild.href;
			var _1K = _M.match(/https?:\/\//)[0];
			_M = _M.substr(_1K.length).toLowerCase();
			return function(_1K) {
				for (var _1I = 0; _1I < _1K.length; _1I++) {
					_1K[_1I] = _M.charAt(_1K[_1I])
				};
				return _1K.join('')
			}
		})()],
		_1I = [
			[(+!-{})] + ((+![]) + [] + [
				[]
			][0]), [(-~[] + [4] >> -~[])],
			[6], (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + (-~[] << -~[]) + ((-~[] << -~[]) ^ (+!-{})) + [
				[]
			][0]), [(+!-{})], (-~[] + (-~[] + [-~(+!-{})] >> -~(+!-{})) + 4 + []), [2 + (2 ^ (+!-{}))], ((+![]) + [] + [
				[]
			][0]), (((+!-{}) | (-~[] << -~[])) + [] + []), (-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + []), (2 + [] + [])
		];
	for (var _M = 0; _M < _1I.length; _M++) {
		_1I[_M] = _1K[[0, 1, 2, 0, 2, 1, 0, 2, 1, 0, 1][_M]]([
			[(-~((-~[] + [-~(+!-{})] >> -~(+!-{}))) + [])],
			[
				[(+!-{})] + (2 + [] + [])
			], 'D', '9XXGugKxWw2Dq6BI%', (((+!-{}) | (-~[] << -~[])) + [] + []), [2 + (2 ^ (+!-{}))],
			[((+![]) + [] + [
				[]
			][0])], 'Yp', 'Uur', [window['callP' + 'hantom'] + [] + [
				[]
			][0]][0].charAt(([-~(+!-{})] + ~~'' >> -~(+!-{}))), (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

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值