首页 > 其他分享 >【js逆向爬虫】-有道翻译js逆向实战

【js逆向爬虫】-有道翻译js逆向实战

时间:2022-12-30 10:05:40浏览次数:34  
标签:lts 逆向 10 random 爬虫 sign headers js salt


目录

​​网页分析​​

​​初步代码实现​​

​​逆向查找参数​​

​​改写代码​​

​​成果展示​​

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



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

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

网页分析

【js逆向爬虫】-有道翻译js逆向实战_json

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

【js逆向爬虫】-有道翻译js逆向实战_json_02

通过查找,我们在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": "[email protected]; 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逆向爬虫】-有道翻译js逆向实战_大数据_03

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

【js逆向爬虫】-有道翻译js逆向实战_ide_04

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

逆向查找参数

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

【js逆向爬虫】-有道翻译js逆向实战_大数据_05

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

【js逆向爬虫】-有道翻译js逆向实战_json_06

然后将需要的代码复制到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"

【js逆向爬虫】-有道翻译js逆向实战_ide_07

那么我们开始代码实现:

  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": "[email protected]; 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就是我们输入的文字。

【js逆向爬虫】-有道翻译js逆向实战_bc_08

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

from hashlib import md5
string = "**********"
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": "[email protected]; 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) #获取时间戳lts
random_num = random.randint(0,10)
salt = lts+random_num #获取salt
word = input("请输入需要翻译的单词:")
string = "fanyideskweb" + word + str(salt) + "Y2FYu%TNSbMCxc3t2u^XT"
m = md5()
m.update(string.encode())
sign = m.hexdigest() #获取md5加密的sign
return 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逆向实战_json_09

毕加锁 (锁!)

【js逆向爬虫】-有道翻译js逆向实战_bc_10

标签:lts,逆向,10,random,爬虫,sign,headers,js,salt
From: https://blog.51cto.com/u_15687734/5979098

相关文章

  • 制作一个谷歌浏览器插件,实现网页数据爬虫
    一、什么是浏览器插件浏览器插件,基于浏览器的原有功能,另外增加新功能的工具,是可定制浏览体验的小型软件程序,让用户可以根据个人需要或偏好来定制浏览器。如拦截网页中的广告......
  • js使用escape编码、unescape解码、
     一、js使用escape编码编码前//编码前的JSON.stringify(playitemArr)"console.error("编码前的JSON.stringify(playitemArr)");console.error(JSON.stringify(playi......
  • nodejs express multer 中文名乱码【转】
    文件上传服务器端接收的文件列表中文件名不支持中文,都是乱码,查询发现nodejs对中文支持的不好。找了半天,发现这个解决方法确实有效!!!!!核心代码//解决中文名乱码的问题f......
  • 【爬虫实战项目】Python爬虫批量下载网易云音乐飙升榜并保存本地(附源码)
    前言今天给大家介绍的是Python爬虫批量下载音乐飙升榜并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得。首先是爬取之前应该尽可能伪装成浏览器而不被识别出来......
  • P1198 JSOI2008 最大数
    P1198JSOI2008最大数-洛谷|计算机科学教育新生态(luogu.com.cn)采用ST表维护RMQ。对于插入操作,设插入后数列长度变为\(n\),我们只需重新修改满足\(i+2^j-......
  • JS Date
    镇楼图Pixiv:torinoDate构造DateJS中Date提供了时间日期相关的操作Unix时间戳:指自1970年1月1日00:00:00UTC开始经过的毫秒数,为一整数值,这也是大多数编程语言......
  • JS高级
    this指向分析指向直接调用,指向window通过对象调用,指向对象call/apply总结:跟位置无关,跟调用方式有关。只有在执行的时候this指向才会被确定绑定规则:默认......
  • JS对象
    声明对象方式对象字面量varobj1={name:'xx',age:88,}newObject()varobj2=newObject()obj2.name='xx'new自定义类functionPerson(){}varobj3......
  • JS事件
    事件处理三种方案元素上el.onclickwindow.addEventListener(fn)事件流事件冒泡:默认情况下事件是从最内层往外传递的顺序,这个顺序就称为事件冒泡事件捕获:从外层到......
  • JS中回调函数的概念
    概要:Js中回调函数的概念...个人理解:回调函数的定义:将一个函数作为参数的形式传入另一个函数中,那么这个函数就是回调函数,另一个函数可以决定在何时何处调用这个传入的回......