refactor: restructure project to modern Python layout, separate src, tests, docs, examples

This commit is contained in:
2025-08-07 16:57:41 +08:00
commit 4cb6c4eab7
27 changed files with 2580 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
"""
工具模块
包含加密解密、模拟环境等工具功能。
"""
from .crypto import encrypt, decrypt
from .mock_rclone import MockRclone, patch_rclone
__all__ = ["encrypt", "decrypt", "MockRclone", "patch_rclone"]

View File

@@ -0,0 +1,23 @@
import json
import os
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad,unpad
import base64
def encrypt(text):
key = 'tbambooz'.encode('ascii')
des = DES.new(key, DES.MODE_CBC, IV=key)
padded_text = pad(text.encode('utf-8'), DES.block_size)
encrypted_text = des.encrypt(padded_text)
return base64.b64encode(encrypted_text).decode('utf-8')
def decrypt(encrypted_text):
key = 'tbambooz'
key = key.encode('ascii')
des = DES.new(key, DES.MODE_CBC, IV=key)
decoded_text = base64.b64decode(encrypted_text)
decrypted_text = des.decrypt(decoded_text)
unpadded_text = unpad(decrypted_text, DES.block_size)
return unpadded_text.decode('utf-8')

View File

@@ -0,0 +1,153 @@
import os
import json
import subprocess
from .crypto import encrypt, decrypt
class MockRclone:
"""模拟rclone环境用于测试"""
def __init__(self, test_data_path: str = "test_data"):
self.test_data_path = test_data_path
self._setup_mock_environment()
def _setup_mock_environment(self):
"""设置模拟环境"""
# 确保测试数据目录存在
os.makedirs(self.test_data_path, exist_ok=True)
# 创建测试配置文件
self._create_test_configs()
def _create_test_configs(self):
"""创建测试配置文件"""
test_configs = {
"0.29": {
"android": {
"EventApiURL": "https://n3backend.azurewebsites.net/",
"Ver": "0.29.1abc123",
"PlayFabTitle": "B066F",
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
"HeartBeat": "60",
"RTMPid": "80000586",
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w=="
},
"ios": {
"EventApiURL": "https://n3backend.azurewebsites.net/",
"Ver": "0.29.1def456",
"PlayFabTitle": "B066F",
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
"HeartBeat": "60",
"RTMPid": "80000586",
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w=="
}
},
"0.30": {
"android": {
"EventApiURL": "https://n3backend.azurewebsites.net/",
"Ver": "0.30.2ghi789",
"PlayFabTitle": "B066F",
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
"HeartBeat": "60",
"RTMPid": "80000586",
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w==",
"NewFeature": "enabled"
},
"ios": {
"EventApiURL": "https://n3backend.azurewebsites.net/",
"Ver": "0.30.2jkl012",
"PlayFabTitle": "B066F",
"Google_Play_URL": "https://play.google.com/store/apps/details?id=com.arkgame.ft",
"APP_Store_URL": "https://apps.apple.com/us/app/id6505145935",
"HeartBeat": "60",
"RTMPid": "80000586",
"RTMServerEndpoint": "rtm-intl-frontgate.ilivedata.com:13321",
"RTMHmacSecret": "57047697437f4f2c97a835e8d9a53358",
"FuncUrl": "https://leaderboardcreate.azurewebsites.net",
"FuncKey": "R5kU45fNBRd52Eqp3tEqfpZqrbFw53uSSEo7wraUSqIfAzFuRmLm_w==",
"NewFeature": "enabled"
}
}
}
# 创建测试目录结构
for version, platforms in test_configs.items():
version_path = f"{self.test_data_path}/ab/{version.replace('.', '_')}"
os.makedirs(version_path, exist_ok=True)
for platform, config in platforms.items():
filename = f"{platform}config.json"
filepath = os.path.join(version_path, filename)
# 加密配置并保存
config_json = json.dumps(config, indent=2, ensure_ascii=False)
encrypted_config = encrypt(config_json)
with open(filepath, 'w', encoding='utf-8') as f:
f.write(encrypted_config)
print(f"创建测试文件: {filepath}")
def mock_rclone_cat(self, path: str) -> str:
"""模拟rclone cat命令"""
# 将路径转换为本地文件路径
local_path = os.path.join(self.test_data_path, path)
if not os.path.exists(local_path):
raise FileNotFoundError(f"文件不存在: {path}")
with open(local_path, 'r', encoding='utf-8') as f:
return f.read().strip()
def patch_rclone():
"""修补rclone调用使用模拟环境"""
import subprocess
original_run = subprocess.run
def mock_run(cmd, *args, **kwargs):
if len(cmd) >= 2 and cmd[0] == 'rclone' and cmd[1] == 'cat':
# 模拟rclone cat命令
mock_rclone = MockRclone()
try:
content = mock_rclone.mock_rclone_cat(cmd[2])
# 返回模拟的subprocess结果
from types import SimpleNamespace
result = SimpleNamespace()
result.returncode = 0
result.stdout = content
result.stderr = ""
return result
except FileNotFoundError as e:
# 返回错误结果
from types import SimpleNamespace
result = SimpleNamespace()
result.returncode = 1
result.stdout = ""
result.stderr = str(e)
return result
else:
# 对于其他命令,使用原始实现
return original_run(cmd, *args, **kwargs)
subprocess.run = mock_run
print("已启用rclone模拟环境")
if __name__ == "__main__":
# 创建测试环境
mock = MockRclone()
print("模拟rclone环境设置完成")