python请求有道翻译

首先先打开网址
python请求有道翻译_第1张图片
国际惯例,输入单词按下F12打开开发者工具,定位到network xhr
在这里插入图片描述
发现是个POST请求数据,
python请求有道翻译_第2张图片
我们只要构建这些请求参数就可以,多请求几次,发现有4个参数需要破解
1.salt
2.sign
3.ts
4.bv
先从salt开始,看这种请求格式我们知道这是一个时间戳样式
先不用管,看看sign参数按住ctrl+shift+f调出search输入sign查找
出来一个js文件
python请求有道翻译_第3张图片
双击打开
python请求有道翻译_第4张图片
点击左下的格式化输出。
按住ctrl+f查找sign,共查出15个,如果你稍微懂点JS的话,你就可以一个一个看,不懂的话可以全部打上断点。
我定位到这里打上断点
在这里插入图片描述
点击翻译。
python请求有道翻译_第5张图片
由此可知,e就是我们输入的单词,这些就是加密算法
如果你会js直接按照这个写个js,再用PyExecJS调用就可以了,不会咋办呢,只有慢慢分析了
r 为获取系统当前时间戳转化为字符串
python也可以
在这里插入图片描述
然后拼接i
在这里插入图片描述
然后就是sign是一个MD5加密
在这里插入图片描述
然后bv,bv是通过navigator.appVersion加密得来的而这个就是浏览器版本信息。
在这里插入图片描述
然后可以写代码了

import requests
import time, hashlib, math, random
import pprint
from fake_useragent import UserAgent

ua = UserAgent().random 

def get_from(word):
    r = math.floor(time.time()*1000)
    i = str(r) + str(math.floor(random.random() * 10))
    sign = hashlib.md5(("fanyideskweb" + str(i) + str(word) + "mmbP%A-r6U3Nw(n]BjuEU").encode('utf-8'))
    bv = hashlib.md5(ua.encode('utf-8'))
    data = {
        'i': str(word),
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': str(i),
        'sign': sign.hexdigest(),
        'ts': str(r),
        'bv': bv.hexdigest(),
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_CLICKBUTTION',
    }
    return data

def translation(word):
    data = get_from(word)
    pprint.pprint(data)
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    headers = {
        'User-Agent': ua,
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=180920398.51332757; _ntes_nnid=ff485a36b0db3051525f68215b44c3b1,1588145333309; P_INFO=singleqq123; JSESSIONID=aaaq9fhekbuDm_8u8a1lx; ___rl__test__cookies=1593258003402',
        
    }
    
    response = requests.post(url=url,data=data,headers=headers).text
    print(response)

if __name__ == '__main__':
    word = input('请输入需要翻译的词:')
    translation(word)

``
emmmmm,思路应该是没错的,不过还是返回error 50,找了挺久都没找出来原因,我以为是构建参数的问题,改了还是不行。还是菜啊,有木有大佬解决一下。。。

你可能感兴趣的:(笔记)