百度翻译
找到百度翻译这个页面,右键检查,点到Network,再点一下XHR,再在那块翻译板上随便输入点什么,再删除,直到出现sug这个接口,点到sug,我们看一下Response,可以很清楚的看到是一个json字符串,从Headers中的General可以清楚的看到这是一个post请求,From Data里的kw参数就是你要翻译的数据
演示如下:
import requests
url = 'https://fanyi.baidu.com/sug'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'
}
# kw后面跟的值就是你要翻译的数据,好像是自动英汉识别,没试过其他语种,大家可以去试一下
data = {
'kw':'我爱你'
}
res = requests.post(url=url,headers=headers,data=data)
# 要是不确定是否是一个json数据,也可以先打印一下text,看一下
content = res.json()
print(content)# 现在的content是一个字典和裂变嵌套格式的数据,要取里面的数据可以根据字典取值的方式去取
# {'errno': 0, 'data': [{'k': '我爱你', 'v': '名. I love you; <法>Je t’aime; <德>Ich liebe Dich; <日'}, {'k': '我爱你一生一世', 'v': 'I love you forever'}]}
有道翻译
这里我们找到的借口url是 http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule,你去请求这个url的话,返回的一直是一个 {‘errorCode’: 50},把那个translate后面的 _o 去掉就好了
import requests
def youdao(data):
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
}
data = {
'i': data,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16158628760095',
'sign': 'b5dbf92bc727fef70c8b8576006f8f69',
'lts': '1615862876009',
'bv': '818e2470a16ccb5d68270d01f2d298b2',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
res = requests.post(url=url,headers=headers,data=data)
content = res.json()
print(content)
print(content['translateResult'][0][0]['tgt'])
if __name__ == '__main__':
youdao('我爱你')
# {'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': '我爱你', 'tgt': 'I love you'}]]}
# I love you
这是一个便捷的方法,当然如果不通过这种方法而是通过去破解网站的js加密也是可以的
import requests
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
# 这是一般网站的常见反扒机制,可见在这里也是可以行的痛的
headers = {
'Cookie': '[email protected]; JSESSIONID=aaaADqzynZotsc_p9sJHx; OUTFOX_SEARCH_USER_ID_NCOO=868568444.170369; ___rl__test__cookies=1616574848293',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'Referer': 'http://fanyi.youdao.com/',
}
data = {
'i': 'job',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16165748482990',
'sign': 'bf58c758752eec37af623bb1fd8049fb',
'lts': '1616574848299',
'bv': 'c2d117fd881e2494bf8ae431925a0494',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlM',
}
res = requests.post(url=url,headers=headers,data=data)
print(res.text)
# {"translateResult":[[{"tgt":"工作","src":"job"}]],"errorCode":0,"type":"en2zh-CHS","smartResult":{"entries":["","n. 工作;职业\r\n","vt. 承包;代客买卖\r\n","vi. 做零工\r\n"],"type":1}}
但是通过我们的测试,这样就只能翻译job这一个单词,我们一将i的值改变就又会出现{“errorCode”:50},所以我们可以猜测应该和from data里面的数据有关,所以我又去在网页上翻译了一个数据,我们将他们的from data对比发现只有下面的几组数据是变得
"""
i: job
salt: 16165748482990
sign: bf58c758752eec37af623bb1fd8049fb
lts: 1616574848299
i: hello
salt: 16165776702054
sign: 49d2036d2794e1bf7d83e6a9ab2086f0
lts: 1616577670205
"""
这几组数据应该是网页js动态加载的,所以我们直接去js去查询
最后通过层层查找,找到了
var r = function(e) {
var t = n.md5(navigator.appVersion)
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
}
};
> (new Date).getTime()
> 1616578252394
> parseInt(10 * Math.random(), 10)
> 4
我们使用python代码来模拟js加密
这是最后的代码
import requests
import time
import random
import hashlib
def get_data(data):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Cookie': '[email protected]; JSESSIONID=aaaADqzynZotsc_p9sJHx; OUTFOX_SEARCH_USER_ID_NCOO=868568444.170369; ___rl__test__cookies=1616574848293',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'Referer': 'http://fanyi.youdao.com/',
}
"""
var r = function(e) {
var t = n.md5(navigator.appVersion)
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
}
};
"""
ts = str(int(time.time()))
salt = ts + str(random.randint(0,9))
# n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
# e就是要翻译的数据
md5 = hashlib.md5()
md5.update(("fanyideskweb" + data + salt + "Tbh5E8=q6U3EXe+&L[4c@").encode())
sign = md5.hexdigest()
data = {
'i': data,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': 'c2d117fd881e2494bf8ae431925a0494',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlM',
}
"""
i: job
salt: 16165748482990
sign: bf58c758752eec37af623bb1fd8049fb
lts: 1616574848299
i: hello
salt: 16165776702054
sign: 49d2036d2794e1bf7d83e6a9ab2086f0
lts: 1616577670205
"""
res = requests.post(url=url,headers=headers,data=data)
print(res.text)
get_data('我爱你')
# {"translateResult":[[{"tgt":"I love you","src":"我爱你"}]],"errorCode":0,"type":"zh-CHS2en","smartResult":{"entries":["","I love you\r\n"],"type":1}}