【Python】逆向解析js代码

news2024/9/21 7:17:24

目录

1. 打开百度翻译网页,查找翻译结果的网络资源包

2. 获取翻译结果网络资源包的url、请求头、请求体,解析json文件数据

3. 观察请求体字段,发现 query 字段便是我们输入的需要翻译的值

4. ctrl F 快捷键搜索sign值的网络资源包,并逐一检查

5. 拿到与请求体的结构高度相似的资源包,通过资源包查看 js 代码

6. 打上断点,网页重新进行翻译操作

7. 进入生成sing值的 b 函数

8. 新建 GetSign.js 文件,将生成 sign 的相关函数复制进去

9. 下载能够调用 js 代码的包——PyExecJS,并测试能否得到 sign 值

10. python调用获取 sign值 的 js代码,并设计循环输入翻译


示例:通过爬虫,获取百度翻译结果的数据包,实现翻译程序

注:本代码仅供学习使用,无任何商业用途

1. 打开百度翻译网页,查找翻译结果的网络资源包

示例输入:你好世界

2. 获取翻译结果网络资源包的url、请求头、请求体,解析json文件数据

import requests
import json

url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'

head = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Acs-Token': '1681821543479_1681821547074_cdT+RJYeqGduG6BGb1EQqooYQeVUGl4fWWVaRRFLLS9VMj1oUeo7+LGHskLILBwXG5ixw+3TmSgPA3eXigF/SZJvUY7ZBCSG2bHqPTeCE5vksblcieD5l2xmK/SK5Mg2mx63+EqIsrlVUBsgRRzhmcvKeRiHzQ6mw8CN03KrdjAGQASyEwH418TOl+mU7a9cI+wDmoPRhTJ+nATiAn2OoJlCHDpvmWN+7D92f7EQmVuBI0N8j+fs+vJ8rvT6S+o9ToY0IJQzl0U/leQ/qAv0jFStvp+I6dZixZdh6aCzin9sCVKdEGgt2/LBmFE1USpx3IJBnOzRq+LE7DWZu6mm5gAtWbyI2bLvWKeFA2G9+2Oz0iYR5fqrT8+jPjyB8FbJsviypmeSFBP8AhymqOQUJS9eXYCpMBVyFiv9H2zaONxZ7pYhG4yzhWEja/wLZSgKWbb32C2wTbHPwUd7AUfsAbOilLvs7hrwW6i9V7Pp6rc=',
    'Connection': 'keep-alive',
    'Content-Length': '165',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'BAIDUID=0647EC4156FC828CCBB17B759524E3CB:FG=1; APPGUIDE_10_0_2=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BIDUPSID=0647EC4156FC828CCBB17B759524E3CB; PSTM=1677378660; BAIDUID_BFESS=0647EC4156FC828CCBB17B759524E3CB:FG=1; BA_HECTOR=aha124a58g81a481a184249r1i3sgie1n; ZFY=jo6gNdVtZQsuvZ3s6FJsXdFdp7ChS0d1062AcKWdkuE:C; H_PS_PSSID=38516_36547_38469_38368_38468_38486_37931_26350_22157; delPer=0; PSINO=5; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BCLID=7777928453825166006; BCLID_BFESS=7777928453825166006; BDSFRCVID=4A0OJexroG07VWbfhAjSrpnZrLweG7bTDYrEOwXPsp3LGJLVFe3JEG0Pts1-dEu-S2OOogKKKgOTHICF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; BDSFRCVID_BFESS=4A0OJexroG07VWbfhAjSrpnZrLweG7bTDYrEOwXPsp3LGJLVFe3JEG0Pts1-dEu-S2OOogKKKgOTHICF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tRAOoC_-tDvDqTrP-trf5DCShUFstU_jB2Q-XPoO3KtbSx3Pb47NMltXKMTzbf7f5mkf3fbgy4op8P3y0bb2DUA1y4vp0tLeWeTxoUJ2-KDVeh5Gqq-KXU4ebPRiB-b9QgbA5hQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0HPonHjD5j6vL3D; H_BDCLCKID_SF_BFESS=tRAOoC_-tDvDqTrP-trf5DCShUFstU_jB2Q-XPoO3KtbSx3Pb47NMltXKMTzbf7f5mkf3fbgy4op8P3y0bb2DUA1y4vp0tLeWeTxoUJ2-KDVeh5Gqq-KXU4ebPRiB-b9QgbA5hQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0HPonHjD5j6vL3D; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1679997333,1681233344,1681821530; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1681821542; ab_sr=1.0.1_MWRjYzE0MDliYTg3MWQ4ZWYxNGQwNDgwNDkwNzk5YTkxNmZhYzE4MWUyM2I2NWVlY2Y2NmI4MjM4NTk4Mjk2ZGE1NmFhM2IxYzUxZDczZTAyZWQ1NTc3YzQ2M2Q5YzZiZmY5YmIyMjI5YjU5MTViNjE4MmVjZjBhYjYyZmIxNDc0NTM5YzI0OWNiMjVjZDQzOWU1ZDNmOTU5MTk0ZGZkYw==',
    'Host': 'fanyi.baidu.com',
    'Origin': 'https://fanyi.baidu.com',
    'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh',
    'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}

