Python爬取有道翻译(破解加密--js加密)!

1.分析

有的数据是通过加密解密得到的。
加密:把明文变成密文
解密:把密文变成明文

常见的加密方式:
js加密
css加密
base64加密

 


尝试一下:

import requests

# url = "http://www.httpbin.org/post"
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
    'Origin': 'http://fanyi.youdao.com',
    'Referer': 'http://fanyi.youdao.com/',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-1808168645@10.108.160.208; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
}
data = {'action': 'FY_BY_CLICKBUTTION',
        'bv': '9caf244986fe6d1de38207408302e500',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'from': 'AUTO',
        'i': '你好',
        'keyfrom': 'fanyi.web',
        'lts': '1602406480004',
        'salt': '16024064800043',
        'sign': '726a3e12c15fcb8fda7dbd722a80f94b',
        'smartresult': 'dict',
        'to': 'AUTO',
        'version': '2.1'
}
response = requests.post(url=url,headers=headers,data=data)
print(response.content.decode("utf-8"))

发现,当修改翻译内容的时候,得不到想要的结果。其实做为一个合格的爬虫开发者,应该有敏感性。


断点调试js,查看变量值,再次确认。

var r = function(e) {
        var t = n.md5(navigator.appVersion)![在这里插入图片描述](https://img-blog.csdnimg.cn/20201012090429630.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDg0MzUyMg==,size_16,color_FFFFFF,t_70#pic_center)

          , r = "" + (new Date).getTime()
          , i = r + parseInt(10 * Math.random(), 10);
        return {
            ts: r,
            bv: t,
            salt: i,
            sign: n.md5("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m")
        }
    };

经过分析,确认参数:
ts是当前时间戳
bv是使用md5加密navigator.appVersion,只要浏览器不变,其实可以是固定的


salt是时间戳拼接0-9的随机整数字符串
sgin是md5加密的
这里的e通过断点调试确认e就是翻译的内容

接下来需要使用python来模拟这些信息:

import time
import random

its = str(round(time.time(),3)).replace(".","")
salt = its+str(random.randint(0,9))

print(its,salt)

md5算法一般用来做加密,不可逆的。

import hashlib

content = "diyisiifudsifhidfhsdhfsdkhfsdkhfksdhfkshkjdhjskhfksdhfkshfdh哈哈哈哈哈哈哈一hdd"
md5 = hashlib.md5()
md5.update(content.encode("utf-8"))
ret = md5.hexdigest()
print(ret,len(ret))

2.完整代码

import requests
import time
import random
import hashlib
from pprint import pprint


def main():
    """主程序"""
    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    headers = {
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'Cookie': 'OUTFOX_SEARCH_USER_ID=-1808168645@10.108.160.208; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
    }
    i = input(">")
    data = get_data(i)
    response = requests.post(url=url,headers=headers,data=data)
    print(response.json()["translateResult"][0][0]["tgt"])

def do_md5(content):
    """md5方法"""
    md5 = hashlib.md5()
    md5.update(content.encode("utf-8"))
    return md5.hexdigest()

def get_data(i):
    """获取参数"""
    lts = str(round(time.time(), 3)).replace(".", "")
    salt = lts + str(random.randint(0, 9))
    sign = do_md5("fanyideskweb" + i + salt + "]BjuETDhU)zqSxf-=B#7m")
    data = {
        'action': 'FY_BY_CLICKBUTTION',
        'bv': '9caf244986fe6d1de38207408302e500',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'from': 'AUTO',
        'i': i,
        'keyfrom': 'fanyi.web',
        'lts': lts,
        'salt': salt,
        'sign': sign,
        'smartresult': 'dict',
        'to': 'AUTO',
        'version': '2.1'
    }
    return data

if __name__ == '__main__':
    main()

3.结果

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

完整代码可以点击下方链接获取~

python免费学习资料以及群交流解答点击即可加入

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值