点击时候确定某个元素 js_某空气质量监测平台 JS反爬

99b741bb030d6d121019bfc4bf67168b.png

目标:中国空气质量在线监测分析平台|城市分析 参考CSDN中文章,记录一下学习过程

a6a5df0bcf58655fcf2f66ef9abf554f.png

通过切换城市,页面数据是通过 Ajax 加载的,数据接口:https://www.aqistudy.cn/apinew/aqistudyapi.php

请求的POST Data、返回的数据都被加密了

c3892c4cf189762ace03289243220b8e.png

d0c5df115cc44f96c13754d37c09c65e.png

分析网站接口的加密逻辑

js加密的一般处理思路:

  • 加密url或某个post data参数时,可以全局搜索对应的参数名或者值,确定js函数
  • 整个post data加密或无法搜索到参数,可通过元素的事件监听,确定js函数

1. 这里搜索参数名 d 显然不现实,当我们点击切换城市或者搜索按钮之后,后台便会发出 Ajax 请求,说明这个点击动作是被监听的,所以我们可以找一下这个点击事件对应的处理代码在哪里,这里可以借助于 Firefox 来实现,它可以分析页面某个元素的绑定事件以及定位到具体的代码在哪一行

切换城市or点击搜索

1c102ba0c3adf0ec0eb264be65e9e971.png

e401c10ffb7774fbf2fd347f4a80bb5d.png

2.发现绑定的 click 事件调用了 getData() 函数,显然是获取数据的js,搜索这个函数

1899c4031be425a285c5be8e2595b241.png

在 city_detail.html 的第 463 行就找到了这个函数的声明

a4c1172c74bf759b97b485c6107a3e1a.png

3.发现它又调用了 getAQIData() 和 getWeatherData() ,这两个方法的声明就紧挨在下面,再进一步分析发现这两个方法都调用了 getServerData() 这个方法,并传递了参数 method、param ,还有一个回调函数很明显是对返回数据进行处理的,这说明 Ajax 请求就是由这个 getServerData() 方法发起的,如图所示:

0002592d5b21a3adb844703065cd888f.png

4.继续搜索这个函数 getServerData()

536f521a89d3a44888b3b4991e024418.png

city_detail.html 中的是上面两个方法调用了 getServerData() ,这个文件里面并没有getServerData() 的声明

貌似在 https://www.aqistudy.cn/js/jquery-1.8.0.min.js?v=1.2 中 右键 选择在Sources中打开,继续搜

1f49361212ca6e11a43a7f74c6dfeedd.png

果然找到了,发现这里经过 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 加载的数据接口:

1e06414b3c7b12c5ce3616de304fff90.png

在这里发现了一个getParam()方法:它接受了 method 和 object 参数,然后返回得到的 param 结果就作为加密后的 POST Data,也就是d:后面的那一堆字符串

这里面还有一个decodeData()方法:对服务器传回的数据进行解密

6.还是在这一堆反混淆代码中,紧挨着上面代码找到了getParam()和decodeData()

cf2f2dc3bc9d10a7ace6b640ddb8b691.png

其中 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 等数据

bff2963ac718d318ca035d25f73a3320.png

换成'GETCITYWEATHER' 可以获取温度,风向等数据

64a21cf8f7b8755d5d55c79bf5958b46.png

Github:https://github.com/Ingram7/AQI

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

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

相关文章

HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST

URL地址 就是我们所说的网址:www.jd.com 浏览器内核,渲染引擎 Ie内核:triteent 谷歌/欧鹏:blink 火狐:gecko 苹果:webkit 渲染引擎是出现兼容性的根本问题 -html概念:hyper Text Markup Languag…

Spring @Value取值为null或@Autowired注入失败

