From 652bbdf2f381967658c7e6b94dbed9100852a362 Mon Sep 17 00:00:00 2001 From: sunxiaolong Date: Fri, 9 Aug 2024 10:09:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0redis=E5=92=8Cmysql?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .idea/.gitignore | 8 --- .idea/inspectionProfiles/Project_Default.xml | 14 ----- .../inspectionProfiles/profiles_settings.xml | 6 -- .idea/itunes.iml | 8 --- .idea/misc.xml | 7 --- .idea/modules.xml | 8 --- config.yml | 21 +++++++ main.py | 15 +---- requirements.txt | 4 +- src/config/settings.py | 59 +++++++++++++++++++ src/database/__init__.py | 1 + src/database/redis_db.py | 35 +++++++++++ src/initialization/log/log.py | 13 ++++ src/service/service.py | 31 ++++++---- 15 files changed, 153 insertions(+), 79 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/itunes.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml create mode 100644 config.yml create mode 100644 src/config/settings.py create mode 100644 src/database/__init__.py create mode 100644 src/database/redis_db.py create mode 100644 src/initialization/log/log.py diff --git a/.gitignore b/.gitignore index 723ef36..57f1cb2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -.idea \ No newline at end of file +/.idea/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 0c6e339..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/itunes.iml b/.idea/itunes.iml deleted file mode 100644 index a69053b..0000000 --- a/.idea/itunes.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index cbe2358..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 47e7a7b..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..4a8ffe3 --- /dev/null +++ b/config.yml @@ -0,0 +1,21 @@ +server: + host: 0.0.0.0 + logger: + level: info + path: ./data/log + port: 8080 + debug: true + +database: + schema: mysql + host: IP_ADDRESS + port: 3306 + user: USER + password: PASSWORD + database: DATABASE + +redis: + host: IP_ADDRESS + port: 6379 + password: PASSWORD + db: 0 diff --git a/main.py b/main.py index e3d1cb7..42e0804 100644 --- a/main.py +++ b/main.py @@ -1,15 +1,4 @@ -from src.integrations.june.utils import decode_and_decompress +from src.config.settings import Settings if __name__ == "__main__": - # six_client = SixClient() - # six_client.login() - # six_client.check_is_login() - # print(six_client.login_remote_apple_account(AppleAccountModel( - # account="williamz5nvke@hotmail.com", - # password="Eq991155", - # ))) - print( - decode_and_decompress( - "H4sIAAAAAAAEADVT266rNhD9la1IR2qldh8DSbpz+hTuIcEJxjbEb4BRAAOhCeFW9d/rqKd+GWtp1sya0ay/V83ztvqxAvKtfls9y1ub9K9HLqGLuVun0XjjDZ0ztR7SCpR+uB4PpV6nDRyYU7/YAkpKkXPCt/KyrI8Xw7YwgCSiun1w9WcSQ3CwdRqIyQvmfXkKv4Yg1sfUIcMJIIIMPcBWjamxn07VXmL0fCj3ZeIikJn34aRxjc+bIpO1WLipUhUMyEZWNu+CrNmNLPZATqYu04L+re3UIMCMwzc1NapJdqkXbuiqzFqSaPe6hId3l/Jyu39J9RU310cDTw8WC8mQM7ZpqSzXeN9nKgVcxmtLGybnvxi7n1nGTUiuDa5YcomNEqsXyNiFidaBpOkPidt5nPhTHnlrJjY9srsWWj3mMdLymkW5y040UhaG7XNe1RPB6AAbr2I0m4+KP/CYm9zmUPZRjipUeYMOIalt3+1eIUUbLiBJNZ6cKWxC2unHRX/gqHOZ2P3luzqIcP3ICbewUswhuM4ohjOJuiYU8Mpd/5E53Qj3dw+adZ85BcOEPZkarFPBCaX1Ftd3za+DAca2FWpeQdWpTR2+pSrc+GQcE0vZQgIr5kxuJqwhVZmHF+aTmvZyZpqS53svEXG9ErfQo1Wxhia106q44AVhqdcLFEZ9s9hgU2x4xbeEdhYyCzN1LDWLpS6xOV5jT48aBTKNLWGFrn5D71cVbuVeNsxGJW1gwo2v0RdijAjXEKEm1sQYNqMa2UWFXd1O2/0M1R5hFT4R8J6h20VUsBbH/sO37Hto6/W18SxK9eFs1lv/JvcSe+gaTXPa7FjkwJZRT+Nt7fhmncCIjYnDu9DauIFQJlplSkBsPSCKzkEBUlH71yXbIEyfuU0h0erEx1CJLO8B56+jEXkkFDs9N1F50jqBrYMWOfSVAYVBdbJIbI3MtU8o3IlzrA/QgSyZ+83ZmcycFHPi1BgLWIYVUVgTaMliizyUdfE4/H+T8lJFEkHwvvGT9p8D5f+bxt/2zh9D/jhw6W71bfeE8/yhrH4o2peibcFuC35i6urH73+sla2qbNcSe0ni/pa3vST6SbbvurC/P/Lv6if4+EUCZdvfn8WfH+fwI/5Q1E8F/Pohk+o8ytNj2X/fAvCpfGqfa2X1z78u5LbUcgQAAA==" - ) - ) + print(Settings()) diff --git a/requirements.txt b/requirements.txt index 45e5bd1..ab911e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ requests~=2.31.0 -pydantic~=2.5.3 \ No newline at end of file +redis~=5.0.8 +pydantic~=2.8.2 +pydantic-settings~=2.4.0 diff --git a/src/config/settings.py b/src/config/settings.py new file mode 100644 index 0000000..a93d88e --- /dev/null +++ b/src/config/settings.py @@ -0,0 +1,59 @@ +from typing import Tuple, Type + +from pydantic import BaseModel, Field, RedisDsn, AliasChoices, PostgresDsn + +from pydantic_settings import ( + BaseSettings, + PydanticBaseSettingsSource, + SettingsConfigDict, + YamlConfigSettingsSource, +) + + +class DataBaseSettings(BaseSettings): + host: str = Field(default="localhost", description="Host") + port: int = Field(default=5432, description="Port") + user: str = Field(default="postgres", description="User") + password: str = Field(default="", description="Password") + database: str = Field(default="postgres", description="Database") + + +class ServerLoggerSettings(BaseSettings): + path: str = Field(default="./data/logs/", description="Path") + level: str = Field(default="INFO", description="Level") + + +class ServerSettings(BaseSettings): + host: str = Field(default="localhost", description="Host") + port: int = Field(default=8000, description="Port") + logger: ServerLoggerSettings = Field(default_factory=ServerLoggerSettings) + debug: bool = Field(default=False, description="Debug") + + +class RedisSettings(BaseSettings): + host: str = Field(default="localhost", description="Host") + port: int = Field(default=6379, description="Port") + db: int = Field(default=0, description="DB") + password: str = Field(default="", description="Password") + encoding: str = Field(default="utf-8", description="Encoding") + + +class Settings(BaseSettings): + server: ServerSettings = Field(default_factory=ServerSettings) + redis: RedisSettings = Field(default_factory=RedisSettings) + database: DataBaseSettings = Field(default_factory=DataBaseSettings) + model_config = SettingsConfigDict(yaml_file='config.yml', extra='ignore') + + @classmethod + def settings_customise_sources( + cls, + settings_cls: Type[BaseSettings], + init_settings: PydanticBaseSettingsSource, + env_settings: PydanticBaseSettingsSource, + dotenv_settings: PydanticBaseSettingsSource, + file_secret_settings: PydanticBaseSettingsSource, + ) -> Tuple[PydanticBaseSettingsSource, ...]: + return (YamlConfigSettingsSource(settings_cls),) + + +setting = Settings() diff --git a/src/database/__init__.py b/src/database/__init__.py new file mode 100644 index 0000000..dc1a582 --- /dev/null +++ b/src/database/__init__.py @@ -0,0 +1 @@ +from .redis_db import cache diff --git a/src/database/redis_db.py b/src/database/redis_db.py new file mode 100644 index 0000000..ae2440c --- /dev/null +++ b/src/database/redis_db.py @@ -0,0 +1,35 @@ +from redis import asyncio as redis + + +class AsyncRedisManager: + def __init__(self, url='redis://localhost', minsize=5, maxsize=10): + self.url = url + self.minsize = minsize + self.maxsize = maxsize + self.pool = None + + async def connect(self): + if not self.pool: + self.pool = redis.ConnectionPool.from_url("redis://localhost") + + async def disconnect(self): + if self.pool: + self.pool.close() + await self.pool.wait_closed() + + async def get_connection(self): + if not self.pool: + await self.connect() + return await self.pool.get() + + async def release_connection(self, connection): + self.pool.release(connection) + + async def execute(self, command, *args, **kwargs): + async with self.pool.get() as r: + result = await getattr(r, command)(*args, **kwargs) + return result + + +cache = AsyncRedisManager() +cache.connect() diff --git a/src/initialization/log/log.py b/src/initialization/log/log.py new file mode 100644 index 0000000..d8ba5ac --- /dev/null +++ b/src/initialization/log/log.py @@ -0,0 +1,13 @@ +from loguru import logger + +from src.config.settings import setting + +logger.add( + f"{setting.server.logger.path}/{{time:YYYY-MM-DD}}.log", + rotation="1 days", # 每天生成新文件 + retention="20 days", # 保留最近10天的日志文件 + compression="zip", # 压缩旧日志文件 + encoding="utf-8", # 文件编码 + level=setting.server.logger.level, + enqueue=True, # 异步写入日志 +) diff --git a/src/service/service.py b/src/service/service.py index b09abb3..3ce6401 100644 --- a/src/service/service.py +++ b/src/service/service.py @@ -6,17 +6,15 @@ from src.integrations.june.models import AppleAccountModel, ItunesLoginModel class ItunesService: - def login(self): - start_time = time.time() - account = AppleAccountModel( - account="isaacf9zpierce@hotmail.com", - password="Eq991155", - ) + def login(self, account: AppleAccountModel): + """ + 登录itunes + + :param account: + :return: + """ june_client_service = SixClient() apple_client = AppleClient() - # june_client_service.login() - # june_client_service.login_remote_apple_account(account) - # print(june_client_service.check_is_login()) sign_sap_from_june = june_client_service.get_sign_sap_setup() sign_sap_setup_buffer = apple_client.query_sign_sap_setup( sign_sap_from_june.Data @@ -24,10 +22,18 @@ class ItunesService: sign_sap_cert = june_client_service.get_sign_sap_setup_cert( account, sign_sap_from_june, sign_sap_setup_buffer ) - print(time.time()-start_time) login_schema = apple_client.login(sign_sap_cert.Data) - middle_time = time.time() - print(middle_time - start_time) + + + + def redeem(self, code: str): + """ + 兑换代码 + + :param code: + :return: + """ + apple_client = AppleClient() apple_client.redeem( "X3JC8LGLMGX9Z47T", ItunesLoginModel( @@ -37,4 +43,3 @@ class ItunesService: passwordToken=login_schema.response.password_token, ), ) - print(time.time() - start_time)