中国空气质量在线监测js破解

参考文章: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值