目录

网页分析

初步代码实现

逆向查找参数

改写代码

成果展示

我是毕加锁 (锁!) 期待你的关注


大家好 我是毕加锁(锁!) 

今天给大家带来的是【js逆向爬虫】-有道翻译js逆向实战

网页分析

打开网页,随意输入几个单词,发现网页不是静态加载的。不着急,我们换方式,抓包。

通过查找,我们在Payload里面发现了输入的需要翻译的信息,比如我这里的“人民”,然后在Preview里面发现了返回的翻译信息,这里我没有上传图片,接着继续看Headers里面的数据,通过观察,会发现网页是post请求,大概的思路就已经出来了,先尝试写一下。

初步代码实现

post请求需要携带的参数我这里就不再说明了,headers,cookies,data等等基本上都会添加。这里需要说明的一点,如参数补全后还报错的话,重新抓取请求,我就是在这里卡了好久,后来换了下面的“生活”一词。

import requests
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36","Cookie": "OUTFOX_SEARCH_USER_ID=2030291441@10.169.0.102; JSESSIONID=aaaL9cZGnEYP5anryhK2x; OUTFOX_SEARCH_USER_ID_NCOO=624916323.622491; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcbn5lLEK4FC4F7BhK2x; ___rl__test__cookies=1639138497978","Referer": "https://fanyi.youdao.com","Content-Length": "252"}
Payload = {"i":"生活","smartresult": "dict","client": "fanyideskweb","salt": "16391384979865","sign": "b1e30cb6bb14501ea6827a83a554dcae","lts": "1639138497986","bv": "e70edeacd2efbca394a58b9e43a6ed2a","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTlME"}
res = requests.post(url, headers=headers, data=Payload)
print(res.status_code)
print(res.text)

第一步基本上就成功了,看一下返回后的结果:

可是当我们想更换一个单词的时候,系统又会报错,比如,我这里换了太阳:

那怎么办呢?我们开始第二步,也就是js逆向

逆向查找参数

通过对上面的代码进行分析我们可以看出,"salt"、"sign"、"lts"、"bv"这四个参数不清楚怎么回事,那就需要打开Initiator下面的js代码去一一查找,定位。

打开后,按ctrl+f搜索,比如我这里搜索的第一个参数“salt”,这里一共12,通过观察找到这一个:

然后将需要的代码复制到Console,回车运行查找规律。比如我这里salt: i,然后i = r + parseInt(10 * Math.random(), 10),r = "" + (new Date).getTime(),通过在console运行后发现,“parseInt(10 * Math.random(), 10)”的意思是随机生成一个0-9的随机数;(new Date).getTime()是当前的一个时间,也叫时间戳。再观察又发现ts: r,bv: t,t = n.md5(navigator.appVersion),运行后得知,t就是我们在发起请求时的 "User-Agent"

那么我们开始代码实现:

  1. 先搞定ts

import time
r = time.time()
r = int(r*1000)
print(r)
>>>1639141944732

可以看到ts也就是上面的r和Payload里面的“lts”已经搞定。

  1. 再搞定salt

先来生成parseInt(10 * Math.random(), 10)的随机数:

import random
s = random.randint(0,10)
print(s)

再来实现i = r + parseInt(10 * Math.random(), 10):

import time
import random
r = time.time()
r = int(r*1000)
s = random.randint(0,10)
i = r+s
print(i)

至此,我们已经拿到了三个参数,代码也可以改写一下了:

import requests
import time
import random
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36","Cookie": "OUTFOX_SEARCH_USER_ID=2030291441@10.169.0.102; JSESSIONID=aaaL9cZGnEYP5anryhK2x; OUTFOX_SEARCH_USER_ID_NCOO=624916323.622491; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcbn5lLEK4FC4F7BhK2x; ___rl__test__cookies=1639138497978","Referer": "https://fanyi.youdao.com","Content-Length": "252"}
#获取时间戳
r = time.time()
r = int(r*1000)
#获取salt
s = random.randint(0,10)
i = r+s
Payload = {"i":"太阳","smartresult": "dict","client": "fanyideskweb","salt": i,"sign": "b1e30cb6bb14501ea6827a83a554dcae","lts": r,"bv": "e70edeacd2efbca394a58b9e43a6ed2a","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTlME"}res = requests.post(url, headers=headers, data=Payload)
print(res.status_code)
print(res.text)
  1. 最后搞定sign

通过观察可以发现:sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT"),能得到的信息有:1.这个是md5加密,2."fanyideskweb"是固定的,3.i前面已经生成了,4.e不知道是什么,5."Y2FYu%TNSbMCxc3t2u^XT"这一部分是固定的。

通过断点调试后发现,e就是我们输入的文字。

最后一步,百度md5怎么加密,这里我感觉是最难的地方,说实话这一块我也不懂,百度的结果如下:

from hashlib import md5string = "**********"m = md5()m.update(string.encode())sign = m.hexdigest()

改写代码

import requests
import time
import random
from hashlib import md5
import json
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36","Cookie": "OUTFOX_SEARCH_USER_ID=2030291441@10.169.0.102; JSESSIONID=aaaL9cZGnEYP5anryhK2x; OUTFOX_SEARCH_USER_ID_NCOO=624916323.622491; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcbn5lLEK4FC4F7BhK2x; ___rl__test__cookies=1639138497978","Referer": "https://fanyi.youdao.com","Content-Length": "252"}
def get_param():lts = int(time.time()*1000)  #获取时间戳ltsrandom_num = random.randint(0,10)salt = lts+random_num        #获取saltword = input("请输入需要翻译的单词:")string = "fanyideskweb" + word + str(salt) + "Y2FYu%TNSbMCxc3t2u^XT"m = md5()m.update(string.encode())sign = m.hexdigest()  #获取md5加密的signreturn word,salt,lts,sign
word,salt,lts,sign = get_param()
Payload = {"i":word,"smartresult": "dict","client": "fanyideskweb","salt": salt,"sign": sign,"lts": lts,"bv": "e70edeacd2efbca394a58b9e43a6ed2a","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTlME"}
res = requests.post(url, headers=headers, data=Payload)
# print(res.text)
data_json = json.loads(res.text)
result = data_json['translateResult'][0][0]
tgt = result['tgt']
src = result['src']
print(f"需要翻译的单词为:{tgt}")
print(f"翻译的结果为:{src}")

