1. 前言
2. 分析
- 输入字符 “苹果”,得到翻译的结果;
- 右键查看网页源码,ctrl + F 弹出搜索框,在网页源码中搜索 苹果,发现网页源码中并没有 苹果;
- 搜索 apple 同样也不能找到;
- 这说明 苹果、apple 这些输入输出的字符串,并不是在网页上的静态内容,而是动态加载的;
![](https://img.haomeiwen.com/i14502986/04eb667eeee93b39.png)
image.png
3. 抓包
- 右键检查网页,点击 Network,调出网页抓包工具;
- 在网页上重新点击 翻译 按钮,在抓到的数据包中找到含有输出信息的包;
![](https://img.haomeiwen.com/i14502986/7451483da033d225.png)
image.png
- 在网页输入框重新输入 西瓜 并再次抓包,分析数据包的参数,发现参数有如下规律:
-- i ------------------------------------------------------------------------ 输入的字符串,例如:西瓜、苹果;
-- from: AUTO---------------------------------------------------------- 不变参数;
-- to: AUTO------------------------------------------------------------- 不变参数;
-- smartresult: dict --------------------------------------------------- 不变参数;
-- client: fanyideskweb --------------------------------------------- 不变参数;
-- salt: 15929685900475 ------------------------------------------ 未知参数;
-- sign: e8aeb3b7429d2198356378746cf291d1 ------------ 未知参数;
-- ts: 1592968590047 ---------------------------------------------- 未知参数;
-- bv: 02a6ad4308a3443b3732d855273259bf -------------- 未知参数,多次抓包发现此参数值固定,换浏览器后变化;
-- doctype: json ------------------------------------------------------ 不变参数;
-- version: 2.1 -------------------------------------------------------- 不变参数;
-- keyfrom: fanyi.web ---------------------------------------------- 不变参数;
-- action: FY_BY_CLICKBUTTION ---------------------------- 不变参数;
![](https://img.haomeiwen.com/i14502986/64a433bce8e13deb.png)
image.png
4. 搜索参数,寻找代码
-
ctrl + shift + F 打开全局搜索,输入 sign 搜索,按下图所示步骤寻找代码;
![](https://img.haomeiwen.com/i14502986/19d81075ab641d96.png)
image.png
- 说明:
-- 在 4、5 两步搜索的过程中,需要结合上下文仔细分析代码内容;
-- 很多情况下,目标代码是以 代码块 的形式,集中在一起 出现的;
-- 一个文件中会有多处代码有相同关键字,对于这类相同的关键字,可以多次搜索不同的关键字,对比分析不同的代码块中,关键字的区别,推测可能性最大的代码块;
5. 下断调试
- 在目标代码位置下断点;
- 在网页重新点击 翻译 按钮;
-- 注意:此处动作不可以用 刷新 替代,很多时候 刷新 并不能完成请求的再次发送;
- 参考下图,在断点分析代码,
![](https://img.haomeiwen.com/i14502986/2153aaae8af0aee4.png)
image.png
- 通过分析,得到下面的结果:
-- i,即代码中的 e,表示输入的字符串;
-- bv,即代码中的 t,是对浏览器版本字符串(注意:需要剔除 Mozilla/ 字符串!!!)的 md5 处理;
-- ts,即代码中的 r,是 13 位时间戳;
-- salt,即代码中的 i,是 r 值尾部加上一个 0~9 随机整数;
-- sign,是对 "fanyideskweb" + e + i + "mmbP%A-r6U3Nw(n]BjuEU" 字符串的 md5 处理;
6. 代码实现
import requests
import hashlib
import time
import random
def youdao(keyword):
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
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": "251",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "OUTFOX_SEARCH_USER_ID=794950846@10.169.0.82; JSESSIONID=aaatjBaH10pyw8bRkOHlx; OUTFOX_SEARCH_USER_ID_NCOO=947970453.2625253; ___rl__test__cookies=1592932488300",
"Host": "fanyi.youdao.com",
"Origin": "http://fanyi.youdao.com",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
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()
print(bv)
ts = str(int(round(time.time() * 1000)))
salt = ts + str(random.randint(0, 9))
sign = hashlib.md5("fanyideskweb{}{}mmbP%A-r6U3Nw(n]BjuEU".format(keyword, salt).encode("utf-8")).hexdigest()
form_data = {
"i": keyword,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": salt,
"sign": sign,
"ts": ts,
"bv": bv,
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
print(form_data)
response = requests.post(url=url, headers=headers, data=form_data).text
return response
def main():
keyword = '西瓜'
response = youdao(keyword=keyword)
print(response)
if __name__ == '__main__':
main()
网友评论