JS逆向必会基础案例

2023-10-27

动态网页爬虫一般可分为两种:Selenium爬取和接口爬取。两种方式各有优缺点:前者虽然可以很好地处理网页异步加载问题,但面对大型爬虫任务时,效率还是比较低的;后者虽然爬取速度较快,但请求参数很可能是动态变化的,这时就需要利用一些前端的知识,重新构造参数,整个过程通常称为JS逆向

今天,我们就来分享一个JS逆向的基础案例——有道翻译参数破解
在这里插入图片描述

一、分析Post请求参数

爬取网址为有道翻译,利用谷歌浏览器抓包后,找到翻译响应如下:
在这里插入图片描述
注意:响应返回的是post请求,不是以往我们接触的get请求。此时,直接将URL复制到浏览器去访问,是无法获取数据的,如下图所示:
在这里插入图片描述
此时,我们可以通过requests模块中post方法来传入data参数(通常是以字典形式),以此来正常访问页面。

requests.post(url,headers=header,data=from_data #data为需要传入的参数)

那需要传哪些参数呢?我们可以在Headers下的From data中找到,如下图所示:
在这里插入图片描述
在这里插入图片描述

通过比对不同翻译的响应,可知动态参数为i、salt、sign、lts,其中参数i是我们需要翻译的词。因此,我们可以初步构建from_data字典如下:

from_data={
    'i': word,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt':salt,
    'sign':sign,
    'lts':lts,
    'bv':'4b1009b506fa4405f21e207abc4459fd',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION',
    }

接下来就是寻找salt、sign、lts是如何构成的,然后传入上述字典即可。

二、分析参数来源

首先,我们打开搜索栏,尝试搜索salt参数(当然其他两个也是可以的),基本步骤如下
在这里插入图片描述
点击进入JS文件后,可按如下方式均可美化代码,便于后续分析代码。
在这里插入图片描述
接下来,按照同样的方法,对参数salt进行搜索,结果共12个。挨个慢慢找哪些是能构成salt参数的,最终结果如下:
在这里插入图片描述
关于navigator.appVersion(new Date).getTime()等这些参数的含义,其实是与javascript相关的语句,通过百度即可了解。不过我们也可以通过console控制台初步了解。点击console控制台,输入console.log(navigator.appVersion)即可得到其结果,如下图所示:

在这里插入图片描述

从上述结果,我们可知道navigator.appVersion与用户代理有关(不知道也没事,反正是个常量),(new Date).getTime()与时间戳非常接近,通过比较时间戳后可知它是当前时间戳乘以1000取整构成的,parseInt(10*Math.random(),10)是生成0-10的随机数。当然,对于sign值还有个e,我们还不了解,这里可以打断点进行分析,如下图所示(断点处不一定非要8376行,在其之后也可以)

在这里插入图片描述
打完断点,点击翻译,即可得到各个参数返回的值。这里,我们整理下各参数值的含义

参数 含义
e 需要翻译的词
t navigator.appVersion进行md5加密
r 当前时间戳*1000取整
i r值+0-10的随机数
ts r值
bv t值
salt i值
sign "fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@" 进行md5加密

三、Python重新构造参数

经过以上分析,我们只要利用Python将上述参数重构即可啦,该部分代码如下:

  • ts值
def get_ts():
    ts=int(time.time()*1000)
    return ts
  • salt值
def get_salt(ts):
    num = int(random.random()*10)
    salt = str(ts) + str(num)
    return salt
  • sign值
def get_sign():
    left = 'fanyideskweb'
    e= 'stop'  #翻译的词
    i = get_salt(get_ts())
    right = 'Tbh5E8=q6U3EXe+&L[4c@'
    str_data = left + e + i + right 
    m=hashlib.md5()
    m.update(str_data.encode('utf-8'))
    sign=m.hexdigest()
    return sign

全部代码

以类进行封装如下(注意,headers要带上cookie)

import requests
import time
import random
import hashlib


class youdao:
    def __init__(self, url, header, word):
        self.url = url
        self.header = header
        self.word = word

    def get_ts(self):
        self.ts = int(time.time()*1000)
        return self.ts

    def get_salt(self, ts):
        self.num = int(random.random()*10)
        self.salt = str(ts) + str(self.num)
        return self.salt

    def get_sign(self, salt):
        left = 'fanyideskweb'
        e = self.word  # 翻译的词,图中的e
        i = salt
        right = 'Tbh5E8=q6U3EXe+&L[4c@'
        str_data = left + e + i + right
        m = hashlib.md5()
        m.update(str_data.encode('utf-8'))
        sign = m.hexdigest()
        return sign

    def get_from_data(self):
        ts = self.get_ts()
        salt = self.get_salt(ts)
        from_data = {
            'i': self.word,
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'salt': salt,
            'sign': self.get_sign(salt),
            'lts': ts,
            'bv': '4abf2733c66fbf953861095a23a839a8',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_CLICKBUTTION',
        }
        return from_data


if __name__ == '__main__':
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
              'Referer': 'http://fanyi.youdao.com/',
              'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=920530045.7161942; OUTFOX_SEARCH_USER_ID="1506261127@10.108.160.17"; _ga=GA1.2.1288125049.1599879702; _ntes_nnid=7dc5dc11be36895d173bef7fe1b51cb1,1606305443534; JSESSIONID=aaaAC5o5FTuNsgXAdm7Dx; ___rl__test__cookies=1612686603098'
              }
    word = 'enthusiastic'
    fanyi = youdao(url, header, word)
    r = requests.post(url, headers=header, data=fanyi.get_from_data())
    data = r.json()
    print("输入单词:{},翻译为{}".format(
        data['translateResult'][0][0]['src'], data['translateResult'][0][0]['tgt']))