data = {
    'from': 'zh',
    'to': 'en',
    'query': '你好世界',
    'transtype': 'realtime',
    'simple_means_flag': 3,
    'sign': '1265.321472',
    'token': '29bebf2fa756361e24b224d2c2b0151f',
    'domain': 'common'
}

response = requests.post(url, headers=head, data=data)
print(response.text)
print(response.status_code)

res = json.loads(response.text)
val = res['trans_result']['data'][0]['dst']
print(val)

3. 观察请求体字段,发现 query 字段便是我们输入的需要翻译的值

修改 query 字段里面的值,进行翻译验证

 出现报错信息,我们重新在网页进行翻译验证,观察并比较请求体信息

观察可得,随着 query 的改变,sign 也一起改变了,sign 的值看起来并无规律,所以我们接下来逆向解析js代码,获取sign

4. ctrl F 快捷键搜索sign值的网络资源包,并逐一检查

5. 拿到与请求体的结构高度相似的资源包,通过资源包查看 js 代码

在资源包响应体response内部点击右键,选择进入源代码,搜索sign并找到第17个sign处,发现sign的值和函数 b 以及参数 i 有关,并且参数 i 的值就是 query 的值

6. 打上断点,网页重新进行翻译操作

停到断点处之后,点击右上角箭头,调试下一步,进入函数

7. 进入生成sing值的 b 函数

b 函数的代码实现原理是什么我们不关心,我们需要一步步调试,找到和 b 函数相关的函数有哪些,然后一起复制进一个新建的 js 文件

8. 新建 GetSign.js 文件,将生成 sign 的相关函数复制进去

通过调试可得,相关的函数还有一个 n 函数,将 n 函数与 b 函数一起复制进入GetSign.js里面

观察其他 n 函数代码格式,修改函数的命名格式

9. 下载能够调用 js 代码的包——PyExecJS,并测试能否得到 sign 值

# pip install PyExecJS
import execjs

with open("GetSign.js", 'r', encoding='utf-8') as f:
    ctx = execjs.compile(f.read())
    sign = ctx.call('GetSign', '我的世界')  # 函数名 + 参数

print(sign)

运行报错 window 未定义

在前端 js 代码查找window,发现 b 函数内的 window 与 r 值相关,而且是对 r 赋值

将 b 函数调试结束,我们可以得到 r 的值, 我们直接对 r 赋值

成功得到 sign 值

10. python调用获取 sign值 的 js代码,并设计循环输入翻译

import requests
import json
import execjs

url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'

head = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Acs-Token': '1681821543479_1681821547074_cdT+RJYeqGduG6BGb1EQqooYQeVUGl4fWWVaRRFLLS9VMj1oUeo7+LGHskLILBwXG5ixw+3TmSgPA3eXigF/SZJvUY7ZBCSG2bHqPTeCE5vksblcieD5l2xmK/SK5Mg2mx63+EqIsrlVUBsgRRzhmcvKeRiHzQ6mw8CN03KrdjAGQASyEwH418TOl+mU7a9cI+wDmoPRhTJ+nATiAn2OoJlCHDpvmWN+7D92f7EQmVuBI0N8j+fs+vJ8rvT6S+o9ToY0IJQzl0U/leQ/qAv0jFStvp+I6dZixZdh6aCzin9sCVKdEGgt2/LBmFE1USpx3IJBnOzRq+LE7DWZu6mm5gAtWbyI2bLvWKeFA2G9+2Oz0iYR5fqrT8+jPjyB8FbJsviypmeSFBP8AhymqOQUJS9eXYCpMBVyFiv9H2zaONxZ7pYhG4yzhWEja/wLZSgKWbb32C2wTbHPwUd7AUfsAbOilLvs7hrwW6i9V7Pp6rc=',
    'Connection': 'keep-alive',
    'Content-Length': '165',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'BAIDUID=0647EC4156FC828CCBB17B759524E3CB:FG=1; APPGUIDE_10_0_2=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BIDUPSID=0647EC4156FC828CCBB17B759524E3CB; PSTM=1677378660; BAIDUID_BFESS=0647EC4156FC828CCBB17B759524E3CB:FG=1; BA_HECTOR=aha124a58g81a481a184249r1i3sgie1n; ZFY=jo6gNdVtZQsuvZ3s6FJsXdFdp7ChS0d1062AcKWdkuE:C; H_PS_PSSID=38516_36547_38469_38368_38468_38486_37931_26350_22157; delPer=0; PSINO=5; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BCLID=7777928453825166006; BCLID_BFESS=7777928453825166006; BDSFRCVID=4A0OJexroG07VWbfhAjSrpnZrLweG7bTDYrEOwXPsp3LGJLVFe3JEG0Pts1-dEu-S2OOogKKKgOTHICF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; BDSFRCVID_BFESS=4A0OJexroG07VWbfhAjSrpnZrLweG7bTDYrEOwXPsp3LGJLVFe3JEG0Pts1-dEu-S2OOogKKKgOTHICF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tRAOoC_-tDvDqTrP-trf5DCShUFstU_jB2Q-XPoO3KtbSx3Pb47NMltXKMTzbf7f5mkf3fbgy4op8P3y0bb2DUA1y4vp0tLeWeTxoUJ2-KDVeh5Gqq-KXU4ebPRiB-b9QgbA5hQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0HPonHjD5j6vL3D; H_BDCLCKID_SF_BFESS=tRAOoC_-tDvDqTrP-trf5DCShUFstU_jB2Q-XPoO3KtbSx3Pb47NMltXKMTzbf7f5mkf3fbgy4op8P3y0bb2DUA1y4vp0tLeWeTxoUJ2-KDVeh5Gqq-KXU4ebPRiB-b9QgbA5hQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0HPonHjD5j6vL3D; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1679997333,1681233344,1681821530; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1681821542; ab_sr=1.0.1_MWRjYzE0MDliYTg3MWQ4ZWYxNGQwNDgwNDkwNzk5YTkxNmZhYzE4MWUyM2I2NWVlY2Y2NmI4MjM4NTk4Mjk2ZGE1NmFhM2IxYzUxZDczZTAyZWQ1NTc3YzQ2M2Q5YzZiZmY5YmIyMjI5YjU5MTViNjE4MmVjZjBhYjYyZmIxNDc0NTM5YzI0OWNiMjVjZDQzOWU1ZDNmOTU5MTk0ZGZkYw==',
    'Host': 'fanyi.baidu.com',
    'Origin': 'https://fanyi.baidu.com',
    'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh',
    'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}


while True:
    with open("GetSign.js", "r", encoding="utf-8") as f:
        Source = input('请输入被翻译文本:')
        ctx = execjs.compile(f.read())
        sign = ctx.call("GetSign", Source)

    data = {
        'from': 'zh',
        'to': 'en',
        'query': Source,
        'transtype': 'realtime',
        'simple_means_flag': 3,
        'sign': sign,
        'token': '29bebf2fa756361e24b224d2c2b0151f',
        'domain': 'common'
    }

    response = requests.post(url, headers=head, data=data)
    # print(response.text)
    # print(response.status_code)

    res = json.loads(response.text)
    val = res['trans_result']['data'][0]['dst']
    print(val)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自然语言处理:词嵌入简介

动动发财的小手,点个赞吧! Word Embeddings 机器学习模型“查看”数据的方式与我们(人类)的方式不同。例如,我们可以轻松理解“我看到一只猫”这一文本,但我们的模型却不能——它们需要特征向量。此类向量或…

MongoDB 聚合管道的集合关联($lookup)及合并($unionWith)

目前为止,我们已经介绍了一部分聚合管道中的管道参数: $match:文档过滤 $group:文档分组,并介绍了分组中的常用操作:$addToSet,$avg,$sum,$min,$max等。 $add…

python OCR识别验证码

1. 抓取网页验证码图像并保存 import lxml.html, urllib3# 使用urllib3抓取网页数据 http urllib3.PoolManager() html http.request(GET,site).data# 使用lxml解析网页数据 tree lxml.html.fromstring(html) # 解析HTML,补全不完整的格式 fixedhtml lxml.ht…

LeetCode:102. 二叉树的层序遍历

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 可以参考👉LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二…

机器学习 特征工程

