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コードの文字列は通常どおり呼び出すことができます。に