在这里插入图片描述

以上就是本次分享的全部内容~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS逆向必会基础案例 的相关文章

随机推荐

  • cad汉仪长仿宋体_长仿宋体字体下载 cad工程机械绘图工程制图国标字体下载

    做CAD很多时候要用到国标字体 CAD制图上用的国标字体一般就是长仿宋体 特此小编给大家分享 ttf格式的cad工程机械绘图工程制图国标字体下载 长仿宋体字体一般是专门用来做cad工程机械绘制效果图中使用 希望大家喜欢 界面预览图 在很多专
  • zlib库自定义接口封装

    zlib库自定义接口封装 zlib封装类说明 编译zlib库 编译自定义接口静态库 测试代码 代码 文件链接 zlib封装类说明 实现对文件以及文件夹的压缩解压缩 zip unzip h ifndef ZIP UNZIP H define
  • 《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi

    题目描述 编程实现字符串到整数的转换 例如输入字符串 123456 输出整数12345 函数atoi atoi 是把字符串转换成整型数的一个函数 包含在头文件stdlib h中 函数原型 int atoi const char nptr 参
  • 电机控制里的谐波和逆变器非线性探讨

    电机控制里的谐波或逆变器非线性探讨 一 逆变器非线性第一个主要原因是死区时间及器件延迟时间 二 逆变器非线性第二原因是功率管的压降 三 逆变器的非线性会引起零电流箝位现象 导致电流波形不够正旋 增大了谐波干扰 并且在一个周期中会有6次电流畸
  • 诚之和:使用Java+Swing实现医院管理系统的实战练习 附完整实例代码

    本篇文章将和大家分享使用Java的Swing工具类来完成医院管理系统的实战练习 有兴趣的小伙伴们可以一起实操学习一下 本文内容有助于大家对于Java的学习和理解 一 系统介绍 本系统实现的以下功能 管理员功能 登录系统 病人信息的增删改查
  • 写一个手机类,属性:品牌brand,价格price 行为:打电话Call,发短信Message,打游戏Game 要用到this和Private的知识点

    初写手机类 这个程序是初步的程序 还有很多细节没补上 等到学到后面再逐渐完善了 class Demond Phone public static void main String args Phone p1 new Phone p1 set
  • centos8 网卡无法启动,且无ip

    centos8 网卡无法启动 且无ip 1 NetworkManger未运行 错误 网络管理器 NetworkManager 未运行 解决 将NetworkManger设置为开机自启动 systemctl enable NetworkMan
  • 《Stable Diffusion WebUI如何下载模型》

    接上一个教程 现在开始使用Stable Diffusion 自己训练模型太花时间了 直接下载别人训练好的模型可以省很多事 左上面stable Diffusion checkpoint就是我们的模型 现在里面什么都没有 1 点击选择上面的Ci
  • map,filter,some,every,find方法的区别(通俗易懂)

    map filter some every都是原数组不受改变 而foreach是在原数组上改变 map 返回新数组 在原数组上进行数据处理 只会在原有数组上元素内容改变 数组长度不变 filter 返回新数组 在原数组上判断是否满足条件来进
  • 结构体计算大小与位域计算大小

    结构体的大小计算 原则一 结构体的元素按顺序存储 结构体成员的偏移量必须是成员大小的整数倍 原则二 结构体大小是所有成员大小的整数倍 除了内部结构体和数组 看例子比较快理解 以下是自己的理解 指针的占字节数要看是32还是64位 32占4字节
  • 马士兵_JAVA自学之路

    JAVA自学之路 一 学会选择 为了就业 不少同学参加各种各样的培训 决心做软件的 大多数人选的是java 或是 net 也有一些选择了手机 嵌入式 游戏 3G 测试等 那么究竟应该选择什么方向呢 我的意见是 不要太过相信各种培训机构或是抢
  • 解决:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x81 in position 18: illegal multibyte sequence

    意思就是 UnicodeDecodeError gbk 编解码器无法解码位置18中的字节0x81 非法的多字节序列 这是我使用python发送邮件的时候出现的报错信息 我编码格式使用的是utf 8并不是gbk 但是却无法解码 于是我回头看之
  • 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家...

    在使用win7系统电脑的时间一长 出现的电脑故障也就会越多 这大多数都是用户自己所造成的 例如有用户的win7系统在运行过程中总是会出现严重卡顿的情况 这让许多用户都感到很难受 那么win7卡顿严重怎么解决呢 下面小编就来告诉大家win7运
  • shineblink ZE08K-CH2O甲醛测量

    甲醛传感器 一 本例程实现功能 二 传感器介绍 三 接线图 四 完整代码 五 代码运行结果 一 本例程实现功能 通过Core连接甲醛传感器 读取传感器的值 并打印输出结果 二 传感器介绍 三 接线图 注意 传感器的 5 引脚也可以不用连接到
  • 师傅领进门之6步教你跑通一个AI程序!

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由云计算基础发表于云 社区专栏 源码下载地址请点击原文查看 初学机器学习 写篇文章mark一下 希望能为将入坑者解点惑 本文介绍一些机器学习的入门知识 从安装环境到跑通机器学习入
  • linux虚拟机web服务器

    在Linux虚拟机中 常见的Web服务器软件有很多 比如Apache Nginx Lighttpd等 其中 Apache是使用最广泛的Web服务器软件 因为它稳定可靠 功能强大 易于配置和扩展 Nginx则是一个高性能 轻量级的Web服务器
  • python快速入门篇1-数据结构与算法(Python)

    原文链接 https blog csdn net wangdingqiaoit article details 77620393 写在前面 python语言以其语法简洁 代码量比java开发的程序少3 5倍 比c 少5 10倍 快速原型开发
  • 《Adjacent-level Feature Cross-Fusion with 3D CNN for Remote Sensing Image Change Detection》论文笔记

    论文 邻接层特征交叉融合与三维CNN用于遥感图像变化检测 作者 日期 2023 2 10 贡献点 提出了一种用于遥感图像变化检测的端到端三维卷积网络 与现有的特征融合策略不同 该网络利用三维卷积的内在融合特性 是变化检测领域的一种创新尝试
  • Tomcat

    目录 一 Tomcat 的下载安装 二 启动 Tomcat 三 访问一下 Tomcat 的欢迎页面 四 Tomcat 的使用 tomcat 是 java 中最知名 最广泛使用的 HTTP 服务器 一 Tomcat 的下载安装 在浏览器中 搜
  • JS逆向必会基础案例

    动态网页爬虫一般可分为两种 Selenium爬取和接口爬取 两种方式各有优缺点 前者虽然可以很好地处理网页异步加载问题 但面对大型爬虫任务时 效率还是比较低的 后者虽然爬取速度较快 但请求参数很可能是动态变化的 这时就需要利用一些前端的知识