爬虫(2)关于百度翻译API的JS渗透破解

现在开始,进入百度翻译页面

先说一下我们的目的:

获取这串json数据

F12进去发现,有两个很明显的请求连接  (图中已标识)

首先先来看输入语言检测api

 很明显就是向这个地址发起Post请求,然后自动检测输入语言类别.

好戏现在开始!

很明显我们要开始处理百度翻译接口。

问题1:

我们看到这里的Post请求下的Form Data    我们只需知道sign 和 token 其他很好理解是什么

 

 

 这里小编写了尝试了三遍输入,发现token完全一模一样。除了sign,好我们就从这个sign开始。

然后就进入我们的JS世界了。(这个环节是整个项目最重要的)

进入来之后发现3876行,然后我们设置DOM断点

 

然后重新输入翻译字体,实现debug功能

一步一步从上往下找 Call Stack (调用堆栈)里面找

 

 

 最后在这里找到了data参数,并且发现了sign,随后我们点进去

 直接模拟js代码,然后打断点,代码下面有

重新debug,bang bang bang,sign在这里产生(320305.131321201)然后顺理成章CV走

 

然后调试,安装node.js(js的运行环境),然后调试,直到能输出sign为止(过程中要用到gtk变量)

import execjs, requests, json, re
from datetime import datetime,timedelta

from common import langList
with open('./e.js', 'r', encoding='utf8') as f:
    js = f.read()

jsfunc = execjs.compile(js)
sess = requests.Session()
sess.headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
        'origin': 'https://fanyi.baidu.com',
        'referer': 'https://fanyi.baidu.com',
    }


def lan_detect(String):
    r = sess.post('https://fanyi.baidu.com/langdetect', data={'query': String})
    StringType = r.json()['lan']
    print('你输入的翻译内容为', langList[StringType])
    return StringType


def get_r():
    for i in range(2):
        r = sess.get('https://fanyi.baidu.com')
    return r


def get_token():
    r1 = get_r()
    result2 = re.search(r"token: '(.+?)'", r1.text)  # 6ba0a416db86c535db0158a86775297f
    token = (result2.group(1))
    return token


def get_sign(String):
    r2 = get_r()
    gtk = re.search(r"window.gtk = '(.+?)';", r2.text).group(1)
    print('gtk', gtk)
    sign = jsfunc.call('e', String, gtk)
    print('sign', sign)
    return sign


def baidutranslate(String, target_lan):
    data = {
        'from': lan_detect(String),
        'to': target_lan,
        'query': String,
        'transtype': 'realtime',
        'simple_means_flag': '3',
        'sign': get_sign(String),
        'token': get_token(),
    }
    r = sess.post('https://fanyi.baidu.com/v2transapi?', data=data)
    translate_result = r.json()['trans_result']['data'][0]['dst']
    print('翻译结果:', translate_result)


if __name__ == '__main__':
    a = input('请输入你要翻译的内容')
    baidutranslate(a, target_lan='jp')

  

原文地址:https://www.cnblogs.com/jackson669/p/12169972.html