From 2c7735aa2d9fcae22d9ddd6cb9e43e7b081783cd Mon Sep 17 00:00:00 2001 From: qsc20001102 Date: Sat, 13 Dec 2025 13:18:07 +0800 Subject: [PATCH] 11 --- core/jx3_service.py | 48 +++++++++++++++++++- data/api_config.json | 10 +++++ main.py | 16 +++++++ templates/yanhuan.html | 99 ++++++++++++++++++++++++++++++++++++++++++ test.py | 73 +++++++++++++++++++++++++------ 5 files changed, 231 insertions(+), 15 deletions(-) create mode 100644 templates/yanhuan.html diff --git a/core/jx3_service.py b/core/jx3_service.py index 628d6ac..7ab901e 100644 --- a/core/jx3_service.py +++ b/core/jx3_service.py @@ -625,7 +625,7 @@ class JX3Service: async def shuijimingpian(self, force: str, body:str, server:str) -> Dict[str, Any]: - """角色名片""" + """随机名片""" return_data = self._init_return_data() # 获取配置中的 Token @@ -651,3 +651,49 @@ class JX3Service: return_data["code"] = 200 return return_data + + + async def yanhuachaxun(self, server: str, name:str ) -> Dict[str, Any]: + """烟花查询""" + return_data = self._init_return_data() + + # 获取配置中的 Token + token = self._config.get("jx3api_token", "") + if token == "": + return_data["msg"] = "系统未配置API访问Token" + return return_data + + # 1. 构造请求参数 + params = {"server": server, "name": name,"token": token} + + # 2. 调用基础请求 + data: Optional[Dict[str, Any]] = await self._base_request( + "jx3_yanhuachaxun", "GET", params=params + ) + + if not data: + return_data["msg"] = "获取接口信息失败" + return return_data + + # 3. 处理返回数据 (直接提取图片 URL) + # 格式化时间 + for item in data: + timestamp = item.get("time") + if timestamp and isinstance(timestamp, (int, float)): + # 修复时间戳:原代码显示这里是毫秒级,除以 1000 + item["time"] = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S") + else: + item["time"] = "未知时间" # 确保即使 time 字段缺失也不会报错 + + # 4. 加载模板 + try: + return_data["temp"] = load_template("yanhuan.html") + except FileNotFoundError as e: + logger.error(f"加载模板失败: {e}") + return_data["msg"] = "系统错误:模板文件不存在" + return return_data + + return_data["data"]["list"] = data + return_data["code"] = 200 + + return return_data diff --git a/data/api_config.json b/data/api_config.json index 23e08a3..1829732 100644 --- a/data/api_config.json +++ b/data/api_config.json @@ -166,5 +166,15 @@ "force":"万花", "token":"" } + }, + "jx3_yanhuachaxun":{ + "url":"https://www.jx3api.com/data/fireworks/records", + "method":"GET", + "description":"此接口用于查询烟花赠送与接收的历史记录,数据可能存在遗漏", + "params":{ + "server": "唯我独尊", + "name": "萝莉", + "token":"" + } } } \ No newline at end of file diff --git a/main.py b/main.py index 7c47345..145e2d3 100644 --- a/main.py +++ b/main.py @@ -308,6 +308,22 @@ class Jx3ApiPlugin(Star): yield event.plain_result("猪脑过载,请稍后再试") + @jx3.command("烟花") + async def jx3_yanhuachaxun(self, event: AstrMessageEvent,server: str = "梦江南", name: str = "飞翔大野猪"): + """剑三 烟花 服务器 角色""" + try: + data= await self.jx3fun.yanhuachaxun(server,name) + if data["code"] == 200: + url = await self.html_render(data["temp"], data["data"], options={}) + yield event.image_result(url) + else: + yield event.plain_result(data["msg"]) + return + except Exception as e: + logger.error(f"功能函数执行错误: {e}") + yield event.plain_result("猪脑过载,请稍后再试") + + async def terminate(self): """可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。""" # 关闭数据库连接 diff --git a/templates/yanhuan.html b/templates/yanhuan.html new file mode 100644 index 0000000..ddeda54 --- /dev/null +++ b/templates/yanhuan.html @@ -0,0 +1,99 @@ + + + + +烟花记录 + + + + + +
+

烟花记录

+ + + + + + + + + + + + + + + {% for m in list %} + + + + + + + + + {% endfor %} + +
服务器烟花名称使用地点释放角色接收角色释放时间
{{ m.server }}{{ m.name }}{{ m.map_name }}{{ m.sender }}{{ m.receive }}{{ m.time }}
+ +
+ + + diff --git a/test.py b/test.py index ab2efbd..678caaa 100644 --- a/test.py +++ b/test.py @@ -1,14 +1,59 @@ -import http.client - -conn = http.client.HTTPSConnection("api.t1qq.com") -payload = '' -headers = { - 'User-Agent': 'Apifox/1.0.0 (https://apifox.com)', - 'Accept': '*/*', - 'Host': 'api.t1qq.com', - 'Connection': 'keep-alive' -} -conn.request("GET", "/api/tool/wzrr/ydtp?key=vBpEzoiC9z5A9c9Nn83IhLn6M9&id=489048724", payload, headers) -res = conn.getresponse() -data = res.read() -print(data) \ No newline at end of file +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) \ No newline at end of file