js逆向,python中调用获取不到值?
js代码:
function get_sign(url) { let req = {
"url": url,
"method": "get",
"data": null,
"headers": null
}
window.H5guard.sign(req).then(res =>{
d = res.headers.mtgsig
})
return
}
python代码:
import execjswith open('./mtgisg.js','r', encoding='UTF-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
url = ""
result = ctx.call('get_sign',url)
print(result)
输出结果:
这其中是一个逆向操作,使用execjs调用js里的函数,但是js函数中纯在异步这个问题,需要d这个值在get_sign中返回,其中d是string类型,请问大佬们怎么实现,难住孩子了,就是这里js里要怎么改呢?
回答:
先用一个promise函数处理下异步操作,比如说可以这么改js
function get_sign(url) { let req = {
"url": url,
"method": "get",
"data": null,
"headers": null
}
return new Promise((resolve, reject) => {
window.H5guard.sign(req).then(res =>{
d = res.headers.mtgsig
resolve(d)
})
.catch(error => {
reject(error)
})
})
}
这个时候,你能发现get_sign函数返回一个Promise对象,好了,当异步操作完成后,再调用resolve函数返回d的值。
然后在python代码中写一个逻辑调用get_sign函数时,使用async或者await来处理异步操作
import asyncioimport execjs
async def main():
with open('./mtgisg.js','r', encoding='UTF-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
url = ""
result = await ctx.call_async('get_sign',url)
print(result)
asyncio.run(main())
这个地方我们调用js函数时,使用ctx.call_async代替ctx.call,这样就可以使用await等待异步操作的结果了(关于这几个函数的替换,用法,可以详细看看微软的msdn或者火狐的mdn博客)同时,为了使用async或者是await,需要将main函数声明为一个异步函数,并且使用asyncio模块的run函数来运行它,就可以搞定了。
以上是 js逆向,python中调用获取不到值? 的全部内容, 来源链接: utcz.com/p/939002.html