利用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);
}
回答:
你的执行环境没有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
以上是 利用python读取前端JS中的TOKEN。报错:TypeError: 'window' 未定义,请教! 的全部内容, 来源链接: utcz.com/a/163350.html