某公共资源交易平台
说明
# 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