mirror of
https://git.oceanpay.cc/danial/kami_itunes_third_api.git
synced 2025-12-19 00:10:31 +00:00
feat: 添加redis和mysql支持
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1 @@
|
|||||||
.idea
|
/.idea/
|
||||||
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@@ -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
|
|
||||||
14
.idea/inspectionProfiles/Project_Default.xml
generated
14
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,14 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredPackages">
|
|
||||||
<value>
|
|
||||||
<list size="1">
|
|
||||||
<item index="0" class="java.lang.String" itemvalue="opencv-python" />
|
|
||||||
</list>
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
6
.idea/inspectionProfiles/profiles_settings.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
||||||
8
.idea/itunes.iml
generated
8
.idea/itunes.iml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PYTHON_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="jdk" jdkName="itunes" jdkType="Python SDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
7
.idea/misc.xml
generated
7
.idea/misc.xml
generated
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Black">
|
|
||||||
<option name="sdkName" value="itunes" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="itunes" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
|
||||||
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/itunes.iml" filepath="$PROJECT_DIR$/.idea/itunes.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
21
config.yml
Normal file
21
config.yml
Normal file
@@ -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
|
||||||
15
main.py
15
main.py
@@ -1,15 +1,4 @@
|
|||||||
from src.integrations.june.utils import decode_and_decompress
|
from src.config.settings import Settings
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# six_client = SixClient()
|
print(Settings())
|
||||||
# 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=="
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
requests~=2.31.0
|
requests~=2.31.0
|
||||||
pydantic~=2.5.3
|
redis~=5.0.8
|
||||||
|
pydantic~=2.8.2
|
||||||
|
pydantic-settings~=2.4.0
|
||||||
|
|||||||
59
src/config/settings.py
Normal file
59
src/config/settings.py
Normal file
@@ -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()
|
||||||
1
src/database/__init__.py
Normal file
1
src/database/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from .redis_db import cache
|
||||||
35
src/database/redis_db.py
Normal file
35
src/database/redis_db.py
Normal file
@@ -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()
|
||||||
13
src/initialization/log/log.py
Normal file
13
src/initialization/log/log.py
Normal file
@@ -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, # 异步写入日志
|
||||||
|
)
|
||||||
@@ -6,17 +6,15 @@ from src.integrations.june.models import AppleAccountModel, ItunesLoginModel
|
|||||||
|
|
||||||
|
|
||||||
class ItunesService:
|
class ItunesService:
|
||||||
def login(self):
|
def login(self, account: AppleAccountModel):
|
||||||
start_time = time.time()
|
"""
|
||||||
account = AppleAccountModel(
|
登录itunes
|
||||||
account="isaacf9zpierce@hotmail.com",
|
|
||||||
password="Eq991155",
|
:param account:
|
||||||
)
|
:return:
|
||||||
|
"""
|
||||||
june_client_service = SixClient()
|
june_client_service = SixClient()
|
||||||
apple_client = AppleClient()
|
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_from_june = june_client_service.get_sign_sap_setup()
|
||||||
sign_sap_setup_buffer = apple_client.query_sign_sap_setup(
|
sign_sap_setup_buffer = apple_client.query_sign_sap_setup(
|
||||||
sign_sap_from_june.Data
|
sign_sap_from_june.Data
|
||||||
@@ -24,10 +22,18 @@ class ItunesService:
|
|||||||
sign_sap_cert = june_client_service.get_sign_sap_setup_cert(
|
sign_sap_cert = june_client_service.get_sign_sap_setup_cert(
|
||||||
account, sign_sap_from_june, sign_sap_setup_buffer
|
account, sign_sap_from_june, sign_sap_setup_buffer
|
||||||
)
|
)
|
||||||
print(time.time()-start_time)
|
|
||||||
login_schema = apple_client.login(sign_sap_cert.Data)
|
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(
|
apple_client.redeem(
|
||||||
"X3JC8LGLMGX9Z47T",
|
"X3JC8LGLMGX9Z47T",
|
||||||
ItunesLoginModel(
|
ItunesLoginModel(
|
||||||
@@ -37,4 +43,3 @@ class ItunesService:
|
|||||||
passwordToken=login_schema.response.password_token,
|
passwordToken=login_schema.response.password_token,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
print(time.time() - start_time)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user