利用python读取前端JS中的TOKEN。报错:TypeError: 'window' 未定义,请教!

利用python读取JS中的TOKEN。小白刚学,没有理解,没读不出来,望高手指点,谢谢!
报错:TypeError: 'window' 未定义

一、python程序

import execjs

_JS = execjs.compile(open("aa.js", "r", encoding='UTF-8').read())  # 初始化JS
token = _JS.call('loginByToken','callback')

print(token)

二、js文件

JS保存文件名aa.js.代码如下

function getCsrfToken(callback){
    get('/token/csrf',{},function(json){
        CSRF_NAME = json.data.csrf_name;
        CSRF_TOKEN = json.data[CSRF_NAME];
        if(typeof(callback) == 'function') callback();
    })
}

function check_token(){
    getCsrfToken(verify);

    //检测是否有token
    function verify(){
        $.post('/token/verify',{token:TOKEN,csrf_token:CSRF_TOKEN},function(json){
            json = $.parseJSON(json);
            if(json[CSRF_NAME]) CSRF_TOKEN = json[CSRF_NAME];
            if(json.code != 0){
                loginByToken(function(){
                    hashChangeEvent();
                })
            }else{
                hashChangeEvent();
            }
        })
    }
}


function loginByToken(callback){
    post('/main/auth/login',function(json){
        if(json.code == 0){
            TOKEN = json.data.token;
        }else{
            window.location = REDIRECT_LOGIN_URL;
            return;
        }
        if(typeof(callback) == 'function') callback();
    })
}


function post(url,parames,callback){
    if(!CSRF_TOKEN){
        getCsrfToken(function(){
            post(url,parames,callback);
        });
        return;
    }
     if(typeof(parames) == 'string'){
         parames += '&'+CSRF_NAME+'='+CSRF_TOKEN;
         if(TOKEN) parames += '&token='+TOKEN;
     }else if(typeof(parames) == 'object'){
         parames[CSRF_NAME] = CSRF_TOKEN;
         if(TOKEN) parames.token = TOKEN;

     }else if(typeof(parames) == 'function'){
         callback = parames;
         parames = {};
         parames[CSRF_NAME] = CSRF_TOKEN;
         if(TOKEN) parames.token = TOKEN;
     }else if(typeof(parames) == 'undefined'){
         parames = {};
         parames[CSRF_NAME] = CSRF_TOKEN;
         if(TOKEN) parames.token = TOKEN;
     }

     CSRF_TOKEN = null;
     $.post(url,parames,function(data){
         var json = $.parseJSON(data);
         if(json[CSRF_NAME]) CSRF_TOKEN = json[CSRF_NAME];
         if(json.data && json.data.token) {
             TOKEN = json.data.token;
             localStorage.setItem('CJKT_MAIN_TOKEN',TOKEN);
         }
         if(json.code != 0){
             if($('#loading').length>0) loading(false);
             switch(parseInt(json.code)){
                 case 40001:
                         alert(json.msg);
                         break;
                 case 40003:
                 case 40004:
                     window.location = REDIRECT_LOGIN_URL;
                     break;
                 case 40005:
                     loginByToken(function(){
                         post(url,parames,callback);
                     })
                     break;
                 case 40006:
                     alert('权限不足');
                     break;
                 case 40007:
                     Page.go('index');
                     break;
                 case 40009:
                     //csrftoken错误
                     getCsrfToken(function(){
                        post(url,parames,callback);
                    });
                    return;
                     break;
             }
         }

         if(typeof(callback) == 'function'){
             callback(json);
         }

     });
}

window.alert = function(msg){
    Toast.error(msg);
}
阅读 4.4k
2 个回答

你的执行环境没有window对象
window对象是浏览器的内置对象 你需要模拟

更改代码如下,还是报错
import execjs
from selenium import webdriver

browser = webdriver.Chrome(executable_path='chromedriver.exe')
_JS = execjs.compile(open("aa.js", "r", encoding='UTF-8').read()) # 初始化JS
print(browser.execute_script(_JS))
token = browser.call('loginByToken','callback')

后面TOKEN还没有运行到,就报错.

报错:TypeError: Object of type 'Context' is not JSON serializable

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题