一、token加密部分
网址:aHR0cHM6Ly9qenNjLmpzdC56ai5nb3YuY24vUHVibGljV2ViL2luZGV4Lmh0bWwjLw==
点开查询的xhr的包,发现headers中含有token这一加密参数。
直接跟栈,很容发现在第三个栈加密。
s = Object(L.b)(l).toString(),由函数Object(L.b)加密,加密传入的l是时间戳。进入函数。很明显的便准AES加密,在前面复制i与s。
js代码:
const CryptoJS = require('crypto-js')
var i = CryptoJS.enc.Utf8.parse("255B675CDF21B04F923992E0E9F4A498");
var s = CryptoJS.enc.Utf8.parse("255B675CDF21B04F");
function get_token(t) {
var e = CryptoJS.enc.Utf8.parse(t);
return CryptoJS.AES.encrypt(e, i, {
iv: s,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString()
};
二、字体加密部分
可以发现数据的字体是进行了加密的,且每一次访问字体都不同,下载字体,在工具中打开。并利用TTfont查找对应关系。
数据包附近的包就是字体。双击可下载。
获取映射表
from fontTools.ttLib import TTFont
font_obj = TTFont('浙江省建筑市场.woff')
cmap = font_obj.getBestCmap()
print(cmap)
Mapping_tables = {}
for code,mapping in cmap.items():
character_key = chr(code)
character_value = chr(int(mapping[3:],16)) if mapping.startswith('uni') else mapping
Mapping_tables[character_key] = character_value
print(Mapping_tables)
结果为:
character_value = chr(int(mapping[3:],16)) if mapping.startswith('uni') else mapping
这行代码的作用是,如果 mapping 以 'uni' 开头,它会将 mapping 中的十六进制 Unicode 值转换为对应的字符,否则直接将 mapping 赋值给变量 character_value。
这里是代码的解释:
mapping.startswith('uni'): 这个条件判断检查变量 mapping 是否以 'uni' 开头。
int(mapping[3:], 16): 如果 mapping 以 'uni' 开头,它会提取从第四个字符到结尾的子字符串 (mapping[3:]),然后将其解释为十六进制数 (int(..., 16)) 并将其转换为整数。
chr(...): 这个函数接受一个整数 Unicode 代码点,并返回对应的字符。
因此,如果 mapping 以 'uni' 开头,它会从字符串中提取 Unicode 代码点并使用 chr() 函数将其转换为对应的字符。如果 mapping 不以 'uni' 开头,则假定它已经表示一个字符,直接将其赋给变量 character_value。
实际情况是这样运行代码,根本不需要token,也没有字体加密,不知道为什么。
import requests
import ddddocr
import execjs
import time
import re
import json
f = open('demo.js','r').read()
js_code = execjs.compile(f)
for page in range(1,10):
time.sleep(1)
t = int(time.time()*1000)
token = js_code.call('get_token',t)
print(token)
def get_response(token):
url = 'https://jzsc.jst.zj.gov.cn/publishserver/OTMcxygd/OTMjuiiRnupruxBidw'
data = {
'City': '',
'COUNTY': '',
'tenderProName': '',
'tenderUnit': '',
'tenderBrokerOrg': '',
'pageIndex': page,
'pageSize': 15,
}
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
# "Token":token,
"Referer":"https://jzsc.jst.zj.gov.cn/PublicWeb/index.html",
}
response = requests.post(url=url,json=data,headers=headers)
return response
response = get_response(token)
data = re.findall('</style>(.*?),"count',response.text)[0]+',"count":11637}'
json_data = json.loads(data)
for index in json_data['data']:
print(index)