文章目录 一、数据预处理1. 缺失值处理1.1 删除1.2 统计值填充1.3 前后向值填充1.4 直接忽略1.5 模型预测 2. 异常值处理 二、特征提取1. 数值型特征提取1.1 标准化与缩放1.1.1标准化(Standardization)1.1.2 归一化(Normalization&#xff09…

STM32F4_定时器精讲(TIM)

目录 1. 什么是定时器? 2. STM32定时器简介 2.1 高级控制定时器 TIM1和TIM8 2.1.1 TIM1和TIM8简介 2.1.2 时基单元 2.1.3 计数器模式 2.1.4 重复计数器 2.1.5 时钟选择 2.1.6 捕获/比较通道 2.1.7 输入捕获模式 2.1.8 其他功能 2.2 通用定时器 TIM2到TI…

算法----删点成林

题目 给出二叉树的根节点 root,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。 返回森林中的每棵树。你可以按任意顺序组…

2023年天梯赛模拟赛

//能力有限&#xff0c;只展示一百分代码。前八个题一般是原题&#xff0c;所以不展示题目。 L1-1 嫑废话上代码 #include<bits/stdc.h> using namespace std; int main(){cout<<"Talk is cheap. Show me the code.";return 0; } L1-2 九牛一毛 这是…

Leetcode每日一题——“移除元素”

各位CSDN的uu们你们好呀&#xff0c;小雅兰又来啦&#xff0c;今天&#xff0c;小雅兰的内容是移除元素&#xff0c;下面&#xff0c;让我们进入Leetcode的世界吧 说明: 为什么返回数值是整数&#xff0c;但输出的答案是数组呢? 请注意&#xff0c;输入数组是以「引用」方式…

ChatGPT | 使用new bing的简易教程

1. 教程参考&#xff1a; https://juejin.cn/post/7199557716998078522 2.在参考上述教程遇到的问题与解决 2.1 下载dev浏览器的网址打不开 egde dev下载地址&#xff08;上面网站上的&#xff09;我电脑打不开 换用下面的网址即可 https://www.microsoftedgeinsider.com/z…

在three.js中废置对象

基于three.js子如何废置对象(How to dispose of objects) 前言: 为了提高性能,并避免应用程序中的内存泄露,一个重要的方面是废置未使用的类库实体。 每当创建一个three.js中的实例时,都会分配一定数量的内存。然而,three.js会创建在渲染中所必需的特定对象, 例如几何…

4.11、socket地址

4.11、socket地址1.通用 socket 地址2.专用socket地址1.通用 socket 地址 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr&#xff0c;其定义如下&#xff1a; // socket地址其实是一个结构体&#xff0c;封装端口号和IP等信息。后面的socket相关的api中需要使用…

【c语言】每日一题之汉诺塔类型

目录 前言题目说明描述 题目分析汉诺塔问题 题目代码展示 前言 大佬们&#xff0c;我又回来了&#xff0c;最近也在忙自己的学业&#xff0c;忙着生活对线&#xff0c;也参加了今年的蓝桥杯其他的组&#xff0c;发现今年太难了 &#xff0c;摆烂了。但我想到了读者你们&#x…

前端面试之JavaScript题目,简单全面(持续更新ing...)

数据类型 1.JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; 类型&#xff1a;JavaScript共有8种数据类型&#xff0c;undefined&#xff0c;null&#xff0c;Boolean&#xff0c;string&#xff0c;number&#xff0c;bigint&#xff0c;symbol&#xff0c;obj…

K-计算面积

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小w给你三种图形&#xff0c;可能是平行四边形&#xff0c;三角形&#xff0c;梯形&#xff0c;对于给定的TTT个图形&#xff0c;你需要依次回答每个图形的面积&#xff0c;保证答案…

《LeetCode》——LeetCode刷题日记

本期&#xff0c;将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。 目录 &#xff08;一&#xff09;606. 根据二叉树创建字符串 &#x1f4a5;题意分析 &#x1f4a5;解题思路 &#xff08;二&#xff09;102. 二叉树的层序遍历 &#x1f4a5;题意分析 &#…

docker stats 命令详解

docker stats : 显示容器资源的使用情况&#xff0c;包括&#xff1a;CPU、内存、网络 I/O 等。 docker stats [OPTIONS] [CONTAINER...]OPTIONS 说明&#xff1a; –all , -a :显示所有的容器&#xff0c;包括未运行的。 –format :指定返回值的模板文件。 –no-stream :展…

( “树” 之 BFS) 637. 二叉树的层平均值 ——【Leetcode每日一题】

637. 二叉树的层平均值 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,1…

060202体积弧长-定积分在几何学上的应用-定积分的应用

文章目录 2 体积2.1 旋转体的体积2.2 平行截截面面积已知的立体的体积2.3 例题 3 平面曲线的弧长2.1 直接坐标系2.2 参数方程2.3 极坐标系 结语 2 体积 2.1 旋转体的体积 情形①平面图形由 y f ( x ) , y 0 , x a , x b yf(x),y0,xa,xb yf(x),y0,xa,xb所围成&#xff0c;…

LeetCode——1041. 困于环中的机器人

一、题目 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向是y轴的正方向。 南方向是y轴的负方向。 东方向是x轴的正方向。 西方向是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&#xff1a;直走 1 个单位 “L”…