移除不需要的文件
This commit is contained in:
parent
aca9a0819c
commit
5bc487c9ca
@ -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))
|
||||
@ -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
|
||||
Loading…
Reference in New Issue
Block a user