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 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)

输出结果:
image.png

这其中是一个逆向操作,使用execjs调用js里的函数,但是js函数中纯在异步这个问题,需要d这个值在get_sign中返回,其中d是string类型,请问大佬们怎么实现,难住孩子了,就是这里js里要怎么改呢?

阅读 4.9k
1 个回答

先用一个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 asyncio
import 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函数来运行它,就可以搞定了。

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