#encoding : utf-8

import base64
from Crypto.Cipher import AES, DES
import random
import hashlib

def pkcs7padding(text):
    """
    明文使用PKCS7填充
    最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
    :param text: 待加密内容(明文)
    :return:
    """
    bs = AES.block_size  # 16
    length = len(text)
    bytes_length = len(bytes(text, encoding='utf-8'))
    # tips:utf-8编码时,英文占1个byte,而中文占3个byte
    padding_size = length if(bytes_length == length) else bytes_length
    padding = bs - padding_size % bs
    # tips:chr(padding)看与其它语言的约定,有的会使用'\0'
    padding_text = chr(padding) * padding
    return text + padding_text

def pkcs7unpadding(text):
    """
    处理使用PKCS7填充过的数据
    :param text: 解密后的字符串
    :return:
    """
    length = len(text)
    unpadding = ord(text[length-1])
    return text[0:length-unpadding]

def aes_encrypt(key, iv, content):
    """
    AES加密
    key,iv使用同一个
    模式cbc
    填充pkcs7
    :param key: 密钥
    :param content: 加密内容
    :return:
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 处理明文
    content_padding = pkcs7padding(content)
    # 加密
    encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新编码
    result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
    return result

def aes_decrypt(key, iv, content):
    """
    AES解密
     key,iv使用同一个
    模式cbc
    去填充pkcs7
    :param key:
    :param content:
    :return:
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # base64解码
    encrypt_bytes = base64.b64decode(content)
    # 解密
    decrypt_bytes = cipher.decrypt(encrypt_bytes)
    # 重新编码
    result = str(decrypt_bytes, encoding='utf8')
    # 去除填充内容
    result = pkcs7unpadding(result)
    return result

def decrypt_response(des_key, des_iv, aes_key, aes_iv, content):
    """
    AES解密
     key,iv使用同一个
    模式cbc
    去填充pkcs7
    :param key:
    :param content:
    :return:
    """
    aes = AES.new(aes_key, AES.MODE_CBC, aes_iv)
    des = DES.new(des_key, DES.MODE_CBC, des_iv)
    # base64解码
    encrypt_bytes = base64.b64decode(content)
    # 解密
    decrypt_bytes = des.decrypt(encrypt_bytes)
    decrypt_bytes = base64.b64decode(decrypt_bytes)
    #decrypt_bytes = pkcs7padding(decrypt_bytes.decode()).encode("utf8")
    decrypt_bytes = aes.decrypt(decrypt_bytes)

    #base64解码
    decrypt_bytes = base64.b64decode(decrypt_bytes)
    # 重新编码
    result = str(decrypt_bytes, encoding='utf8')
    # 去除填充内容
    #result = pkcs7unpadding(result)
    return result

aes_client_key = "weJGsdsdf6FxF9=="
aes_client_iv = "sewg29nsl="
des_key = "sgfsfKsg8723jF=="
des_iv = "yfw3wexsd="
aes_server_key = "efsdsbafa6xFe8lcg=="
aes_server_iv = "o2muxyVs5cwedbQ=="

aes_client_key = hashlib.md5(aes_client_key.encode(encoding="utf8")).hexdigest()[16:32].encode("utf8")
aes_client_iv  = hashlib.md5(aes_client_iv.encode(encoding="utf8")).hexdigest()[0:16].encode("utf8")

des_key = hashlib.md5(des_key.encode(encoding="utf8")).hexdigest()[0:8].encode("utf8")
des_iv  = hashlib.md5(des_iv.encode(encoding="utf8")).hexdigest()[24:32].encode("utf8")

aes_server_key = hashlib.md5(aes_server_key.encode(encoding="utf8")).hexdigest()[16:32].encode("utf8")
aes_server_iv  = hashlib.md5(aes_server_iv.encode(encoding="utf8")).hexdigest()[0:16].encode("utf8")

param = "X6aE2KFDkoTEwiPT4RVxjg+XqXnsd2ndanvbSXpRRyO6PjKO5IOM3yxJPiFn+gRsAAKy76D+FfrcXeLqVx2Tt7v6mdkttgj9E4fqYAZsrktPDTEYPb3RT8wuk7pnCB3SU0YbvFZvA0w5g6zOR8pUY2NAnLm9A/6tZumunULYSTkRT+RRQRFFmtIbqQH0Y5TZ8gPwfbps/cgGldi8OV7aQg8q24XaBy1UuO2OsDbwxNPx4WH4PEz+bgOyP3REpkIz0bkRBn/49YiHEOfDACTS6LUS9rE9oIyHatpeDkq9Q5Rds5D/ZraGVe+REK6g6KvLOjjIU/NhO7lI+6n59xRtayjPttKKZ9ruyFKCanVRsHc="
result = aes_decrypt(aes_client_key, aes_client_iv, param)
result = base64.standard_b64decode(result).decode()
print(result)

import time
import json
url = "https://www.aqistudy.cn/historydata/api/historyapi.php"
appid = "b73a4aaa989f54997ef7b9c42b6b4b29"
method = "GETDAYDATA"
timestamp = int(time.time()*1000)
clienttype = "WEB"
object = {"city":"北京","month":"201312"}
secret_key = appid + method + str(timestamp) + clienttype + json.dumps(object, ensure_ascii=False)
secret = hashlib.md5(secret_key.encode("utf8")).hexdigest()
#secret = calcMD5(secret_key)
param = {
    "appId":appid,
    "method":method,
    "timestamp": timestamp,
    "clienttype":clienttype,
    "object": object,
    "secret": secret
}

param = {"appId":"b73a4aaa989f54997ef7b9c42b6b4b29","method":"GETDAYDATA","timestamp":1563691657836,"clienttype":"WEB","object":{"city":"北京","month":"201312"},"secret":"ab99e0b20052afc17aa75d5039c79d99"}

param = base64.standard_b64encode(json.dumps(param).encode("utf8")).decode()
param = aes_encrypt(aes_client_key, aes_client_iv, param)
#param = base64.standard_b64decode(param).encode()

import requests

session = requests.session()
resp = session.post(url, data={"hd" : param})
response = resp.text
print(response)
data = base64.standard_b64decode(response.encode("utf8")).decode()
data = decrypt_response(des_key, des_iv, aes_server_key, aes_server_iv, data)
print(data)