Pythonはexecjs._exceptions.ProgramErrorの問題を解決します:ReferenceError:ドキュメントが定義されていません



Python Solves Problem Execjs



今日execjsでJSを呼び出すと、エラーexecjs._exceptions.ProgramError:ReferenceError:document is notdefinedが見つかりました

示されているように:



エラータイプ:ドキュメントオブジェクトが定義されていません。解決策はオブジェクトを定義することですが、変数を習慣的に定義します



var document?

emmmmmmmmmmmmmmm ...機能しない場合は、引き続きエラーを報告してください

execjs._exceptions.ProgramError: TypeError: Cannot read property 'createElement' of undefined

エラーが報告された場合:execjs._exceptions.ProgramError:ReferenceError:ウィンドウが定義されていません。言うまでもなく、Windowsオブジェクトを直接定義することで解決できます。



私はインターネットでたくさんチェックして、正しい解決策は...次のとおりだと言いました:

プロジェクトパスの下でnpmコマンドを実行して、jsdomをインストールします

npm install jsdom

これは、execjs(nodejs,を除く)がホームに戻るためのブラウザも必要であり、ブラウザもdocumentおよびwindow Objectを必要とするため、環境をインストールする必要があるためです。

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) is modified to js_obj = execjs.compile(js_code,cwd='node_modules'), #node_modules' files

このように書くと、あなたを待っている大きな穴があります(もちろん、私の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 = ' -~[])], [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 GMTPath=/'

処理後

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 GMTPath=/'

交換前後のJSコードを注意深く観察してください

置換の具体的な内容については、ドキュメントを含むコードの一部を対応する対象のWebサイトに置き換えるだけです。

サンプルコード:

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 = '
-~[])], [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 GMTPath=/' ''' textReplace = re.findall(r'(document.*?toLowerCase())',cookieJs,re.S) if textReplace: cookieJs ='var window = {}' + cookieJs.replace(textReplace[0],''www.mps.gov.cn'') print(cookieJs)

この時点で、このcookieJコードの文字列は通常どおり呼び出すことができます。に