各位好,我正在尝试用抓包,获取剑网3推栏的一些信息,但是目前,根据我获得的API,请求过去貌似还缺少一些参数。
缺少sign
参数,目前尚未找到解决方案。
import datetime
import hashlib
import hmac
import json
import httpx
def format_body(data: dict) -> str:
return json.dumps(data, separators=(',', ':'))
def gen_ts() -> str:
return f"{datetime.datetime.now():%Y%m%d%H%M%S%f}"[:-3]
def gen_xsk(data: str) -> str:
data += "@#?.#@"
secret = "MaYoaMQ3zpWJFWtN9mqJqKpHrkdFwLd9DDlFWk2NnVR1mChVRI6THVe6KsCnhpoR"
return hmac.new(secret.encode(), msg=data.encode(), digestmod=hashlib.sha256).hexdigest()
async def post_url(url, proxy: dict = None, headers: str = None, timeout: int = 300, data: dict = None):
async with httpx.AsyncClient(proxies=proxy, follow_redirects = True) as client:
resp = await client.post(url, timeout = timeout, headers = headers, data = data)
result = resp.text
return result
async def get_arena_data(token: str) -> dict:
param = {
"gameVersion":0,
"forceId":-1,
"zone": "",
"server": "",
"ts": gen_ts()
}
param = format_body(param)
device_id = token.split("::")[1]
headers = {
'Host': 'm.pvp.xoyo.com',
'accept': 'application/json',
'deviceid': device_id,
'platform': 'ios',
'gamename': 'jx3',
'clientkey': '1',
'cache-control': 'no-cache',
'apiversion': '1',
'sign': 'true',
'token': token,
'Content-Type': 'application/json',
'Connection': 'Keep-Alive',
'User-Agent': 'SeasunGame/178 CFNetwork/1240.0.2 Darwin/20.5.0',
"x-sk": gen_xsk(param)
}
data = await post_url(url="https://w.pvp.xoyo.com/api/h5/parser/cd-process/get-by-role", data=param, headers=headers)
return json.loads(data)
if __name__ == "__main__":
import asyncio
token = input()
ans = asyncio.run(get_arena_data(token))
print(ans)
代码大部分来自https://github.com/subservers/tuilan。
提示{'code': -200, 'msg': 'signature not match', 'data': None}
,应该是缺少了sign
参数,但是抓包没有找到该参数。
我尝试着在抓包记录中搜索该sign
值,但是我发现,前面的抓包记录中完全没有出现过该字符串。
我又在互联网上尝试了Base64
等解密工具,但是仍然未获得答案。
顺便说一下,抓包是从登录(登录前)到获取团本cd这一阶段,使用的是HttpCanary
和修改过证书的推栏。
我在我的机器人https://inkar-suki.codethink.cn/get_jx3_token.html中给出了下载链接,欢迎各位尝试。
希望能解答sign
的获取来源,如果我描述的不够准确,可以在下方留言,感谢!