python爬虫js逆向学习(二)

    技术2022-07-11  85

    1.问题分析过程

    本文以百度翻译为例介绍js逆向过程

    1.1 通过抓包找出返回数据的api,因刷新时页面不变,所以数据是通过ajax异步获取,所以可在xhr中抓包 1.2 分析请求头得到formdata的信息,只有sign是可变的,token是固定的,query为输入的信息 1.3 再全局搜索数据包的接口v2transapi?,找出js代码文件,从中寻找生成sign的函数 1.4 断点debug鼠标移到y上可定位到生成函数,y(n)=e® 1.5 对于较长的参数生成js代码,可直接在Python中利用PyExecJs模块调用执行,发现js代码中还存在局部参数未传值 1.6 找出i的生成式,但是不知道l的值,将l在控制台中执行,得到gtk,所以i=window[“gtk”],接下来在源码中对gtk进行搜索得到需要的结果 1.7 将window.gtk的值赋给i后再对js代码进行调试得到sign值 python在pycharm中用PyExecJs调用执行js代码时需配置相应的环境,windows自带JScript引擎会报错,所以需要安装nodejs,然后添加到本机的环境变量后配置到pycharm中

    2.代码示例

    2.1 获取js函数参数

    import requests import re def get_params(): headers={'user-agent':''} url="https://fanyi.baidu.com/" html=requests.get(url,headers=headers).text token=re.findall(r"window.*token: '(.*?)'",html,re.S)[0] gtk=re.findall(r"window.gtk = '(.*?)';",html,re.S)[0] return gtk,token

    2.2 执行js代码获取formdata

    import execjs import os def get_FormData(word): gtk,token=get_params() # 修改当前执行环境 os.environ["EXECJS_RUNTIME"] = "Node" # 获取环境引擎 name=execjs.get().name with open('code.js','r') as f: js_text=f.read() # 编译js代码 ctx=execjs.compile(js_text) js='e("{}","{}")'.format(word,gtk) #eval可模拟执行js代码 sign=ctx.eval(js) return token,sign

    2.3 携带formdata对翻译接口发起post请求

    def get_res(): token,sign=get_FormData() choice=input("请选择:zh or en 汉译英>zh,英译汉>en :") if choice=='zh': f,t='zh','en' if choice=='en': f,t='en','zh' word=input("请输入:") data={ 'from': f, 'to': t, 'query': word, 'transtype': 'translang', 'simple_means_flag': '3', 'sign': sign, 'token': token, 'domain': 'common' } res=requests.post(trs_url,headers=headers,data=data).json() print(res)
    Processed: 0.012, SQL: 9