请求分析
第一步,打开开发者工具;第二步在翻译窗口输入待翻译的内容;第三步查看请求
输入内容找到请求
首先在框内随便输入内容
然后查看筛选请求 找到我们需要的接口
查看请求参数
参数分析
“i”: 需要的翻译的内容,
“from”: “AUTO”, 输入的是什么语言 这里默认AUTO就好
“to”: “AUTO”, 需要翻译成什么内容 这么选择默认 也可以去页面上点击翻译为其他语言查看这个的内容,填写对应的value就好
“smartresult”: “dict”, 固定的不需要管
“client”: “fanyideskweb”, 固定的不需要管
“salt”: 需要处理的参数
“sign”: 需要处理的参数
“lts”: 需要处理的参数
“bv”: 需要处理的参数
“doctype”: “json”, 选择默认的
“version”: “2.1”, 选择默认的
“keyfrom”: “fanyi.web”, 选择默认的
“action”: “FY_BY_REALTlME” 选择默认的
经过分析 变化的只有五个参数 :
i:需要翻译的内容
salt: 需要处理的参数
sign: 需要处理的参数
lts: 需要处理的参数
bv: 需要处理的参数
参数破解
该过程只供学习参考 禁止商用
进入到上面分析的请求所加载的JS函数 (我瞅着这个单词 有点像我需要的 我就直接从这里进去了)
进去后直接下个断 尊重一下 试一下能不能断住 最后发现能断住 接着搜索下我们需要的参数 看看在不在这个文件当中 如果在的话直接就秒了 如果不在的话就再跟一下 (也可以直接去调用栈跟一下 怎么顺手怎么弄)
最后发现了加密的位置:
直接一网打尽 简单分析一下 :
ts:是一个时间戳
bv:t 而t是navigator.appVersion的MD5加密 navigator.appVersion是浏览器的指纹
salt:是ts 在末尾随机加了一个1-10的随机数
sign: 固定字符串+e+salt+固定字符串 然后MD5加密了一下 直接调试 看一下e是什么东西
可以发现 这个e就是我们的搜索关键字 到此 加密全部破解完成
之后用它自己生成的时间戳验证了一下 参数能对应上 证明参数破解完成 接下来直接开始写代码
代码编写
加密参数
def get_jiami(keyword, UA):
bv = get_md5(UA.replace('Mozilla/', ''))
# bv = hashlib.md5(
# '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'.encode(
# "utf-8")).hexdigest()
ts = int(time.time() * 1000)
salt = str(ts) + str(random.randint(1, 10))
sign = get_md5("fanyideskweb" + keyword + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5")
return bv, ts, salt, sign
def get_md5(the_str):
md5 = hashlib.md5()
md5.update(the_str.encode('utf8'))
psw = md5.hexdigest()
return psw
最后在封装写一下请求逻辑 测试一下 (cookie 需要带上 不然请求不成功)
完整代码
import hashlib, time, random, requests
def get_md5(the_str):
md5 = hashlib.md5()
md5.update(the_str.encode('utf8'))
psw = md5.hexdigest()
return psw
def get_jiami(keyword, UA):
bv = get_md5(UA.replace('Mozilla/', ''))
# bv = hashlib.md5(
# '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'.encode(
# "utf-8")).hexdigest()
ts = int(time.time() * 1000)
salt = str(ts) + str(random.randint(1, 10))
sign = get_md5("fanyideskweb" + keyword + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5")
return bv, ts, salt, sign
'''
ts:时间戳
salt:ts+1-10的随机数
bv: UA md5加密
sign: "fanyideskweb" + 关键字 + salt + "Ygy_4c=r#e#4EX^NUGUc5"
'''
def main(keyword):
url = 'https://fanyi.youdao.com/translate_o'
UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Length": "{}".format(len(keyword)),
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "OUTFOX_SEARCH_USER_ID=-1182719475@10.110.96.157; OUTFOX_SEARCH_USER_ID_NCOO=235541301.15775356; fanyi-ad-id=305838; fanyi-ad-closed=1; JSESSIONID=aaaZWknU5_J8Jc4lEQCcy; ___rl__test__cookies=1651903263971",
"Host": "fanyi.youdao.com",
"Origin": "http://fanyi.youdao.com",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": UA,
"X-Requested-With": "XMLHttpRequest"
}
bv, ts, salt, sign = get_jiami(keyword=keyword, UA=UA)
data = {
"i": keyword,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": salt,
"sign": sign,
"lts": ts,
"bv": bv,
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
response = requests.post(url=url, headers=headers, data=data,)
response.encoding = 'utf8'
response = response.json()
code = response.get('errorCode')
if code == 0:
print(response)
else:
print(response)
if __name__ == '__main__':
keyword = '你好啊'
main(keyword)
其他问题
我写完之后 尝试了一下这个接口 有两个问题1、响应速度很慢 2、调用到一定的时间之后 会不返回响应(IP被封掉了,换了代理之后能继续使用) 但是我的访问速度非常的慢 单线程访问一次还随机睡眠了一到三秒 不知道是不是在检查cookie或者其他的东西 有没有大佬解惑一下
最后:该文章只供学习参考 禁止商用如需转载请注明原创