url:https://www.aqistudy.cn/apinew/aqistudyapi.php

分析思路:

原图

现图

1,我们点击查询按钮后发现抓取到了2个一样的数据包,包含请求url和post的请求方式

2,发起多次请求发现 请求参数 d 是动态加密的数据值,我们只要能破解其中一个数据包的内容剩下的一个也可以同理破解


3,返回的响应数据就是我们想要捕获的空气指标数据值,我们发现响应数据也是一组被加密的密文数据,我们必须将密文数据解密成原文数据才可以被我们使用

4,通过类型可以看见发起的是ajax请求

分析的结论

请求url
Request URL: https://www.aqistudy.cn/apinew/aqistudyapi.php
请求方式
Request Method: POST
动态变化的参数
d: tdgHOYxwKdDSgYXe+RLPzYCgLvrddahasI5XXklB4gVLYqab+XRPpMD/oSqnJ/aEmFwzVEUhLnPzRy03+X1BIzLvxQKwu4A3YsqR3OemYgNnHqPdBwvJlbxia99YeK+xVtm/KUfxgICnZHiin/ojfqe1ZJXPHKDaOqwKab2iJt6YQRF4WQWYusdfEXhDolRtLCUy8ht8s821u5VxPcU+NezPIcU8U830QPCeWGAkKrHcsmuUaEHoRLJjnqpMnaid8OfacV5HCUeVhK3Uhju9Sr+bGsXveRwJFs5t307AlxFmwOBzCa6T6fmAQK9+1KoOfUz8EtNUEQkMB1LQBarJd9qsFKpe6TnoLFJ9G6xud+YIs8GecqTX4Pf2urDJLQ3LLfmLqMo7H/7LwYcq2BxyJiGqG2Xpp5wdr9L+oCZisZ9yKEBuYIprEM6A9PMUKADaw5ZESt11e9YX/xbkKPbnaw==
返回的加密的响应数据
f9VXvMyFOzW7AzFWZjMa3oW5basBySGVYXbOpPoS6/W7Dh2wAk4bbiAr7xpyn/meJ/Hem3nHWnk4WtHFwrhKIyDSu2SUsVB5a/jusoqnpmDCxqr9YxCavi6qiilWtiVa49+C70wNGkoQqdo5w3hB/g==

破解操作

请求得到的数据是一组加密数据,但是web前台展示的是一组明文数据,原因是前台将响应回来的密文数据进行了解密
注:在该网站的相关数据包中是存在这解密方法,我们只需要将其解密方法获取,就可对密文数据进行解密

找寻ajax请求的代码
获取搜索按钮对应的点击事件绑定的函数即可(使用火狐浏览器找寻点击事件的函数代码)

点击搜索按钮对应的点击事件函数名叫做getData,进入该函数内部扎寻ajax请求代码

找到了getDate函数的实现
  • 没有发现ajax代码的实现

  • 发现函数内部调用了另外的两个函数getAQIData();
    getWeatherData();

  • 那么ajax代码的实现一定是在上诉两个函数内部

  • 有价值的信息: type==“HOUR” 查询时间是以小时为单位

  • 进入getAQIData();getWeatherData();函数内部找寻ajax代码实现

    • 在这两个函数内部没有发现ajax代码的实现
    • 发现他两都调用了一个名叫getServerData()的函数,那么ajax代码一定存在getServerData()函数中


进入getServerData函数内部找寻ajax代码
  • 通过搜索我们发现只有2个getServerData的调用并不是函数的定义,那么getServerData并不在 city_datail.html中

  • 函数实现的找寻,需要在抓包工具中进行全局搜索
  • 找到的结果是密文
js 混淆
 - 在网站后台,关键的重要的js函数的实现为了保密,一般会对这些js函数代码进行混淆(加密),所以我们需要对js混淆的代码进行反混淆,将js加密的函数进行解密

js反混淆

js混淆暴力破解https://www.bm8.com.cn/jsConfusion/

