mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-08 04:55:51 +08:00
🧑💻 新增一部分虚空数据库
的API (#499)
This commit is contained in:
parent
437f715edb
commit
569c774be6
@ -8,6 +8,10 @@ from ..genshinuid_xkdata import draw_xk_abyss_img
|
||||
from ..genshinuid_help.draw_help_card import draw_help_img
|
||||
from ..genshinuid_guide.get_abyss_data import generate_data
|
||||
from ..utils.resource.generate_char_card import create_all_char_card
|
||||
from ..genshinuid_xkdata.get_all_char_data import (
|
||||
save_all_char_info,
|
||||
save_all_abyss_rank,
|
||||
)
|
||||
|
||||
|
||||
async def all_start():
|
||||
@ -17,6 +21,8 @@ async def all_start():
|
||||
await create_all_char_card()
|
||||
await draw_xk_abyss_img()
|
||||
await generate_data()
|
||||
await save_all_char_info()
|
||||
await save_all_abyss_rank()
|
||||
except Exception as e:
|
||||
logger.exception(e)
|
||||
|
||||
|
73
GenshinUID/genshinuid_xkdata/get_all_char_data.py
Normal file
73
GenshinUID/genshinuid_xkdata/get_all_char_data.py
Normal file
@ -0,0 +1,73 @@
|
||||
import json
|
||||
from typing import Dict, List, Tuple, Optional
|
||||
|
||||
import aiofiles
|
||||
|
||||
from ..utils.resource.RESOURCE_PATH import DATA_PATH
|
||||
from ..utils.map.name_covert import name_to_avatar_id, alias_to_char_name
|
||||
from ..gsuid_utils.api.akashadata.models import (
|
||||
AKaShaRank,
|
||||
AKaShaUsage,
|
||||
AKaShaCharData,
|
||||
)
|
||||
from ..gsuid_utils.api.akashadata.request import (
|
||||
get_akasha_abyss_rank,
|
||||
get_akasha_all_char_info,
|
||||
)
|
||||
|
||||
all_char_info_path = DATA_PATH / 'all_char_info.json'
|
||||
abyss_rank_path = DATA_PATH / 'abyss_rank.json'
|
||||
|
||||
|
||||
async def save_all_char_info():
|
||||
all_char_info = await get_akasha_all_char_info()
|
||||
async with aiofiles.open(all_char_info_path, 'w') as f:
|
||||
await f.write(str(all_char_info))
|
||||
|
||||
|
||||
async def save_all_abyss_rank():
|
||||
abyss_rank = await get_akasha_abyss_rank()
|
||||
async with aiofiles.open(abyss_rank_path, 'w') as f:
|
||||
await f.write(str(abyss_rank))
|
||||
|
||||
|
||||
async def get_akasha_char_data(
|
||||
char_name: str,
|
||||
) -> Optional[Tuple[AKaShaCharData, List[AKaShaUsage]]]:
|
||||
if not all_char_info_path.exists():
|
||||
await save_all_char_info()
|
||||
if not abyss_rank_path.exists():
|
||||
await save_all_abyss_rank()
|
||||
|
||||
async with aiofiles.open(all_char_info_path, 'r') as f:
|
||||
all_char_info: Dict[str, AKaShaCharData] = json.loads(await f.read())
|
||||
|
||||
async with aiofiles.open(abyss_rank_path, 'r') as f:
|
||||
abyss_rank: AKaShaRank = json.loads(await f.read())
|
||||
useage_rank = abyss_rank['usage_list']
|
||||
|
||||
char_name = await alias_to_char_name(char_name)
|
||||
char_id = await name_to_avatar_id(char_name)
|
||||
|
||||
if not char_id:
|
||||
return None
|
||||
|
||||
_char_id = char_id.lstrip('100000').strip('0')
|
||||
if _char_id not in all_char_info:
|
||||
return None
|
||||
|
||||
char_data = all_char_info[_char_id]
|
||||
_char_id_int = int(_char_id)
|
||||
char_useage: List[AKaShaUsage] = []
|
||||
for _char in useage_rank:
|
||||
if _char['i'] == _char_id_int:
|
||||
char_useage.append(_char)
|
||||
return char_data, char_useage
|
||||
|
||||
|
||||
async def draw_char_card(char_name: str):
|
||||
data = await get_akasha_char_data(char_name)
|
||||
if data is None:
|
||||
return
|
||||
char_data, char_useage = data[0], data[1]
|
||||
return char_data, char_useage
|
@ -4,3 +4,6 @@ AKASHA_ABYSS_URL = (
|
||||
AKASHA_RANK_URL = (
|
||||
'https://akashadata.feixiaoqiu.com/static/data/abyss_record_list.js'
|
||||
)
|
||||
AKASHA_CHAR_URL = (
|
||||
'https://akashadata.feixiaoqiu.com/static/data/card_details.js?v='
|
||||
)
|
||||
|
@ -99,3 +99,36 @@ class AKaShaRank(TypedDict):
|
||||
usage_list: List[AKaShaUsage]
|
||||
maxrate_list: List[AKaShaUsage]
|
||||
out_list: List[AKaShaUsage]
|
||||
|
||||
|
||||
class AKaShaWeaponRate(TypedDict):
|
||||
name: str
|
||||
id: int
|
||||
weapon_icon: str
|
||||
rarity: int
|
||||
rate: str
|
||||
|
||||
|
||||
class AKaShaOneEquipRate(TypedDict):
|
||||
set: str
|
||||
name: str
|
||||
count: str
|
||||
|
||||
|
||||
class AKaShaEquipRate(TypedDict):
|
||||
rate: str
|
||||
set_list: List[AKaShaOneEquipRate]
|
||||
|
||||
|
||||
class AKaShaAbyssChar(TypedDict):
|
||||
use_rate: str
|
||||
maxstar_rate: str
|
||||
come_rate: float
|
||||
avg_level: float
|
||||
avg_constellation: float
|
||||
|
||||
|
||||
class AKaShaCharData(TypedDict):
|
||||
weapons: List[AKaShaWeaponRate]
|
||||
equips: List[AKaShaEquipRate]
|
||||
abyss: AKaShaAbyssChar
|
||||
|
@ -4,14 +4,14 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from typing import Literal, Optional
|
||||
from typing import Dict, Literal, Optional
|
||||
|
||||
from httpx import AsyncClient
|
||||
|
||||
from ..types import AnyDict
|
||||
from ...version import __version__
|
||||
from .models import AKaShaRank, AkashaAbyssData
|
||||
from .api import AKASHA_RANK_URL, AKASHA_ABYSS_URL
|
||||
from .models import AKaShaRank, AKaShaCharData, AkashaAbyssData
|
||||
from .api import AKASHA_CHAR_URL, AKASHA_RANK_URL, AKASHA_ABYSS_URL
|
||||
|
||||
_HEADER = {'User-Agent': f'gsuid-utils/{__version__}'}
|
||||
|
||||
@ -28,6 +28,20 @@ async def get_akasha_abyss_info() -> AkashaAbyssData:
|
||||
return data
|
||||
|
||||
|
||||
async def get_akasha_all_char_info() -> Dict[str, AKaShaCharData]:
|
||||
raw_data = await _akasha_request(AKASHA_CHAR_URL)
|
||||
raw_data = (
|
||||
raw_data.replace('\\', '')
|
||||
.lstrip('var static_card_details =')
|
||||
.replace('"[', '[')
|
||||
.replace(']"', ']')
|
||||
.replace('"{', '{')
|
||||
.replace('}"', '}')
|
||||
)
|
||||
data = json.loads(raw_data)
|
||||
return data
|
||||
|
||||
|
||||
async def get_akasha_abyss_rank(is_info: bool = False) -> AKaShaRank:
|
||||
raw_data = await _akasha_request(AKASHA_RANK_URL)
|
||||
raw_data = raw_data.lstrip('var static_abyss_total =')
|
||||
|
@ -33,7 +33,7 @@ WIKI_CHAR_PATH = WIKI_PATH / 'char'
|
||||
WIKI_COST_CHAR_PATH = WIKI_PATH / 'cost_char'
|
||||
WIKI_COST_WEAPON_PATH = WIKI_PATH / 'cost_weapon'
|
||||
TEXT2D_PATH = Path(__file__).parent / 'texture2d'
|
||||
|
||||
DATA_PATH = MAIN_PATH / 'data'
|
||||
PLAYER_PATH = MAIN_PATH / 'players'
|
||||
|
||||
|
||||
@ -68,6 +68,7 @@ def init_dir():
|
||||
WIKI_CHAR_PATH,
|
||||
WIKI_COST_CHAR_PATH,
|
||||
WIKI_COST_WEAPON_PATH,
|
||||
DATA_PATH,
|
||||
]:
|
||||
i.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
10
poetry.lock
generated
10
poetry.lock
generated
@ -1551,19 +1551,19 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
|
||||
|
||||
[[package]]
|
||||
name = "platformdirs"
|
||||
version = "3.2.0"
|
||||
version = "3.3.0"
|
||||
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"},
|
||||
{file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"},
|
||||
{file = "platformdirs-3.3.0-py3-none-any.whl", hash = "sha256:ea61fd7b85554beecbbd3e9b37fb26689b227ffae38f73353cbcc1cf8bd01878"},
|
||||
{file = "platformdirs-3.3.0.tar.gz", hash = "sha256:64370d47dc3fca65b4879f89bdead8197e93e05d696d6d1816243ebae8595da5"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"]
|
||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
|
||||
docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"]
|
||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
|
||||
|
||||
[[package]]
|
||||
name = "pluggy"
|
||||
|
Loading…
x
Reference in New Issue
Block a user