🧑‍💻 新增一部分虚空数据库的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_help.draw_help_card import draw_help_img
from ..genshinuid_guide.get_abyss_data import generate_data from ..genshinuid_guide.get_abyss_data import generate_data
from ..utils.resource.generate_char_card import create_all_char_card 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(): async def all_start():
@ -17,6 +21,8 @@ async def all_start():
await create_all_char_card() await create_all_char_card()
await draw_xk_abyss_img() await draw_xk_abyss_img()
await generate_data() await generate_data()
await save_all_char_info()
await save_all_abyss_rank()
except Exception as e: except Exception as e:
logger.exception(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 = ( AKASHA_RANK_URL = (
'https://akashadata.feixiaoqiu.com/static/data/abyss_record_list.js' '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] usage_list: List[AKaShaUsage]
maxrate_list: List[AKaShaUsage] maxrate_list: List[AKaShaUsage]
out_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 from __future__ import annotations
import json import json
from typing import Literal, Optional from typing import Dict, Literal, Optional
from httpx import AsyncClient from httpx import AsyncClient
from ..types import AnyDict from ..types import AnyDict
from ...version import __version__ from ...version import __version__
from .models import AKaShaRank, AkashaAbyssData from .models import AKaShaRank, AKaShaCharData, AkashaAbyssData
from .api import AKASHA_RANK_URL, AKASHA_ABYSS_URL from .api import AKASHA_CHAR_URL, AKASHA_RANK_URL, AKASHA_ABYSS_URL
_HEADER = {'User-Agent': f'gsuid-utils/{__version__}'} _HEADER = {'User-Agent': f'gsuid-utils/{__version__}'}
@ -28,6 +28,20 @@ async def get_akasha_abyss_info() -> AkashaAbyssData:
return data 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: async def get_akasha_abyss_rank(is_info: bool = False) -> AKaShaRank:
raw_data = await _akasha_request(AKASHA_RANK_URL) raw_data = await _akasha_request(AKASHA_RANK_URL)
raw_data = raw_data.lstrip('var static_abyss_total =') 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_CHAR_PATH = WIKI_PATH / 'cost_char'
WIKI_COST_WEAPON_PATH = WIKI_PATH / 'cost_weapon' WIKI_COST_WEAPON_PATH = WIKI_PATH / 'cost_weapon'
TEXT2D_PATH = Path(__file__).parent / 'texture2d' TEXT2D_PATH = Path(__file__).parent / 'texture2d'
DATA_PATH = MAIN_PATH / 'data'
PLAYER_PATH = MAIN_PATH / 'players' PLAYER_PATH = MAIN_PATH / 'players'
@ -68,6 +68,7 @@ def init_dir():
WIKI_CHAR_PATH, WIKI_CHAR_PATH,
WIKI_COST_CHAR_PATH, WIKI_COST_CHAR_PATH,
WIKI_COST_WEAPON_PATH, WIKI_COST_WEAPON_PATH,
DATA_PATH,
]: ]:
i.mkdir(parents=True, exist_ok=True) 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]] [[package]]
name = "platformdirs" 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\"." description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, {file = "platformdirs-3.3.0-py3-none-any.whl", hash = "sha256:ea61fd7b85554beecbbd3e9b37fb26689b227ffae38f73353cbcc1cf8bd01878"},
{file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, {file = "platformdirs-3.3.0.tar.gz", hash = "sha256:64370d47dc3fca65b4879f89bdead8197e93e05d696d6d1816243ebae8595da5"},
] ]
[package.extras] [package.extras]
docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] 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.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
[[package]] [[package]]
name = "pluggy" name = "pluggy"