数据采集面对JS加密无所适从?善用这3个工具,搞定一大半的JS逆向!
在如今的互联网,想要简简单单地通过一个HTTP请求就采集到数据已经是越来越难了。越来越多的网站对网页的数据加强了限制。
其中,最常见的,就是在请求头里面添加各种加密参数,如:token、UUID等请求头。
面对这些加密限制,并不是完全无能为力的。对于大多数网站而言,在了解一定JavaScript脚本知识的基础上,善用下述3个工具,就可以搞定。如果搞不定的,也离搞定不远了。
浏览器调试控制台
浏览器的调试控制台是进行数据采集的小伙伴再熟悉不过的工具了。基本上,网页数据的ajax接口都是通过浏览器的调试控制台找到的。
除了找数据接口,我们还可以直接在调试控制台中寻找加密请求头参数的生成位置,也就是找到它是通过调用哪个JavaScript脚本文件生成的。
在此举个例子,在某网站上,其数据接口的请求需要附带上几个特殊的请求头:
如果请求中不带上这几个头参数,嗯,直接返回错误码。
很显然,这几个参数不会平白无故产生,一定是从什么地方引用或是生成的。这时候,我们就可以通过调试控制台进行搜索:
比如上面举例的请求头参数,我们就搜索到了:
点击一个搜索结果,就会跳转到对应文件的显示界面。在大多数情况下,我们看到的是一堆经过压缩的JavaScript代码,嗯,就像一堆屎一样:
那么密密麻麻的代码,哪里分得清哪是哪呢?这就要借助到下面的工具了
JavaScript代码格式化工具
面对一堆一坨的JavaScript,只有把它们格式化、恢复成本来的面貌才能继续我们的探索之旅。
JavaScript代码格式化的工具有很多,州的先生一般现用现搜,选择自己中意的网站即可:
经过JavaScript代码格式化,我们终于能够看清它本来的面貌了,这就像《千与千寻》里洗干净了澡的河神一样。
把它复制到文本编辑器中,有高亮提示的那种。州的先生一般配合使用VS Code和Notepad++。
继续对它抽丝剥茧,搜索请求头参数对应的JavaScript生成函数。
js2py模块
通常来说,JavaScript代码进行的操作,在Python中也能实现,比如下面这些JavaScript代码:
用来获取时间戳、拼接字符串等,可以直接用Python代码还原。但是如果面对一些比较繁琐的JavaScript函数,比如下图这种:
又臭又长,那还是通过Python直接调用执行这个JavaScript函数吧。
有很多Python第三方模块提供了在Python中执行JavaScript代码的功能,州的先生经常使用的是js2py这个模块。
直接把JavaScript代码里面的函数以字符串的形式复制Python文件中,赋值给一个变量,直接调用即可:
>>> import js2py
>>> f = js2py.eval_js('function f(x) {return x + x}')
>>> f(2)
4
>>> f()
nan
>>> f(f)
function f(x) { [python code] }function f(x) { [python code] }
简单、直接、粗暴。
最后
通过这三个工具,基本可以找到加密函数、加密参数和位置,它们的生成方式,以及通过Python代码对其进行生成。然后就是一顿操作猛如虎,顺利拿到数据了。
- HashSet集合中hashCode及equals方法详解
- 企鹅智造企业发展论坛:共话小程序生态下的企业营销
- MySQL(十六)之MySQL用户管理
- JavaScript中this关键字使用
- thrift:swift项目笔记
- Java常用类(五)之集合工具类Collections
- Windows8小技巧(1)—Map Network Drive
- mysql: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for opera
- tomcat 8.5.9.0 解决catalina.out过大的问题
- 物联网是如何驱动网络变革的?——上
- Java常用类(四)之数组工具类Arrays
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
- HashSet/HashMap详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一分钟学Python|Python的字典
- MySQL information_schema详解 ENGINES
- 一日一技:不用轮询,基于事件监控文件变动
- Python 基础(十七):装饰器
- XtraBackup工具详解 Part 10 使用innobackupex对数据库进行部分备份(指定表或数据库)
- Python 基础(十九):数学相关模块
- XtraBackup工具详解 Part 11 使用innobackupex对部分备份进行恢复
- XtraBackup工具详解 Part 12 流式和压缩备份
- 基于STM32+RT-Thread的新冠肺炎疫情监控平台
- Python 基础(二十):sys 模块
- [Oracle 故障处理]记一次Windows监听启动失败
- Python 基础(二十一):argparse 模块
- LeetCode 4 题解
- 操作系统与 CPU 是怎么执行线程的?
- LeetCode 5 题解