first commit
This commit is contained in:
commit
4890793ce5
1029 files changed
+5992
No files matched your search
@@ -0,0 +1,245 @@
|
||||
import os
|
||||
import json
|
||||
import logging
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Any, Union
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 更新默认设置以包含浏览器配置文件
|
||||
DEFAULT_SETTINGS = {
|
||||
"api_key": "",
|
||||
"message_interval": 5,
|
||||
"auto_start": False,
|
||||
"theme": "system",
|
||||
"color_theme": "blue",
|
||||
"profiles_dir": os.path.join(os.path.expanduser("~"), "DouYinBot_Browser_Cache"),
|
||||
"browser_profiles": [],
|
||||
}
|
||||
|
||||
|
||||
class UserProfile(BaseModel):
|
||||
"""Chrome用户配置文件模型."""
|
||||
|
||||
profile_id: str
|
||||
profile_name: str
|
||||
douyin_account: Optional[str] = None
|
||||
profile_path: Optional[str] = None
|
||||
enabled: bool = True
|
||||
auto_reply_enabled: bool = True
|
||||
|
||||
|
||||
class ReplyTemplate(BaseModel):
|
||||
"""回复模板模型."""
|
||||
|
||||
template_id: str
|
||||
name: str
|
||||
content: str
|
||||
keywords: List[str] = Field(default_factory=list)
|
||||
is_default: bool = False
|
||||
|
||||
|
||||
class Settings(BaseModel):
|
||||
"""应用程序设置模型."""
|
||||
|
||||
chrome_executable_path: Optional[str] = None
|
||||
profiles: List[UserProfile] = Field(default_factory=list)
|
||||
reply_templates: List[ReplyTemplate] = Field(default_factory=list)
|
||||
check_interval_seconds: int = 60
|
||||
headless: bool = False
|
||||
auto_start_on_launch: bool = False
|
||||
|
||||
|
||||
class BrowserProfile(BaseModel):
|
||||
"""浏览器用户配置文件模型."""
|
||||
|
||||
profile_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
profile_name: str
|
||||
profile_dir: str
|
||||
enabled: bool = True
|
||||
douyin_account: Optional[str] = None
|
||||
auto_reply_enabled: bool = True
|
||||
creation_time: str = Field(default_factory=lambda: datetime.now().isoformat())
|
||||
last_used_time: Optional[str] = None
|
||||
|
||||
|
||||
def get_config_dir() -> Path:
|
||||
"""获取配置目录."""
|
||||
config_dir = Path.home() / ".douyin-imbot"
|
||||
config_dir.mkdir(exist_ok=True)
|
||||
return config_dir
|
||||
|
||||
|
||||
def get_config_path() -> Path:
|
||||
"""获取配置文件路径."""
|
||||
return get_config_dir() / "settings.json"
|
||||
|
||||
|
||||
def load_settings() -> Settings:
|
||||
"""加载应用程序设置."""
|
||||
config_path = get_config_path()
|
||||
|
||||
if not config_path.exists():
|
||||
# 创建默认设置
|
||||
settings = Settings()
|
||||
save_settings(settings)
|
||||
return settings
|
||||
|
||||
try:
|
||||
with open(config_path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
return Settings.model_validate(data)
|
||||
except Exception as e:
|
||||
print(f"加载设置时出错: {e}")
|
||||
# 返回默认设置
|
||||
return Settings()
|
||||
|
||||
|
||||
def save_settings(settings: Settings) -> None:
|
||||
"""保存应用程序设置."""
|
||||
config_path = get_config_path()
|
||||
|
||||
try:
|
||||
with open(config_path, "w", encoding="utf-8") as f:
|
||||
json.dump(settings.model_dump(), f, ensure_ascii=False, indent=2)
|
||||
except Exception as e:
|
||||
print(f"保存设置时出错: {e}")
|
||||
|
||||
|
||||
def find_chrome_installations() -> List[str]:
|
||||
"""查找系统中的Chrome安装."""
|
||||
possible_paths = []
|
||||
|
||||
# Windows上的常见Chrome安装路径
|
||||
if os.name == "nt":
|
||||
program_files = os.environ.get("PROGRAMFILES", "C:\\Program Files")
|
||||
program_files_x86 = os.environ.get(
|
||||
"PROGRAMFILES(X86)", "C:\\Program Files (x86)"
|
||||
)
|
||||
|
||||
paths = [
|
||||
Path(program_files) / "Google" / "Chrome" / "Application" / "chrome.exe",
|
||||
Path(program_files_x86)
|
||||
/ "Google"
|
||||
/ "Chrome"
|
||||
/ "Application"
|
||||
/ "chrome.exe",
|
||||
Path(os.environ.get("LOCALAPPDATA", ""))
|
||||
/ "Google"
|
||||
/ "Chrome"
|
||||
/ "Application"
|
||||
/ "chrome.exe",
|
||||
]
|
||||
|
||||
for path in paths:
|
||||
if path.exists():
|
||||
possible_paths.append(str(path))
|
||||
|
||||
# macOS上的Chrome路径
|
||||
elif sys.platform == "darwin":
|
||||
paths = [
|
||||
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
||||
f"/Users/{os.getlogin()}/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
||||
]
|
||||
|
||||
for path in paths:
|
||||
if os.path.exists(path):
|
||||
possible_paths.append(path)
|
||||
|
||||
# Linux上的Chrome路径
|
||||
elif sys.platform.startswith("linux"):
|
||||
paths = ["/usr/bin/google-chrome", "/usr/bin/google-chrome-stable"]
|
||||
|
||||
for path in paths:
|
||||
if os.path.exists(path):
|
||||
possible_paths.append(path)
|
||||
|
||||
return possible_paths
|
||||
|
||||
|
||||
def find_chrome_user_data_dir() -> Optional[str]:
|
||||
"""尝试找到Chrome用户数据目录."""
|
||||
if os.name == "nt": # Windows
|
||||
return os.path.join(
|
||||
os.environ.get("LOCALAPPDATA", ""), "Google", "Chrome", "User Data"
|
||||
)
|
||||
elif sys.platform == "darwin": # macOS
|
||||
return os.path.expanduser("~/Library/Application Support/Google/Chrome")
|
||||
elif sys.platform.startswith("linux"): # Linux
|
||||
return os.path.expanduser("~/.config/google-chrome")
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def load_settings():
|
||||
"""
|
||||
从配置文件加载设置,如果文件不存在则使用默认设置
|
||||
|
||||
Returns:
|
||||
dict: 设置字典
|
||||
"""
|
||||
settings_path = get_settings_path()
|
||||
|
||||
try:
|
||||
if os.path.exists(settings_path):
|
||||
with open(settings_path, "r", encoding="utf-8") as f:
|
||||
settings = json.load(f)
|
||||
logger.info("已从文件加载设置")
|
||||
|
||||
# 确保所有默认设置键都存在
|
||||
for key, value in DEFAULT_SETTINGS.items():
|
||||
if key not in settings:
|
||||
settings[key] = value
|
||||
|
||||
# 确保浏览器配置文件列表存在
|
||||
if "browser_profiles" not in settings:
|
||||
settings["browser_profiles"] = []
|
||||
|
||||
return settings
|
||||
except Exception as e:
|
||||
logger.error(f"加载设置时出错: {str(e)}")
|
||||
|
||||
logger.info("使用默认设置")
|
||||
return DEFAULT_SETTINGS.copy()
|
||||
|
||||
|
||||
def save_settings(settings):
|
||||
"""
|
||||
将设置保存到配置文件
|
||||
|
||||
Args:
|
||||
settings (dict): 要保存的设置字典
|
||||
|
||||
Returns:
|
||||
bool: 保存成功返回True,否则返回False
|
||||
"""
|
||||
settings_path = get_settings_path()
|
||||
|
||||
# 确保目录存在
|
||||
os.makedirs(os.path.dirname(settings_path), exist_ok=True)
|
||||
|
||||
try:
|
||||
with open(settings_path, "w", encoding="utf-8") as f:
|
||||
json.dump(settings, f, ensure_ascii=False, indent=2)
|
||||
logger.info("设置已保存到文件")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"保存设置时出错: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
def get_settings_path():
|
||||
"""
|
||||
获取设置文件的路径
|
||||
|
||||
Returns:
|
||||
str: 设置文件路径
|
||||
"""
|
||||
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||||
return os.path.join(base_dir, "config", "settings.json")
|
||||
Reference in new issue
Block a user