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 execjs
with 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
这个时候,你能发现get_sign函数返回一个Promise对象,好了,当异步操作完成后,再调用resolve函数返回d的值。
然后在python代码中写一个逻辑调用get_sign函数时,使用async或者await来处理异步操作
这个地方我们调用js函数时,使用ctx.call_async代替ctx.call,这样就可以使用await等待异步操作的结果了(关于这几个函数的替换,用法,可以详细看看微软的msdn或者火狐的mdn博客)同时,为了使用async或者是await,需要将main函数声明为一个异步函数,并且使用asyncio模块的run函数来运行它,就可以搞定了。