function getServerData(method, object, callback, period) {const key = hex_md5(method + JSON.stringify(object));const data = getDataFromLocalStorage(key, period);if (!data) {var param = getParam(method, object);$.ajax({url: '../apinew/aqistudyapi.php', #请求urldata: {d: param #加密且动态变化的请求参数},type: "post",#请求方式#data请求到的加密的响应数据success: function (data) {data = decodeData(data);#将data这个加密的响应数据进行解密obj = JSON.parse(data);if (obj.success) {if (period > 0) {obj.result.time = new Date().getTime();localStorageUtil.save(key, obj.result)}callback(obj.result)} else {console.log(obj.errcode, obj.errmsg)}}})} else {callback(data)}}
分析getServerData函数实现的ajax代码:

js逆向

我们需要借助于 PyExecJS 库来实现模拟JavaScript代码执行获取动态加密的请求参数,然后再将加密的响应数据带入decodeData进行解密即可!

  • PyExecJS介绍:PyExecJS 是一个可以使用 Python 来模拟运行 JavaScript 的库。我们需要pip install PyExecJS对其进行环境安装。
  • 以及安装nodejs的开发环境:https://jingyan.baidu.com/article/e4511cf38c05092b845eaf9b.html
    - 开始执行js:

    • 1.创建一个jsCode.js文件将反混淆网站中的代码粘贴进去


- 2.在jsCode.js文件中添加一个自定义函数getPostParamCode,该函数是为了获取且返回post请求的动态加密参数:

function getPostParamCode(method, city, type, startTime, endTime){var param = {};param.city = city;param.type = type;param.startTime = startTime;param.endTime = endTime;return getParam(method, param);
}


- 在py源文件中可以基于PyExecJS模拟执行jsCode.js中定义好的自定义函数,获取动态加密参数:

import execjs
import requestsurl = "https://www.aqistudy.cn/apinew/aqistudyapi.php"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}#实例化一个对象
node = execjs.get()
# Params
method = 'GETCITYWEATHER'
city = '北京'
type = 'HOUR'
start_time = '2020-08-27 00:00:00'
end_time = '2020-08-28 23:00:00'# Compile javascript
file = 'jsCode.js' #代加载编译的js源文件
ctx = node.compile(open(file, encoding='utf-8').read())#加载编译的js源文件中的js代码
# Get params
js = 'getPostParamCode("{0}", "{1}", "{2}", "{3}", "{4}")'.format(method, city, type, start_time, end_time)
params = ctx.eval(js)# eval表示执行指定js函数
print(params)#返回的是加密变化的请求参数

  • 我们用 requests 库来模拟 POST 请求
import execjs
import requestsurl = "https://www.aqistudy.cn/apinew/aqistudyapi.php"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}#实例化一个对象
node = execjs.get()
# Params
method = 'GETCITYWEATHER'
city = '北京'
type = 'HOUR'
start_time = '2020-08-27 00:00:00'
end_time = '2020-08-28 23:00:00'# Compile javascript
file = 'jsCode.js' #代加载编译的js源文件
ctx = node.compile(open(file, encoding='utf-8').read())#加载编译的js源文件中的js代码
# Get params
js = 'getPostParamCode("{0}", "{1}", "{2}", "{3}", "{4}")'.format(method, city, type, start_time, end_time)
params = ctx.eval(js)# eval表示执行指定js函数
print(params)data = {"d":params
}
page_text = requests.post(url=url,headers=headers,data=data).text
print(page_text)# 返回的是加密的响应数据

  • 接下来我们再调用一下 JavaScript 中的 decodeData() 方法即可实现解密
完整代码
import execjs
import requestsurl = "https://www.aqistudy.cn/apinew/aqistudyapi.php"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}#实例化一个对象
node = execjs.get()
# Params
method = 'GETCITYWEATHER'
city = '北京'
type = 'HOUR'
start_time = '2020-08-27 00:00:00'
end_time = '2020-08-28 23:00:00'# Compile javascript
file = 'jsCode.js' #代加载编译的js源文件
ctx = node.compile(open(file, encoding='utf-8').read())#加载编译的js源文件中的js代码
# Get params
js = 'getPostParamCode("{0}", "{1}", "{2}", "{3}", "{4}")'.format(method, city, type, start_time, end_time)
params = ctx.eval(js)# eval表示执行指定js函数
print(params)data = {"d":params
}
page_text = requests.post(url=url,headers=headers,data=data).text
print(page_text)# 返回的是加密的响应数据# 对加密的响应数据进行解密
js = 'decodeData("{0}")'.format(page_text)
decrypted_data = ctx.eval(js)
print(decrypted_data) #解密后的真实数据

完美结束

13-爬虫之js加密,解密,混淆,逆向破解思路相关推荐

  1. python爬虫遇到js加密,python爬虫遇到JS加密,pyv8运行js,详细解密过程

    首先说一下什么是加密,所谓js加密大多出现在表单提交过程中,下面我将以中国电信为例,详细讲解如何利用pyv8来加密登录的密码.要说明的是pyv8目前仅仅支持python2,用的下伙伴要注意自己的pyt ...

  2. 爬虫之js加密破解抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页 动态网页 页面解析 step1: 找参数 step2:分析js函数 step3:分析参数 step4: 校验 step5:转为python代码 编写爬虫 ...

  3. Python爬虫之js加密破解,抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页动态网页 页面解析 step1: 找参数step2:分析js函数step3:分析参数step4: 校验step5:转为python代码 编写爬虫 很多人学 ...

  4. 爬虫常见的加密解密算法

    简介 本文总结了在爬虫中常见的各种加密算法.编码算法的原理.在 JavaScript 中和 Python 中的基本实现方法,遇到 JS 加密的时候可以快速还原加密过程,有的网站在加密的过程中可能还经过 ...

  5. 关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码

    一直有人问HTML加密混淆怎么做,其实这在业内是早已很多人研究过的课题. 假日期间整理一篇文章分享给大家. 我们先理下需求,加密的目的是什么?加密到什么级别?为此我们可以牺牲什么? 我们知道这个世界不 ...

  6. 当Python爬虫遇到JS加密

    我们在做python爬虫的时候经常会遇到许多的反爬措施,js加密就是其中一种. 破解js加密的方法也有很多种: 1.直接驱动浏览器抓取数据,无视js加密. 2.找到本地加密的js代码,使用python ...

  7. python爬虫--破解js加密:kankan登录破解

    这一系列文章旨在解决python 爬虫过程中遇到的各种反爬,从简单到复制,是个进阶的过程.如果对你有帮助,欢迎关注. 今天要破解的网站是天天看看(http://www.kankan.com/)的登录, ...

  8. JS加密解密对于asp.net解密加密

    对于特殊数据传输,我们需要做到加密以及后台解密等! 一:js加密.asp.net解密        js:encodeURI(需要加密的变量)        asp.net:Server.UrlDec ...

  9. 如何一键JS加密解密

    JavaScript 混淆是一种将 JavaScript 代码进行重新编码的技术,目的是使代码难以阅读和理解.混淆的代码难以被盗用或破解,因为它看起来很乱而且难以理解. 解密混淆的 JavaScrip ...

最新文章

  1. nginx alias php,Nginx Alias 无法解析PHP的解决办法
  2. 京东裁员杀红眼了!说要给n+1,员工签字后,公司又反悔了!
  3. ue4 rpc php,UE4 RPC在C++中的使用简例
  4. java输入一个数字输出_java 输入一个数字,反转输出这个数字的值(实现方法)
  5. 远程桌面与远程协助的区别mstsc /console
  6. 2015年 六·一 儿童节——我
  7. webpack之font-awesome
  8. Spark生态圈及安装
  9. oracle定时删库,随手胡乱写的批处理,实现Oracle每天定时备库,DMP文件保留3天,3天后删除,对应2000系统...
  10. 无聊时对连分数的思考
  11. Ubuntu下yolov4训练自己的数据集
  12. 关于回归中国、反垄断等问题,Google CEO 亲口回应了
  13. Sniffer Pro 4.7.5注册不成功问题(unable to communicate with server)
  14. PID参数整定具体方法-圆周倒立摆
  15. 一篇文章,只用看三遍,终生不忘网络分层
  16. 数据正常运行之后,突然遇见:CiteSpace will re-run the process and keep non-empty intervals only.问题
  17. JAVA编写元音字母(Switch语句)
  18. Origin中输入希腊字母
  19. 1849 年 11 月 29 日:真空管的发明者 John Fleming 诞生
  20. 剑魂之刃登录显示服务器异常,剑魂之刃新手问题汇总

热门文章

  1. c++ 准确计时_C++精确计时
  2. windows安装vue脚手架(vue-cli)及vue ui无反应,npm i -g @vue/cli报错解决方案
  3. Oracle中的in 和 not in
  4. 吉林高考成绩查询2021年几号公布,2021年吉林高考成绩查询时间及查分方式
  5. python树结构_Python-简单的树结构实现
  6. SpringBoot的email发送ssl协议格式
  7. linux git文件图标,分享|三款 Linux 下的 Git 图形客户端
  8. 进出仓原理_你问我答 | 球磨机组成和工作原理?
  9. Java 启动和停止界面_IntelliJ IDEA 2019.3 发布,启动更快,性能更好(新特性解读)...
  10. php fpm xcache,php扩展xcache