zoukankan      html  css  js  c++  java
  • 爬虫(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')
    

      

  • 相关阅读:
    文件的上传
    自定义EL表达式的函数
    JSTL 自定义标签
    Java c3p0连接池之二
    Java c3p0连接池
    JSP 登录与注册的小案例
    Java jdbc 连接oracle之三(封装工具类)
    Java jdbc 连接oracle之二(使用properties文件)
    Swift中Notification.Name自定义枚举
    swift UITableViewCell 策划删除,iOS11之后 设置侧滑不到最左边
  • 原文地址:https://www.cnblogs.com/jackson669/p/12169972.html
Copyright © 2011-2022 走看看