拼车网站的建设雨实现,wordpress自定义页面模板,主色调为绿色的网站,新余网站建设找谁做目标#xff1a;中国空气质量在线监测分析平台|城市分析 参考CSDN中文章#xff0c;记录一下学习过程通过切换城市#xff0c;页面数据是通过 Ajax 加载的#xff0c;数据接口#xff1a;https://www.aqistudy.cn/apinew/aqistudyapi.php请求的POST Data、返回的数据都被加…目标中国空气质量在线监测分析平台|城市分析 参考CSDN中文章记录一下学习过程通过切换城市页面数据是通过 Ajax 加载的数据接口https://www.aqistudy.cn/apinew/aqistudyapi.php 请求的POST Data、返回的数据都被加密了分析网站接口的加密逻辑js加密的一般处理思路加密url或某个post data参数时可以全局搜索对应的参数名或者值确定js函数整个post data加密或无法搜索到参数可通过元素的事件监听确定js函数1. 这里搜索参数名 d 显然不现实当我们点击切换城市或者搜索按钮之后后台便会发出 Ajax 请求说明这个点击动作是被监听的所以我们可以找一下这个点击事件对应的处理代码在哪里这里可以借助于 Firefox 来实现它可以分析页面某个元素的绑定事件以及定位到具体的代码在哪一行切换城市or点击搜索2.发现绑定的 click 事件调用了 getData() 函数显然是获取数据的js搜索这个函数在 city_detail.html 的第 463 行就找到了这个函数的声明3.发现它又调用了 getAQIData() 和 getWeatherData() 这两个方法的声明就紧挨在下面再进一步分析发现这两个方法都调用了 getServerData() 这个方法并传递了参数 method、param 还有一个回调函数很明显是对返回数据进行处理的这说明 Ajax 请求就是由这个 getServerData() 方法发起的如图所示4.继续搜索这个函数 getServerData() city_detail.html 中的是上面两个方法调用了 getServerData() 这个文件里面并没有getServerData() 的声明貌似在 https://www.aqistudy.cn/js/jquery-1.8.0.min.js?v1.2 中 右键 选择在Sources中打开继续搜果然找到了发现这里经过 JavaScript 混淆加密了这个方法名后面怎么直接跟了一些奇怪的字符串而且不符合一般的 JavaScript 写法而且这行代码的开头为eval(function(p,a,c,k,e,d)这种形式。5.利用在线反混淆网站http://www.bm8.com.cn/jsConfusion/将 jquery-1.8.0.min.js 中这行 eval 开头的混淆后的 JavaScript 代码复制一下然后粘贴到这个网站中进行反混淆就可以看到正常的 JavaScript 代码了搜索一下就可以找到 getServerData() 方法了可以看到这个方法确实发出了一个 Ajax 请求请求了Ajax 加载的数据接口在这里发现了一个getParam()方法它接受了 method 和 object 参数然后返回得到的 param 结果就作为加密后的 POST Data也就是d后面的那一堆字符串这里面还有一个decodeData()方法对服务器传回的数据进行解密6.还是在这一堆反混淆代码中紧挨着上面代码找到了getParam()和decodeData()其中 POST Data 的加密过程是 Base64 AES 加密Response Data 的解密是 AES DES Base64 解密代码PyExecJS 是一个可以使用 Python 来模拟运行 JavaScript 的库pip install PyExecJS还需安装JS运行环境推荐安装 Node.js Go~不需要用 Python 重写一遍 JavaScript直接用 Python 来模拟运行 JavaScript 就好将刚才反混淆的 JavaScript 保存成一个文件叫做 encryption.js然后用 PyExecJS 模拟运行相关的方法即可。首先我们来实现加密过程这里 getServerData() 方法其实已经帮我们实现好了并实现了 Ajax 请求但这个方法里面有获取 Storage 的方法Node.js 不适用所以这里不用它也别管他 添加一个 getEncryptedData() 方法实现加密在 encryption.js 最后面加入一段代码实现如下方法function getEncryptedData(method, city, type, startTime, endTime) {var param {};param.city city;param.type type;param.startTime startTime;param.endTime endTime;return getParam(method, param);
}用于传递数据调用参数加密函数接下来用python模拟执行这些方法即可import execjs
import json
import requests# Init environment
# 通过 execjs即 PyExecJS的 get() 方法声明一个运行环境
node execjs.get()# Params
# 换成GETCITYWEATHER获取温度风向等数据
method GETDETAIL
city 重庆
type HOUR
start_time 2019-09-06 00:00:00
end_time 2019-09-06 12:00:00# Compile javascript
file encryption.js
# 调用 compile() 方法来执行刚才保存下来的加密库 encryption.js执行一遍才能调用
with open(file, encoding(utf-8)) as f:ctx node.compile(f.read())# Get params
# 调用一下 JavaScript 中的 getEncryptedData() 方法即可实现加密
# 通过 eval() 方法来模拟执行得到的结果赋值为 params这个就是 POST Data 的加密数据
js getEncryptedData({0}, {1}, {2}, {3}, {4}).format(method, city, type, start_time, end_time)
params ctx.eval(js)# Get encrypted response text
url https://www.aqistudy.cn/apinew/aqistudyapi.php
response requests.post(url, data{d: params})# Decode data
# 调用一下 JavaScript 中的 decodeData() 方法即可实现解密
js decodeData({0}).format(response.text)
decrypted_data ctx.eval(js)data json.loads(decrypted_data)
res data.get(result).get(data).get(rows)
for i in res:print(i)method GETDETAIL 可以获得aqi空气质量指数pm2.5 等数据换成GETCITYWEATHER 可以获取温度风向等数据Githubhttps://github.com/Ingram7/AQI