mirror of
https://github.com/PaiGramTeam/HonkaiStarRailWikiDataParser.git
synced 2025-02-07 06:08:44 +00:00
parent
f4bf762c4f
commit
95d8a94411
@ -28,7 +28,7 @@ class AvatarPromote(BaseModel):
|
|||||||
|
|
||||||
coin: int = 0
|
coin: int = 0
|
||||||
"""信用点"""
|
"""信用点"""
|
||||||
items: list[AvatarItem]
|
items: List[AvatarItem]
|
||||||
"""突破所需材料"""
|
"""突破所需材料"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
# 光锥
|
# 光锥
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from .enums import Quality, Destiny
|
from .enums import Quality, Destiny
|
||||||
@ -22,7 +24,7 @@ class LightConePromote(BaseModel):
|
|||||||
|
|
||||||
coin: int = 0
|
coin: int = 0
|
||||||
"""信用点"""
|
"""信用点"""
|
||||||
items: list[LightConeItem]
|
items: List[LightConeItem]
|
||||||
"""突破所需材料"""
|
"""突破所需材料"""
|
||||||
|
|
||||||
|
|
||||||
@ -41,9 +43,9 @@ class LightCone(BaseModel):
|
|||||||
"""稀有度"""
|
"""稀有度"""
|
||||||
destiny: Destiny
|
destiny: Destiny
|
||||||
"""命途"""
|
"""命途"""
|
||||||
promote: list[LightConePromote]
|
promote: List[LightConePromote]
|
||||||
"""晋阶信息"""
|
"""晋阶信息"""
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def rarity(self) -> int:
|
def rarity(self) -> int:
|
||||||
return 5 - list(Quality).index(self.quality)
|
return 5 - list[Quality].index(self.quality)
|
||||||
|
@ -6,7 +6,7 @@ import aiofiles
|
|||||||
import ujson
|
import ujson
|
||||||
from bs4 import BeautifulSoup, Tag
|
from bs4 import BeautifulSoup, Tag
|
||||||
|
|
||||||
from func.fetch_avatars import read_avatars, all_avatars_name, dump_avatars
|
from func.fetch_avatars import read_avatars, all_avatars_name, dump_avatars, all_avatars, all_avatars_map
|
||||||
from .client import client
|
from .client import client
|
||||||
from .url import avatar_config, text_map, base_station_url, avatar_url
|
from .url import avatar_config, text_map, base_station_url, avatar_url
|
||||||
from models.avatar_config import AvatarConfig, AvatarIcon
|
from models.avatar_config import AvatarConfig, AvatarIcon
|
||||||
@ -28,9 +28,11 @@ async def fetch_config(text_map_data: Dict[str, str]) -> List[AvatarConfig]:
|
|||||||
return datas
|
return datas
|
||||||
|
|
||||||
|
|
||||||
async def parse_station(datas, name: str, tag: Tag, avatar: AvatarConfig):
|
async def parse_station(datas, name: str, tag: Tag, cid: int):
|
||||||
second_pic = ""
|
second_pic = ""
|
||||||
if avatar_model := all_avatars_name.get(name):
|
if avatar_model := all_avatars_map.get(cid):
|
||||||
|
second_pic = avatar_model.icon
|
||||||
|
elif avatar_model := all_avatars_name.get(name):
|
||||||
second_pic = avatar_model.icon
|
second_pic = avatar_model.icon
|
||||||
third_pic = f'{base_station_url}{tag.find("img").get("src")}'
|
third_pic = f'{base_station_url}{tag.find("img").get("src")}'
|
||||||
html = await client.get(f'{base_station_url}{tag.get("href")}')
|
html = await client.get(f'{base_station_url}{tag.get("href")}')
|
||||||
@ -40,8 +42,8 @@ async def parse_station(datas, name: str, tag: Tag, avatar: AvatarConfig):
|
|||||||
first_pic = f'{base_station_url}{soup.find("img", {"class": "ac39b a6602"}).get("src")}'
|
first_pic = f'{base_station_url}{soup.find("img", {"class": "ac39b a6602"}).get("src")}'
|
||||||
datas.append(
|
datas.append(
|
||||||
AvatarIcon(
|
AvatarIcon(
|
||||||
id=avatar.AvatarID,
|
id=cid,
|
||||||
name=avatar.name,
|
name=name,
|
||||||
icon=[first_pic, second_pic, third_pic, four_pic],
|
icon=[first_pic, second_pic, third_pic, four_pic],
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -54,6 +56,18 @@ async def dump_icons(path: Path, datas: List[AvatarIcon]):
|
|||||||
await f.write(ujson.dumps(data, indent=4, ensure_ascii=False))
|
await f.write(ujson.dumps(data, indent=4, ensure_ascii=False))
|
||||||
|
|
||||||
|
|
||||||
|
async def fetch_station_ktz(tasks, datas, player_avatars: List[Tag]):
|
||||||
|
data_map = {
|
||||||
|
"开拓者·毁灭": (8001, 8002),
|
||||||
|
"开拓者·存护": (8003, 8004)
|
||||||
|
}
|
||||||
|
idx = 0
|
||||||
|
for key, value in data_map.items():
|
||||||
|
tasks.append(parse_station(datas, key, player_avatars[idx], value[0]))
|
||||||
|
tasks.append(parse_station(datas, key, player_avatars[idx + 1], value[1]))
|
||||||
|
idx += 2
|
||||||
|
|
||||||
|
|
||||||
async def fetch_station(configs_map: Dict[str, AvatarConfig]) -> List[AvatarIcon]:
|
async def fetch_station(configs_map: Dict[str, AvatarConfig]) -> List[AvatarIcon]:
|
||||||
print("开始获取角色素材")
|
print("开始获取角色素材")
|
||||||
html = await client.get(avatar_url)
|
html = await client.get(avatar_url)
|
||||||
@ -61,38 +75,51 @@ async def fetch_station(configs_map: Dict[str, AvatarConfig]) -> List[AvatarIcon
|
|||||||
avatars = soup.find_all("a", {"class": "char-entry-select-option"})
|
avatars = soup.find_all("a", {"class": "char-entry-select-option"})
|
||||||
tasks = []
|
tasks = []
|
||||||
datas: List[AvatarIcon] = []
|
datas: List[AvatarIcon] = []
|
||||||
ktz = False
|
player_avatars = []
|
||||||
for avatar in avatars:
|
for avatar in avatars:
|
||||||
name = avatar.find("span").get_text().strip()
|
name = avatar.find("span").get_text().strip()
|
||||||
if name == "开拓者" and ktz:
|
if name == "开拓者":
|
||||||
|
player_avatars.append(avatar)
|
||||||
continue
|
continue
|
||||||
if avatar_model := configs_map.get(name):
|
if avatar_model := configs_map.get(name):
|
||||||
tasks.append(parse_station(datas, name, avatar, avatar_model))
|
tasks.append(parse_station(datas, name, avatar, avatar_model.AvatarID))
|
||||||
if name == "开拓者":
|
|
||||||
ktz = True
|
|
||||||
else:
|
else:
|
||||||
print(f"未找到角色 {name} 的数据")
|
print(f"未找到角色 {name} 的数据")
|
||||||
|
await fetch_station_ktz(tasks, datas, player_avatars)
|
||||||
await asyncio.gather(*tasks)
|
await asyncio.gather(*tasks)
|
||||||
return datas
|
return datas
|
||||||
|
|
||||||
|
|
||||||
|
async def fix_avatar_config_ktz():
|
||||||
|
data_map = {"开拓者·毁灭": (8001, 8002), "开拓者·存护": (8003, 8004)}
|
||||||
|
for key, value in data_map.items():
|
||||||
|
one = all_avatars_name[key]
|
||||||
|
one.name = key
|
||||||
|
two = one.copy()
|
||||||
|
one.id = value[0]
|
||||||
|
two.id = value[1]
|
||||||
|
all_avatars.append(two)
|
||||||
|
all_avatars_map[value[0]] = one
|
||||||
|
all_avatars_map[value[1]] = two
|
||||||
|
all_avatars_name[one.name] = one
|
||||||
|
|
||||||
|
|
||||||
async def fix_avatar_config(text_map_data: Dict[str, str]):
|
async def fix_avatar_config(text_map_data: Dict[str, str]):
|
||||||
configs = await fetch_config(text_map_data)
|
configs = await fetch_config(text_map_data)
|
||||||
configs_map: Dict[str, AvatarConfig] = {config.name: config for config in configs}
|
configs_map: Dict[str, AvatarConfig] = {config.name: config for config in configs}
|
||||||
configs_map["开拓者"] = configs_map["{NICKNAME}"]
|
|
||||||
print(f"读取到原始数据:{list(configs_map.keys())}")
|
print(f"读取到原始数据:{list(configs_map.keys())}")
|
||||||
data_path = Path("data")
|
data_path = Path("data")
|
||||||
await read_avatars(data_path / "avatars.json")
|
await read_avatars(data_path / "avatars.json")
|
||||||
for key, value in all_avatars_name.items():
|
for key, value in all_avatars_name.items():
|
||||||
if key.startswith("开拓者"):
|
if key.startswith("开拓者"):
|
||||||
config = configs_map["{NICKNAME}"]
|
continue
|
||||||
config.name = "开拓者"
|
|
||||||
else:
|
else:
|
||||||
config = configs_map.get(key)
|
config = configs_map.get(key)
|
||||||
if config is None:
|
if config is None:
|
||||||
print(f"错误:未找到角色 {key} 的配置")
|
print(f"错误:未找到角色 {key} 的配置")
|
||||||
continue
|
continue
|
||||||
value.id = config.AvatarID
|
value.id = config.AvatarID
|
||||||
|
await fix_avatar_config_ktz()
|
||||||
icons = await fetch_station(configs_map)
|
icons = await fetch_station(configs_map)
|
||||||
await dump_icons(data_path / "avatar_icons.json", icons)
|
await dump_icons(data_path / "avatar_icons.json", icons)
|
||||||
await dump_avatars(data_path / "avatars.json")
|
await dump_avatars(data_path / "avatars.json")
|
||||||
|
Loading…
Reference in New Issue
Block a user