某公共资源交易平台

说明

# URL
https://ggzyfw.fj.gov.cn

# 接口
https://ggzyfw.fj.gov.cn/FwPortalApi/Article/PageList

纯Python版本

import requests, time, json, base64
from hashlib import md5
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

cookies = {
    'ASP.NET_SessionId': 'fvxacb0phmpuqjvepf0hoq0m',
}

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json;charset=UTF-8',
    'Origin': 'https://ggzyfw.fj.gov.cn',
    'Pragma': 'no-cache',
    'Referer': 'https://ggzyfw.fj.gov.cn/index/new/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    # 'portal-sign': '33213a75a0966bce31da6476c3680a6b',
    'sec-ch-ua': '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    # 'Cookie': 'ASP.NET_SessionId=fvxacb0phmpuqjvepf0hoq0m',
}

json_data = {
    # 生成13位时间戳
    "ts": int(time.time() * 1000),
    "type": "12",
    "IS_IMPORT": 1,
    "pageSize": 7
}

# 生成sign值的函数
def get_sign(data):
    l = sorted(data.items(), key=lambda x: x[0])
    data_str = ''
    for k, v in l:
        data_str += k + str(v)
    # 获取要加密的字符串:将固定字符数与上方的字符串进行拼接(从网站分析得出)
    data_str = 'B3978D054A72A7002063637CCDF6B2E5' + data_str
    # print(data_str)
    
    # 进行md5加密
    # 创建md5对象
    obj = md5()
    # 对加密字符串进行md5加密
    obj.update(data_str.encode("utf-8"))
    data_str_md5 = obj.hexdigest()
    # print(data_str_md5)
    # 返回md5
    return data_str_md5


# 生成sign值
sign = get_sign(json_data)
# print(sign)

# 给 headers['portal-sign'] 赋值
headers['portal-sign'] = sign

# 发送请求
response = requests.post('https://ggzyfw.fj.gov.cn/FwPortalApi/Article/PageList', cookies=cookies, headers=headers,
                         json=json_data)

# print(response.text)
# print(response.json()['Data'])

# 获取加密数据
base64_encrypt_data = response.json()['Data']
# 对加密数据进行base64解码
encrypt_data = base64.b64decode(base64_encrypt_data)

# AES 解密
# 定义 key iv
key = 'EB444973714E4A40876CE66BE45D5930'.encode()
iv = 'B5A8904209931867'.encode()
# 创建AES解密对象
aes = AES.new(key, AES.MODE_CBC, iv)
# AES解密:对上方base64解码后的数据进行解密并去除填充数据,最终解密出明文数据
decrypt_text = unpad(aes.decrypt(encrypt_data), 16).decode()

# 将数据反序列化
data = json.loads(decrypt_text)

# 遍历出具体数据项
for item in data['Table']:
    print(item)

扣JS版

enc_dec.js

spider.py

Last updated