当前位置: 首页 > news >正文

爬虫案例:有道翻译python逆向

pip install

  • pip install requests
  • pip install base64
  • pip install pycrytodome

tools

浏览器的开发者工具,重点使用断点,和调用堆栈
工具网站:https://curlconverter.com/ 简便请求发送信息

flow

在这里插入图片描述

  1. 根据网站信息,preview,response均是加密数据,或者说请求和响应我们都需要使用代码来进行模仿
  2. 由请求方式是post,所以我们需要关注payload载荷发现动态值sign,mysticTime是时间戳
  3. 对JS代码进行分析,找到动态值生成的地方,这里可以使用initiator发起程序,使用调用堆栈进行溯源,打断点进行测试,分析可知动态值是由md5摘要得出。
  4. 分析可知数据是base64变种对响应数据进行base64解码处理,分析加密算法是AES对称加密,找到对称密钥key,iv,进行解密。
  5. 最后对json数据进行反序列化,取得特定值

Code

import requests
import time
import hashlib
import base64
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpaddef get_md5(value, is_hex=True):"""md5 abstract algorithmparams:value: str, the value to be md5is_hex: bool, whether to return the md5 value in hex formatreturn: str, the md5 value"""md5 = hashlib.md5()md5.update(value.encode('utf-8'))if is_hex:return md5.hexdigest()else:return md5.digest()word = input("Enter the word to be translated :")
url =  'https://dict.youdao.com/webtranslate'
mysticTime = str(int(time.time() * 1000))# (1)构建逆向动态值
d = 'fanyideskweb'
e = mysticTime
u = 'webfanyi'
t = 'fsdsogkndfokasodnaso'i = f"client={d}&mysticTime={e}&product={u}&key={t}"
sign = get_md5(i)# (2)请求模拟
cookies = {'OUTFOX_SEARCH_USER_ID': '-815609020@10.55.164.249','OUTFOX_SEARCH_USER_ID_NCOO': '1719344943.4114175','_ga': 'GA1.2.674292823.1712131832',
}headers = {'Accept': 'application/json, text/plain, */*','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded','Cookie': 'OUTFOX_SEARCH_USER_ID=-815609020@10.55.164.249; OUTFOX_SEARCH_USER_ID_NCOO=1719344943.4114175; _ga=GA1.2.674292823.1712131832','Origin': 'https://fanyi.youdao.com','Referer': 'https://fanyi.youdao.com/','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-site','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0','sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','referer': 'https://fanyi.youdao.com/',
}data = {'i': word,'from': 'auto','to': '','useTerm': 'false','dictResult': 'true','keyid': 'webfanyi','sign': sign,'client': 'fanyideskweb','product': 'webfanyi','appVersion': '1.0.0','vendor': 'web','pointParam': 'client,mysticTime,product','mysticTime': mysticTime,'keyfrom': 'fanyi.web','mid': '1','screen': '1','model': '1','network': 'wifi','abtest': '0','yduuid': 'abcdefg',
}res = requests.post(url , cookies=cookies, headers=headers, data=data)# base64变种 --> 正常base64
res_encrypt_base64 = res.text.replace('-', '+').replace('_', '/')# (3)解码和解密数据
res_encrypt_bytes = res_encrypt_base64.encode('utf-8')# 1.解码  
res_encrypt_decode = base64.b64decode(res_encrypt_bytes)# 2.解密
t = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'
o = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'key = get_md5(t, is_hex=False)
iv = get_md5(o, is_hex=False)aes = AES.new(key, AES.MODE_CBC, iv)
source_data = aes.decrypt(res_encrypt_decode)# (4)解析数据
data = unpad(source_data, 16)  # json字符串,有base64填充,所以需要去填充
data = json.loads(data)ret = [line.get('tgt') for line in data['translateResult'][0]]
print("\n".join(ret))

END

我的想法:想要实现的功能是结合其他爬虫程序,进行批量的文章翻译自动化,但是这个爬虫脚本有点鸡肋,文本之间不能有空格,他对长文本的内容不能很好的翻译。

相关文章:

  • 【中间件系列】浅析redis是否适合做消息队列
  • dots_image 增强图像中的圆点特征
  • 逆波兰表达式
  • three.js官方案例(animation / multiple)webgl_animation_multiple.html学习笔记
  • Redisson分布式锁原理解析
  • 深度解析:短剧市场的发展趋势
  • MFC实现子控件focus焦点上下移动父控件ListView和Gridview也跟着向上下移动
  • CogVLM2多模态开源大模型部署与使用
  • 聊聊二叉堆、红黑树、时间轮在定时任务中的应用
  • zookeeper节点启动的主要逻辑
  • 4. MySQL 约束
  • 东方博宜1317 - 正多边形每个内角的度数?
  • webpack学习
  • 掌握复选框(Checkbox)的奥秘:全选与反选功能实现
  • uniapp封装picker选择器组件,支持关键字查询
  • 2017年终总结、随想
  • Android Volley源码解析
  • Apache的80端口被占用以及访问时报错403
  • JavaScript DOM 10 - 滚动
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Javascript编码规范
  • Meteor的表单提交:Form
  • MQ框架的比较
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL主从复制读写分离及奇怪的问题
  • Nacos系列:Nacos的Java SDK使用
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Redis字符串类型内部编码剖析
  • SpringBoot几种定时任务的实现方式
  • Sublime text 3 3103 注册码
  • Vue--数据传输
  • Vultr 教程目录
  • Yii源码解读-服务定位器(Service Locator)
  • 阿里云应用高可用服务公测发布
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 机器学习 vs. 深度学习
  • 如何利用MongoDB打造TOP榜小程序
  • 如何使用 JavaScript 解析 URL
  • 在weex里面使用chart图表
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # Panda3d 碰撞检测系统介绍
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (五)MySQL的备份及恢复
  • (转)大型网站的系统架构
  • (转)关于pipe()的详细解析
  • (转)人的集合论——移山之道