From 5bc487c9cad0b952d4ace0bfc8676e4c46570726 Mon Sep 17 00:00:00 2001 From: ccc_dw <2931589710@qq.com> Date: Thu, 25 Dec 2025 17:47:15 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=8D=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/bf_bot/bf6_state_data.py | 173 -------------------- src/plugins/bf_bot/bf_state_data.py | 233 --------------------------- 2 files changed, 406 deletions(-) delete mode 100644 src/plugins/bf_bot/bf6_state_data.py delete mode 100644 src/plugins/bf_bot/bf_state_data.py diff --git a/src/plugins/bf_bot/bf6_state_data.py b/src/plugins/bf_bot/bf6_state_data.py deleted file mode 100644 index 325b08f..0000000 --- a/src/plugins/bf_bot/bf6_state_data.py +++ /dev/null @@ -1,173 +0,0 @@ -import json -import asyncio -import os -from curl_cffi import requests, AsyncSession, CurlError -from nonebot import logger - -url_search = "https://api.tracker.gg/api/v2/bf6/standard/search?platform=origin&query={name}&autocomplete=true" -url_overview = "https://api.tracker.gg/api/v2/bf6/standard/profile/ign/{user_id}?" - -filepath = os.path.dirname(__file__).replace("\\", "/") - - -def load_cookies_from_txt(path: str): - cookies = [] - with open(path, "r", encoding="utf-8") as f: - for line in f: - if line.startswith("#") or not line.strip(): - continue - parts = line.strip().split("\t") - if len(parts) >= 7: - cookies.append({"name": parts[5], "value": parts[6]}) - return cookies - - -def build_cookie_header(cookies): - return "; ".join([f"{c['name']}={c['value']}" for c in cookies]) - - -async def fetch_url(url: str, headers: dict): - async with AsyncSession() as session: - try: - response = await session.get(url, headers=headers, impersonate="chrome110") - return response - except CurlError as e: - logger.warning("cURL 错误:", e) - return None - - -async def search_user(name: str): - cookies = load_cookies_from_txt(f"{filepath}/cookies/tracker.txt") - cookie_header = build_cookie_header(cookies) - headers = { - "accept": "*/*", - "accept-language": "zh-CN,zh;q=0.9,en;q=0.8", - "user-agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/139.0.0.0 Safari/537.36" - ), - "cookie": cookie_header, - "referer": "https://tracker.gg/", - } - - search_url = url_search.format(name=name) - response = await fetch_url(search_url, headers=headers) - if not response: - logger.warning("请求失败") - return - - if response.status_code == 200: - logger.info("搜索成功") - json_data = response.json() - title_id_list = [] - for res in json_data['data']: - title_id_list.append(res['titleUserId']) - for title_id in title_id_list: - flag, info = await get_data(title_id) - if flag: - return info - else: - continue - else: - logger.warning(f"请求失败,状态码: {response.status_code}") - logger.warning(response.text) - - -async def get_data(user_id: str): - cookies = load_cookies_from_txt(f"{filepath}/cookies/tracker.txt") - cookie_header = build_cookie_header(cookies) - headers = { - "accept": "*/*", - "accept-language": "zh-CN,zh;q=0.9,en;q=0.8", - "user-agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/139.0.0.0 Safari/537.36" - ), - "cookie": cookie_header, - "referer": "https://tracker.gg/", - } - - get_url = url_overview.format(user_id=user_id) - response = await fetch_url(get_url, headers=headers) - if not response: - logger.warning("获取失败") - return False - - if response.status_code == 200: - logger.info("获取成功") - platform_info = response.json()['data']['platformInfo'] - segments = response.json()['data']['segments'] - - overview = "" - weapons = [] - vehicles = [] - gamemodes = [] - gadgets = [] - kits = [] - maps = [] - - for segment in segments: - if segment['type'] == 'overview': - overview = segment - elif segment['type'] == 'weapon': - weapons.append(segment) - elif segment['type'] == 'vehicle': - vehicles.append(segment) - elif segment['type'] == 'gamemode': - gamemodes.append(segment) - elif segment['type'] == 'gadget': - gadgets.append(segment) - elif segment['type'] == 'kit': - kits.append(segment) - elif segment['type'] == 'level': - maps.append(segment) - - top_kill_weapon = sorted(weapons, key=lambda k: k['stats']['kills']['value'], reverse=True)[0] - best_weapon = { - "名称": top_kill_weapon['metadata']['name'], - "击杀": top_kill_weapon['stats']['kills']['value'], - "KPM": top_kill_weapon['stats']['killsPerMinute']['value'], - "时长": top_kill_weapon['stats']['timePlayed']['displayValue'], - "爆头率": top_kill_weapon['stats']['headshotPercentage']['displayValue'], - "命中率": top_kill_weapon['stats']['shotsAccuracy']['displayValue'] - } - top_kill_vehicle = sorted(vehicles, key=lambda k: k['stats']['kills']['value'], reverse=True)[0] - best_vehicle = { - "名称": top_kill_vehicle['metadata']['name'], - "击杀": top_kill_vehicle['stats']['kills']['value'], - "KPM": top_kill_vehicle['stats']['killsPerMinute']['value'], - "时长": top_kill_vehicle['stats']['timePlayed']['displayValue'], - "碾压": top_kill_vehicle['stats']['roadKills']['value'], - - } - - player_info = { - '玩家': platform_info['platformUserHandle'], - '平台': platform_info['platformSlug'], - '等级': overview['stats']['careerPlayerRank']['displayValue'], - '时长': overview['stats']['timePlayed']['displayValue'], - '场次': overview['stats']['matchesPlayed']['displayValue'], - '胜率': overview['stats']['wlPercentage']['displayValue'], - '总得分': overview['stats']['score']['displayValue'], - 'K/D': overview['stats']['kdRatio']['value'], - 'KPM': overview['stats']['killsPerMinute']['value'], - 'SPM': overview['stats']['scorePerMinute']['value'], - '击杀': overview['stats']['kills']['displayValue'], - '助攻': overview['stats']['assists']['displayValue'], - '救援': overview['stats']['revives']['displayValue'], - '命中率': f"{round(overview['stats']['shotsFired']['value'] / overview['stats']['shotsHit']['value'])}%", - '爆头率': overview['stats']['headshotPercentage']['displayValue'], - '最佳武器': best_weapon, - '最佳载具': best_vehicle, - } - return True, player_info - else: - logger.warning(f"请求失败,状态码: {response.status_code}") - logger.warning(response.text) - - -if __name__ == "__main__": - name = "HEIZI-HARUSAME" - asyncio.run(search_user(name)) diff --git a/src/plugins/bf_bot/bf_state_data.py b/src/plugins/bf_bot/bf_state_data.py deleted file mode 100644 index 15df206..0000000 --- a/src/plugins/bf_bot/bf_state_data.py +++ /dev/null @@ -1,233 +0,0 @@ -import json -from nonebot import logger -import os - -from cffi.model import voidp_type -from jinja2 import Environment, FileSystemLoader -from playwright.async_api import async_playwright, ViewportSize -import asyncio - -from Core.Utils import get_root_path -from Core.BrowserCore import BrowserTab -from curl_cffi import requests, AsyncSession, CurlError -import base64 - -b = BrowserTab("https://battlefieldtracker.com/bf2042/profile/origin/Sansorano_Yume/overview") - -url_zy = "https://battlefieldtracker.com/bf2042/profile/origin/{name}/overview" -url_over = "https://api.tracker.gg/api/v2/bf2042/standard/profile/origin/{name}" -url_weapon = "https://api.tracker.gg/api/v2/bf2042/standard/profile/origin/{name}/segments/weapon" -url_vehicle = "https://api.tracker.gg/api/v2/bf2042/standard/profile/origin/{name}/segments/vehicle" -url_soldier = "https://api.tracker.gg/api/v2/bf2042/standard/profile/origin/{name}/segments/soldier" -url_history = "https://api.tracker.gg/api/v2/bf2042/standard/profile/origin/{name}/history" -url_ban = "https://api.gametools.network/bfban/checkban/?names={name}" - -url_dict = { - "overview": url_over, - "weapons": url_weapon, - "vehicle": url_vehicle, - "soldier": url_soldier, - "ban": url_ban, -} -headers = { - "accept": "*/*", - "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5", - "priority": "u=1, i", - "sec-ch-ua": '"Not;A=Brand";v="99", "Microsoft Edge";v="139", "Chromium";v="139"', - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": '"Windows"', - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" -} -classesList = { - "Mackay": " 麦凯", - "Angel": " 天使", - "Falck": " 法尔克", - "Paik": " 白智秀", - "Sundance": " 日舞", - "Dozer": " 推土机", - "Rao": " 拉奥", - "Lis": " 莉丝", - "Irish": "爱尔兰佬", - "Crawford": "克劳福德", - "Boris": " 鲍里斯", - "Zain": " 扎因", - "Casper": " 卡斯帕", - "Blasco": "布拉斯科", - "BF3 Recon": "BF3 侦察", - "BF3 Support": "BF3 支援", - "BF3 Assault": "BF3 突击", - "BF3 Engineer": "BF3 工程", - "BC2 Recon": "BC2 侦察", - "BC2 Medic": "BC2 医疗", - "BC2 Assault": "BC2 突击", - "BC2 Engineer": "BC2 工程", - "1942 Anti-tank": "1942 反坦克", - "1942 Assault": "1942 突击", - "1942 Medic": "1942 医疗", - "1942 Engineer": "1942 工程", - "1942 Scout": "1942 侦察", -} - - -def get_base64(img_path: str, deafult: str = None): - path = f"{get_root_path()}/{img_path}" - if not os.path.exists(path): - if deafult is None: - return False, None - return get_base64(deafult) - with open(path, "rb") as f: - return True, base64.b64encode(f.read()).decode() - - -async def fetch_url(url: str, name: str, browser: str = "chrome110"): - async with AsyncSession() as session: - try: - response = await session.get(url, impersonate=browser) - return { - "name": name, - "status": response.status_code, - "content": response.json(), - } - except TimeoutError: - return {"name": name, "status": 0, "error": "请求超时"} - except ConnectionError: - return {"name": name, "status": 0, "error": "连接失败"} - except CurlError as e: - return {"name": name, "status": 0, "error": f"底层 cURL 错误: {str(e)}"} - except Exception as e: - return {"name": name, "status": 0, "error": f"未知错误: {str(e)}"} - - -async def bf2042_state(cmd): - name = cmd - raw = {} - logger.info("开始get数据") - task = [fetch_url(v.format(name=name), k) for k, v in url_dict.items()] - res = await asyncio.gather(*task) - logger.info("开始解析数据") - if raw is None or isinstance(raw, str): - await event.send("没有找到该玩家或者服务器请求失败,请等待") - return - flag_cf = False - has_player = False - for i in res: - if i["status"] == 404: - try: - json.loads(i["content"]) - has_player = True - except json.JSONDecodeError: - flag_cf = True - return - if i["status"] == 0 or i["status"] == 400: - has_player = True - if flag_cf: - await event.send("当前数据获取失败,正在过盾,请等待响应") - await b.cf_bypasser.bypass_turnstile() - b.page.get_screenshot("img/hc.png") - if b.cf_bypasser.is_bypassed() or b.cf_bypasser.is_turnstile(): - await event.send("已获取认证,请重新查询") - else: - await event.send(Message(TextSegment("获取失败已返回结果图")).append(ImgSegment("img/hc.png"))) - return - if has_player: - await event.send("没有找到该玩家,,该文件的名字可能出错或者该玩家并未开启隐私设置") - return - logging.info(1) - overview = res[0]["content"]["data"]["segments"][0]["stats"] - logging.info(2) - res[1]["content"]["data"].sort(key=lambda x: x["stats"]["kills"]["value"], reverse=True) - weapons = res[1]["content"]["data"][:6] - # logging.info(weapons) - logging.info(3) - res[2]["content"]["data"].sort(key=lambda x: x["stats"]["kills"]["value"], reverse=True) - veh = res[2]["content"]["data"][:6] - logging.info(veh) - logging.info(4) - res[3]["content"]["data"].sort(key=lambda x: x["stats"]["kills"]["value"], reverse=True) - class_data = res[3]["content"]["data"][0] - # logging.info(class_data) - logging.info(5) - cheat_hack = res[4]["content"]["names"][name.lower()]["hacker"] - logging.info(6) - - percentile_kills = overview["kills"]["percentile"] - kills_t = f"Top {round(100 - percentile_kills, 2)}" if percentile > 50 else f"Bottom {percentile}" - kills_t = f"{kills_t}%" - - percentile_deaths = overview["deaths"]["percentile"] - death_t = f"Top {round(100 - percentile_deaths, 2)}" if percentile > 50 else f"Bottom {percentile}" - death_t = f"{death_t}%" - - percentile_assists = overview["assists"]["percentile"] - zg_t = f"Top {round(100 - percentile_assists, 2)}" if percentile > 50 else f"Bottom {percentile}" - zg_t = f"{zg_t}%" - - percentile_wins = overview["wins"]["percentile"] - slcs_t = f"Top {round(100 - percentile_wins, 2)}" if percentile > 50 else f"Bottom {percentile}" - slcs_t = f"{slcs_t}%" - - percentile_losses = overview["losses"]["percentile"] - sbcs_t = f"Top {round(100 - percentile_losses, 2)}" if percentile > 50 else f"Bottom {percentile}" - sbcs_t = f"{sbcs_t}%" - - percentile_revives = overview["revives"]["percentile"] - fhcs_t = f"Top {round(100 - percentile_revives, 2)}" if percentile > 50 else f"Bottom {percentile}" - fhcs_t = f"{fhcs_t}%" - - data = { - "playerName": name, - "level": overview["level"]["displayValue"], - "time": overview["timePlayed"]["displayValue"], - "kd": overview["kdRatio"]["displayValue"], - "kd_real": overview["humanKdRatio"]["displayValue"], - "kpm": overview["killsPerMinute"]["displayValue"], - "win_acc": overview["wlPercentage"]["displayValue"], - "kills": overview["kills"]["displayValue"], - "kills_p": overview["kills"]["percentile"], - "kills_t": kills_t, - "death": overview["deaths"]["displayValue"], - "death_p": overview["deaths"]["percentile"], - "death_t": death_t, - "ai_kills": overview["aiKills"]["displayValue"], - "zr_kills": overview["humanKills"]["displayValue"], - "zk_kills": overview["vehicleKills"]["displayValue"], - "dc_kills": overview["multiKills"]["displayValue"], - "jz_kills": overview["meleeKills"]["displayValue"], - "zj_kills": overview["roadKills"]["displayValue"], - "zg": overview["assists"]["displayValue"], - "zg_p": overview["assists"]["percentile"], - "zg_t": zg_t, - "slcs": overview["wins"]["displayValue"], - "slcs_p": overview["wins"]["percentile"], - "slcs_t": slcs_t, - "sbcs": overview["losses"]["displayValue"], - "sbcs_p": overview["losses"]["percentile"], - "sbcs_t": sbcs_t, - "fhcs": overview["revives"]["displayValue"], - "fhcs_p": overview["revives"]["percentile"], - "fhcs_t": fhcs_t, - "zsh": overview["damageDealt"]["displayValue"], - "mfzsh": round(overview["damageDealt"]["value"] / (overview["timePlayed"]["value"] / 60), 2), - "chzj": overview["vehiclesDestroyed"]["displayValue"], - "kjjs": overview["scopedKills"]["displayValue"], - "mbzlsj": overview["objectiveTime"]["displayValue"], - "zlmb": overview["objectivesCaptured"]["displayValue"], - "fsmb": overview["defendedObjectives"]["displayValue"], - "a_c_c": f"{overview['objectivesArmed']['displayValue']}/{overview['objectivesDisarmed']['displayValue']}/{overview['objectivesDestroyed']['displayValue']}", - "fsqy": overview["defendedSectors"]["displayValue"], - "sqqb": overview["intelPickedUp"]["displayValue"], - "tqqb": overview["intelExtracted"]["displayValue"], - "btl": overview["headshotPercentage"]["displayValue"], - "bts": overview["headshotKills"]["displayValue"], - "w_data": weapons, - "v_data": veh, - "zjmz": classesList[class_data["metadata"]["name"].strip()] if class_data["metadata"][ - "name"].strip() in classesList else - class_data["metadata"]["name"], - "zj_kd": class_data["stats"]["kdRatio"]["displayValue"], - "zj_kpm": class_data["stats"]["killsPerMinute"]["displayValue"], - "zjia_kills": class_data["stats"]["kills"]["displayValue"], - "zj_time": class_data["stats"]["timePlayed"]["displayValue"], - } - logger.info("解析数据完成") - return data