暗号:aHR0cHM6Ly9tYXNoYW5ncGEuY29tL3Byb2JsZW0tZGV0YWlsLzkv
题目:

先分析数据接口,可以看到m和tt是加密的:

然后在发起程序的最上面的堆栈下一个断点,断点断住后调整堆栈,并且观察作用域,查找加密值的生成位置:

所有堆栈都看完了,但是还是没有找到,最后检查这里的堆栈,发现给m和tt赋值了:

断点后m的值就在这里生成:

其实就是使用c函数对一个包含时间戳的字符串进行加密:

但是仔细检查c里面的代码,会发现加密值是在这里生成:

还原后,它就是一个sha1加密:

最后安装crypto-js (使用npm install crypto-js) ,加密的代码仅需要3行:

当然也可以直接生成python代码, tt的生成更简单,就是将时间戳进行base64加密,也可以直接使用python生成,最后就能够正确获取到数据了:

附上完整python代码(headers和cookie 已经删除):
import hmac
import hashlib
import time
import requests
import json
import base64
def base64_encode(text: str) -> str:
"""
字符串 Base64 加密
和 JavaScript: CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text)) 结果一致
"""
# 转 utf-8 字节 → base64 编码 → 转回字符串
bytes_data = text.encode("utf-8")
base64_bytes = base64.b64encode(bytes_data)
return base64_bytes.decode("utf-8")
def get_signature():
# 获取当前时间戳(毫秒级,和 JS new Date().getTime() 完全一致)
sjc = int(time.time() * 1000)
# 拼接字符串:9527 + 时间戳
data = f"9527{sjc}"
# 密钥
key = "xxxooo"
# HmacSHA1 加密(和 crypto-js HmacSHA1 结果完全相同)
hmac_result = hmac.new(
key.encode('utf-8'),
data.encode('utf-8'),
hashlib.sha1
)
# 转成 16 进制小写字符串(crypto-js 默认输出格式)
a = hmac_result.hexdigest()
# 返回最终结果 + 时间戳(方便你对接接口)
return a, sjc
sign, timestamp = get_signature()
headers = {}
cookies = {}
url = "https://mashangpa.com/api/problem-detail/9/data/"
data = {
"page": 2,
"m": sign,
"tt":base64_encode(str(timestamp))
}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, data=data).json()
print(response)