成果展示

我是毕加锁 (锁!) 期待你的关注

【js逆向爬虫】-有道翻译js逆向实战相关推荐

  1. python爬虫——有道翻译JS解密

    爬虫兴起的同时,反爬虫手段也在不断更新,今天以有道翻译http://fanyi.youdao.com/为例,介绍破解JavaScript加密的反爬虫基本流程. 分析网页 我们进入网站,随便输入一个内容 ...

  2. 【JavaScript 逆向】某道翻译接口逆向

    前言 现在一些网站对 JavaScript 代码采取了一定的保护措施,比如变量名混淆.执行逻辑混淆.反调试.核心逻辑加密等,有的还对数据接口进行了加密,这次的案例就是对一种 MD5 加密方式的破解. ...

  3. 【爬虫逆向案例】某道翻译js逆向—— sign解密

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! [爬虫逆向案例]某道翻译js逆向-- sign解密 1.前言 2.步骤 3.源码 4.号外 1.前言 相信各位小伙 ...

  4. 爬虫:突破有道翻译js加密(最新)

    爬虫:突破有道翻译js加密 代码已上传至个人GitHub,可供下载: 突破有道翻译js加密 思路:(python版本3.6) 1.分析post上传form信息,发现存在加密行为 2.查看网页js文件, ...

  5. js逆向之有道词js加密解析

    js逆向之有道词js加密解析 文章目录 js逆向之有道词js加密解析 需要用到的工具: 下面就介绍一下3种看js加密的代码方法: 第一种方法: 第二种: 第三种: 下面我们来了解我们要用什么解密md5 ...

  6. 破解有道翻译js加密,纯小白练手

    有道翻译js解析 第一次在csdn上发技术贴,以前都是在印象笔记,主要是最近闲的,太无聊了. 作为开始,想找一个超级简单的,然后循序渐进(比较有仪式感). 想起来当初学爬虫的时候,看韦世东的<P ...

  7. JS解密入门案例:python有道翻译JS解密

    前言 嗨喽!大家好呀,这里是魔王~ 课程亮点: 系统分析网页结构 动态数据抓包演示 json数据解析 JS解密 环境介绍: python 3.8 pycharm >>> 需要安装no ...

  8. JS解密入门——有道翻译

    JS解密入门--有道翻译 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么 ...

  9. 爬虫—有道翻译案例(史上最详细分析教程)

    爬虫-有道翻译案例分析 (此内容仅供参考学习) 最近也是刚开始学爬虫,就做这个比较简单的案例,把学习和分析的思路记录一下~ 关键词:request.post.抓包.js分析.MD5加密等 一.分析思路 ...

  10. python实战爬虫有道翻译与解决{“errorCode”:50}反爬虫问题

    title: python实战爬虫有道翻译与解决有道翻译反爬虫问题 date: 2020-03-22 20:21:12 description: 最近在学Python,一直没有尝试过实战.于是昨天试了 ...

最新文章

  1. 微软批量授权版WINDOWS 10资料(截至到2015年11月,此处无下载地址)
  2. Linux sqlplus权限不足,sqlplus登录用户提示权限不足
  3. html美化计算机,职称计算机Dreamwaver教程:CSS样式表滤镜
  4. 腾讯TencentOS 十年云原生的迭代演进之路
  5. NAB展会新闻:微软和媒体娱乐合作伙伴在Windows Azure平台上发展数字供应链解决方案...
  6. 咕咕(数位dp+AC自动机)
  7. 结对-贪吃蛇游戏-测试过程
  8. 4207. 最长合法括号子序列
  9. Geos库学习之(一)——Geos库介绍和编译
  10. 微信小程序UI设计规范及文档模版
  11. php计算ip掩码,php进行ip地址掩码运算处理的方法
  12. Vue 使用 Apache Echarts 绘制地图(省市、地区)
  13. java课程设计 博客园_201521123098 JAVA课程设计
  14. 电脑通过网口共享网络(WIFI)给其他设备
  15. Linux pwn入门教程,Linux PWN从入门到熟练
  16. 编程实践--现有10元,每瓶饮料2元;2个空瓶换一瓶饮料;4个瓶盖换一瓶饮料;总共能喝多少瓶?
  17. 算法分析一:基础知识
  18. Helios Ethereum Client for Wallets and Dapp
  19. Flink检查点失败问题-汇总
  20. Simple Yet Effective Graph Contrastive Learning for Recommendation

热门文章

  1. Duanxx的技术问题:word界面显示模糊
  2. 计算机应用技术要学java吗,计算机应用技术专业主要学什么
  3. android手机分区调整大小写,如何使用PQMagic调整磁盘分区容量大小
  4. mysql文本类型_mysql里存大量文本的数据类型是text吗?请详细说明一下
  5. 使用Java生成思维导图
  6. 工商银行理财快速刷星汇总
  7. 1005打印任务取消不了 hp_HP打印机打印时任务打印不了时无法取消
  8. 多线段几何图形—— 简单几何图形(从线段中搜索封闭图形)
  9. SCI各领域国际顶尖学术期刊一览
  10. linux搭建服务器有什么用处,Linux配置dns服务器作用是什么?