🧑‍💻 新增一部分虚空数据库的API (#499)

This commit is contained in:
Wuyi无疑 2023-04-26 01:02:08 +08:00
parent 437f715edb
commit 569c774be6
7 changed files with 139 additions and 9 deletions

View File

@ -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)

View 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

View File

@ -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='
)

View File

@ -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

View File

@ -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 =')

View File

@ -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
View File

@ -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"