Value 用于注入.properties文件中定义的内容 Autowired 用于装配bean 用法都很简单,很直接,但是稍不注意就会出错。下面就来说说我遇到的问题。 前两天在项目中遇到了一个问题,大致描述就是我写了如下一个类(只列出关键代码&#…

mysql 部门表_MySQL高级

本文大纲环境win10-64MySQL Community Server 5.7.1mysqld –version可查看版本官方文档SQL执行顺序手写顺序我们可以将手写SQL时遵循的格式归结如下&#xff1a;select distinct from join on wheregroup byhavingorder bylimit <offset>,<rows>distinct&…

使用Apache Camel发布/订阅模式

发布/订阅是一种简单的消息传递模式&#xff0c;其中&#xff0c;发布者将消息发送到某个频道&#xff0c;而无需知道谁将接收消息。 然后&#xff0c;通道负责将消息的副本传递给每个订户。 此消息传递模型允许创建松耦合和可伸缩的系统。 这是一种非常常见的消息传递模式&am…

移动端(H5)弹框组件--简单--实用--不依赖jQuery

俗话说的好&#xff0c;框架是服务与大家的&#xff0c;包含的功能比较多&#xff0c;代码多。在现在追求速度的年代。应该根据自己的需求去封装自己所需要的组件。 下边就给大家介绍一下自己封装的一个小弹框组件&#xff0c;不依赖与jQuery&#xff0c;代码少&#xff0c;适…

c++ for循环 流程图_python 零基础必知--条件控制与循环语句

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理本文章来自腾讯云 作者&#xff1a;somenzz如果没有 if 语句和循环语句&#xff0c;请问你怎么编程&#xff1f;Python 中的条件控制和循环语句都非常简单&…

前端总结·基础篇·CSS(二)视觉

前端总结系列 前端总结基础篇CSS&#xff08;一&#xff09;布局前端总结基础篇CSS&#xff08;二&#xff09;视觉前端总结基础篇CSS&#xff08;三&#xff09;补充前端总结基础篇JS&#xff08;一&#xff09;原型、原型链、构造函数和字符串&#xff08;String&#xff09;…

【kindle笔记】之 《浪潮之巅》- 2018-1-

《浪潮之巅》 这本书推荐自最爱的政治课老师。 政治课老师张巍老师。我会一直记得你的。 以这样的身份来到这个学校&#xff0c;他人的质疑&#xff0c;自己的忐忑&#xff0c;老板的不公。犹犹豫豫谨小慎微地前进。 第一次听到这样的话是从您口中&#xff1a; 在座的诸位&…

Secure CRT 自动记录日志log配置

SecureCRT8.0的下载地址下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1i5q09qH 密码&#xff1a;4pa2 配置自动log操作如下&#xff1a; 1.options ---> Session Options 2. 设置log 文件属性 点击 日志 &#xff0c;在选项框中 Log file name中填入路径和…

禁用mysql的sleep函数_MySQL的sleep函数的特殊特现象

MySQL中的系统函数sleep&#xff0c;实际应用的场景不多&#xff0c;一般用来做实验测试&#xff0c;昨天在测试的时候&#xff0c;意外发现sleep函数的一个特殊现象。如果在查询语句中使用sleep函数&#xff0c;那么休眠的时间跟返回的记录有关。如下测试所示&#xff1a;mysq…

amoeba mysql读写分离_Mysql 实现读写分离的详细教程(amoeba)

Mysql 实现读写分离的详细教程(amoeba)发布时间&#xff1a;2018-08-17作者&#xff1a;laosun阅读(2220)继上篇文章&#xff0c;mysql实现主从配置之后的读写分离实现方式&#xff0c;文章地址。amoeba是盛大架构师陈思儒独立完成&#xff0c;除此之外还有很多中间件&#xff…

十道海量数据处理面试题与十个方法大总结

1. 给定a、b两个文件&#xff0c;各存放50亿个url&#xff0c;每个url各占64字节&#xff0c;内存限制是4G&#xff0c;让你找出a、b文件共同的url&#xff1f; 方案1&#xff1a;可以估计每个文件安的大小为50G64320G&#xff0c;远远大于内存限制的4G。所以不可能将其完全加载…

Spring集成文件轮询和测试

我最近实施了一个小项目&#xff0c;在该项目中&#xff0c;我们必须轮询文件夹中的新文件&#xff0c;然后在文件内容上触发服务流。 Spring Integration非常适合此要求&#xff0c;因为它带有一个通道适配器 &#xff0c;该适配器可以扫描文件夹中的新文件&#xff0c;然后通…

Spark参数配置总结

转载于:https://www.cnblogs.com/lz3018/p/8128017.html

eclipse mysql生成实体类_Eclipse实现数据库反向生成实体类(pojo)-------(插件安装和实现步骤的说明)...

一、插件安装1.下载插件&#xff1a;http://jaist.dl.sourceforge.net/sourceforge/jboss/HibernateTools-3.2.4.Beta1-R200810311334.zip2.解压压缩包分别将其中的features和plugins放到Eclipse安装目录下对应的这2个文件里&#xff0c;重启Eclipse使其生效3.随便建个project&…

一些小技巧-重构

用box-shadow制造浮雕效果用box-shadow做简单的背景修饰长页面背景图不够用...... 01 用box-shadow制造浮雕效果 demo示例&#xff1a; src"http://demo.zhangruojun.com/static/demo/demo001/" frameborder"0" width"414" height"650&qu…

VM虚拟机显示不能铺满问题

关于使用虚拟机&#xff08;VMware&#xff09;时桌面显示不能铺满整个窗口时的设置操作&#xff1a; 步骤&#xff1a;虚拟机菜单下的&#xff1a;编辑-->首选项-->显示&#xff08;如下图&#xff09; 可以根据自己需求设置全屏下面的三个选项&#xff0c;确定后如果不…

Weex系列-项目工程

转载于:https://www.cnblogs.com/hacjy/p/8136460.html

MySQL索引效率对比_mysql下普通索引和唯一索引的效率对比

今天在我的虚拟机中布置了环境&#xff0c;测试抓图如下&#xff1a;抓的这几个都是第一次执行的&#xff0c;刷了几次后&#xff0c;取平均值&#xff0c;效率大致相同&#xff0c;而且如果在一个列上同时建唯一索引和普通索引的话&#xff0c;mysql会自动选择唯一索引。谷歌一…

spring以及json,fastjson和jackson

&#xff08;一&#xff09; RestController 以及 RequestBody spring的这两个注解都需要使用对应的 message-converters 实现 pojo到字符串的转换&#xff0c; 需要配置实现了 GenericHttpMessageConverter 接口的实现类GenericHttpMessageConverter 父接口为HttpMessageConve…