From 569c774be601b5ce3500612d24162207e7fb62b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wuyi=E6=97=A0=E7=96=91?= <444835641@qq.com> Date: Wed, 26 Apr 2023 01:02:08 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=B8=80=E9=83=A8=E5=88=86`=E8=99=9A=E7=A9=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93`=E7=9A=84API=20(#499)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenshinUID/genshinuid_start/__init__.py | 6 ++ .../genshinuid_xkdata/get_all_char_data.py | 73 +++++++++++++++++++ GenshinUID/gsuid_utils/api/akashadata/api.py | 3 + .../gsuid_utils/api/akashadata/models.py | 33 +++++++++ .../gsuid_utils/api/akashadata/request.py | 20 ++++- GenshinUID/utils/resource/RESOURCE_PATH.py | 3 +- poetry.lock | 10 +-- 7 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 GenshinUID/genshinuid_xkdata/get_all_char_data.py diff --git a/GenshinUID/genshinuid_start/__init__.py b/GenshinUID/genshinuid_start/__init__.py index d7317f3e..e9ce0c7a 100644 --- a/GenshinUID/genshinuid_start/__init__.py +++ b/GenshinUID/genshinuid_start/__init__.py @@ -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) diff --git a/GenshinUID/genshinuid_xkdata/get_all_char_data.py b/GenshinUID/genshinuid_xkdata/get_all_char_data.py new file mode 100644 index 00000000..1c8deec1 --- /dev/null +++ b/GenshinUID/genshinuid_xkdata/get_all_char_data.py @@ -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 diff --git a/GenshinUID/gsuid_utils/api/akashadata/api.py b/GenshinUID/gsuid_utils/api/akashadata/api.py index 929d4f37..20446656 100644 --- a/GenshinUID/gsuid_utils/api/akashadata/api.py +++ b/GenshinUID/gsuid_utils/api/akashadata/api.py @@ -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=' +) diff --git a/GenshinUID/gsuid_utils/api/akashadata/models.py b/GenshinUID/gsuid_utils/api/akashadata/models.py index 1483833e..1b125621 100644 --- a/GenshinUID/gsuid_utils/api/akashadata/models.py +++ b/GenshinUID/gsuid_utils/api/akashadata/models.py @@ -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 diff --git a/GenshinUID/gsuid_utils/api/akashadata/request.py b/GenshinUID/gsuid_utils/api/akashadata/request.py index 9a69f17d..2d04065d 100644 --- a/GenshinUID/gsuid_utils/api/akashadata/request.py +++ b/GenshinUID/gsuid_utils/api/akashadata/request.py @@ -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 =') diff --git a/GenshinUID/utils/resource/RESOURCE_PATH.py b/GenshinUID/utils/resource/RESOURCE_PATH.py index 7b501c39..2c9c2998 100644 --- a/GenshinUID/utils/resource/RESOURCE_PATH.py +++ b/GenshinUID/utils/resource/RESOURCE_PATH.py @@ -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) diff --git a/poetry.lock b/poetry.lock index 3b2a88c5..7e99a577 100644 --- a/poetry.lock +++ b/poetry.lock @@ -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"