锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-12-13 00:37:02 cj19b电容器接触器

目录

网页分析

实现初步代码

逆向搜索参数

改写代码

成果展示

锁 (!)?期待你的关注-toc" style="margin-left:40px;"> 我是毕加锁 (锁!)期待您的关注


大家好 我是毕加锁(锁)

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

网页分析

打开网页,随意输入几个单词,发现网页没有静态加载。别担心,我们改变方式,抓住包。

通过搜索,我们在那里Payload发现需要翻译的输入信息,比如我这里的人,然后在这里Preview发现了返回的翻译信息,这里没有上传图片,然后继续看Headers通过观察,可以发现网页是post请求,大概的想法已经出来了,先试着写。

实现初步代码

post我不会在这里解释需要携带的参数,headers,cookies,data等等,基本都会添加。这里需要说明的一点是,如果参数完成后报错,我会再次抓住要求。我在这里卡了很久,后来换了下面的生活字。

importrequests url="https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" headers={ "User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.93Safari/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

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

可以看到ts也就是上面的r和Payload里面的“lts已完成。

  1. 再搞定salt

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

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

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

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

到目前为止,我们已经获得了三个参数,代码也可以重写:

importrequests importtime importrandom url="https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rue"
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 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": "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)  #获取时间戳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}")

成果展示

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章