企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
一般进行js有两种方式: 1. 利用 js2py 这类模块来执行相关的js代码,获取相关参数; 2. 分析js的解析规则后使用纯python代码来实现这个规则。 下面根据有道翻译的js解析规则,使用纯python代码模拟有道翻译在浏览器上的请求。 <br/> 分析: 1. 发起请求的url ![](https://img.kancloud.cn/ef/91/ef915608c7c0ad0f1fd9a885862a2d70_1820x280.jpg) <br/> 2. 发起请求需要的数据 ![](https://img.kancloud.cn/6a/36/6a364a7f2931b165d86a0ecc57a64649_1329x418.jpg) 根据多次的分析,发现`salt`、`sign`、`lts`是动态变化的,需要我们找出这3个参数的计算规则。 <br/> 3. 根据分析,这`salt`、`sign`、`lts`3个参数的生成规则都是在`fanyi.min.js`文件中进行计算。 ![](https://img.kancloud.cn/5e/34/5e34aaca2252e86c27884c7fb2b33502_1312x127.jpg) <br/> 4. 到`fanyi.min.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, // 根据分析,lts就是ts bv: t, salt: i, sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@") } }; ``` <br/> 5. Python代码 ```python """ @Date 2021/4/25 """ import requests import hashlib import time import random class YouDao(object): def __init__(self, word): self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' self.headers = { 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', 'Cookie': 'OUTFOX_SEARCH_USER_ID=313193238@10.108.160.105; JSESSIONID=aaa7ct2Vq099Q_SufJiKx; OUTFOX_SEARCH_USER_ID_NCOO=1372802014.8122625; ___rl__test__cookies=1619355675246', 'Referer': 'https://fanyi.youdao.com/' } self.formData = None self.word = word def generate_formdata(self): """ 生成formData数据 """ # 1. 求出lts ts = str(int(time.time() * 1000)) # 2. 求出salt salt = ts + str(random.randint(0, 9)) # 3. 求出sign tempstr = "fanyideskweb" + self.word + salt + "Tbh5E8=q6U3EXe+&L[4c@" md5 = hashlib.md5() md5.update(tempstr.encode()) sign = md5.hexdigest() self.formData = { 'i': self.word, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt, 'sign': sign, 'lts': ts, 'bv': 'cda1e53e0c0eb8dd4002cefc117fa588', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_CLICKBUTTION' } def get_data(self): response = requests.post(self.url, data=self.formData, headers=self.headers) data = response.json() # 响应的数据为json类型 print(type(data)) # <class 'dict'> # {'translateResult': [[{'tgt': 'Life is too short to carpe diem', 'src': '人生苦短,及时行乐'}]], 'errorCode': 0, 'type': 'zh-CHS2en'} print(data) # 提取tgt和src信息 tgt = data['translateResult'][0][0]['tgt'] src = data['translateResult'][0][0]['src'] return {'tgt': tgt, 'src': src} def run(self): self.generate_formdata() data = self.get_data() print(data) # {'tgt': 'Life is too short to carpe diem', 'src': '人生苦短,及时行乐'} if __name__ == '__main__': youdao = YouDao("人生苦短,及时行乐") youdao.run() ```