概述
参考文章: https://www.cnblogs.com/bobo-zhang/p/11243138.html
https://cuiqingcai.com/5024.html
本篇文章是参考以上两篇文章写就 ,思路是一样的, 只是pyhton代码模拟的不一样, 我感觉自己写的好理解, 总之 自己写的理解才是最深刻的,
抓取网址; https://www.aqistudy.cn/html/city_detail.html
首先是如何定位js加密数据的位置的问题, 在这之前, 可以通过转包 点击查询按钮 找到疑似加密的数据 ,也就是这个接口, https://www.aqistudy.cn/apinew/aqistudyapi.php
自己去抓一下包 ,可以发现 无论是post请求的接口数据, 还是response响应的数据, 即我们想要的数据, 全部都被加密了, 这真的令人头痛, 因为这意为着我们的目标又加了一个找到解密响应数据的js代码。
其他文章都是通过火狐浏览器的绑定鼠标事件一步一步来找到加密的js函数, 而chrome浏览器, 也有类似的功能 , 如图 :
点击找到click , 然后点击 查找 , 就会定位到这里;
可以发现getData函数, 定位定义getData函数的地方,
可以发现其又调用了两个函数, 继续 查找这两个函数。很容易找到就在getData函数后面, 到现在为止还没有发现明显的加密的请求函数, 以及解密函数。 所以还有继续寻找线索, 而这时我们又发现这两个函数 ,都调用了getServerData函数, 所以定位到这个函数 :
到了这里可以明显的看到 ajax请求的构成, 它包含了我们要的加密参数d , 可以看出d是有getParam生成的 ,并且接受两个参数 ,method, object , 这两个参数怎么找呢,
很简单,这两个参数都是由getServerData, 得来的, 而在刚刚调用的两个函数中都调用了它, 可以从这里面找寻传递的参数,
这两个参数都可以找到, 一个是固定的字符串, 一个是对象, 类似python中的字典,
这两个参数有了, 我们只需要调用getParam参数就可以获取加密参数了,
好了, 这里我们有了 post请求的参数, 继续寻找response响应中的 我们想要的数据,
也可以很明显的找到,由decodeData函数解密,
先经过AES 解密, 在经过DES解密, 最后通过BASE64解密, 然后返回数据, 我们只需要传入要解密的data就可以了。 现在开始上代码,
python:
import execjs
import requests
import json
"""
在py文件中传递js文件中需要的已知参数
"""
def get_params(method, city, type_, startTime, endTime):
with open('weather.js', 'r', encoding='utf-8') as fp:
line = fp.read()
ctx = execjs.compile(line) # 读取js 中的函数。
# 调用函数获取post请求的参数
result = ctx.call('getPostparamCode', method, city, type_, startTime, endTime)
return result
def get_post_param():
method = 'GETCITYWEATHER'
city = '北京'
type_ = 'HOUR'
startTime = '2019-08-23 16:00:00'
endTime = '2019-08-24 19:00:00'
# 传入参数 , 调用内部的getPostparamCode函数, 进而调用js文件中的getparam函数
d = get_params(method, city, type_, startTime, endTime)
return d
def post_to_have_data(d):
"""
发出post请求, 来获取加密后的数据, 然而响应的数据依然是要破解的
:return:
"""
resp = requests.post(url, data={'d': d})
if resp.status_code == 200:
# print(resp.text) # 依然是要解密的。
encrypt_data = resp.text # 但是我们js文件中有了解密的方法, 直接掉用传入要解密的数据解密就是。
encrypt_data = encrypt_data.encode('utf-8').decode('unicode_escape')
print(type(encrypt_data))
return encrypt_data
def decrypt_data(data):
with open('weather.js', 'r', encoding='utf-8') as fp:
line = fp.read()
ctx = execjs.compile(line) # 再次读取一遍js文件, 要调用 其中的解密函数。
result = ctx.call('decodeData', data) # 这就是我们最终解密的数据, 逻辑清晰。
return result
if __name__ == '__main__':
url = 'https://www.aqistudy.cn/apinew/aqistudyapi.php'
d = get_post_param()
encrypt_data = post_to_have_data(d) # 从post_to_have_data中获取加密响应数据。
text = decrypt_data(encrypt_data)
print(text)
# slashUStr = "\u897f\u5357\u98ce"
# str = slashUStr.encode('utf-8').decode('unicode_escape')
# print(str)
这里需要自己定义一个js函数, 用来调用getParam函数,
// 定义这个函数的目的是 获取 post请求的加密参数, 要明确是哪个函数需要什么参数对post请求的参数进行解密的。 !!!
function getPostparamCode(method, city, type, startTime, endTime){
let param = {};
param.method = method;
param.city = city;
param.type = type;
param.startTime = startTime;
param.endTime = endTime;
return getParam(method, param) // 调用获取 d 。
}
定义这个js函数 后, 在python中 只需要调用它就可了 ,因为它调用了获取参数的函数,
最重要的是传递一些已知量。 这些已经在pyhton文件中写了。
js文件太长 , 就上传至了GitHub中。
Github地址: https://github.com/dongxun1/Weather
最后
以上就是魁梧电灯胆为你收集整理的中国空气质量在线监测js破解的全部内容,希望文章能够帮你解决中国空气质量在线监测js破解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复