120 lines
3.8 KiB
Python
120 lines
3.8 KiB
Python
"""
|
|
Tavily 注册器配置
|
|
优先读取环境变量;若项目根目录存在 .env,则先载入。
|
|
"""
|
|
import os
|
|
from pathlib import Path
|
|
|
|
PLACEHOLDER_ENV_VALUES = {
|
|
"EMAIL_API_URL": {"https://your-mail-api.example.com"},
|
|
"EMAIL_API_TOKEN": {"replace-with-your-token"},
|
|
"EMAIL_DOMAIN": {"example.com"},
|
|
"EMAIL_DOMAINS": {"example.com", "example.org"},
|
|
"DUCKMAIL_DOMAIN": {"example.com"},
|
|
"DUCKMAIL_DOMAINS": {"example.com", "example.org"},
|
|
"SERVER_URL": {"https://your-server.example.com"},
|
|
"SERVER_ADMIN_PASSWORD": {"replace-with-your-admin-password"},
|
|
}
|
|
|
|
|
|
def _load_dotenv():
|
|
env_path = Path(__file__).resolve().with_name(".env")
|
|
if not env_path.exists():
|
|
return
|
|
|
|
for raw_line in env_path.read_text(encoding="utf-8").splitlines():
|
|
line = raw_line.strip()
|
|
if not line or line.startswith("#") or "=" not in line:
|
|
continue
|
|
|
|
key, value = line.split("=", 1)
|
|
key = key.strip()
|
|
value = value.strip()
|
|
if value[:1] == value[-1:] and value[:1] in {"'", '"'}:
|
|
value = value[1:-1]
|
|
os.environ.setdefault(key, value)
|
|
|
|
|
|
def _get_str(name, default=""):
|
|
return os.getenv(name, default).strip()
|
|
|
|
|
|
def _get_int(name, default):
|
|
value = os.getenv(name)
|
|
if value is None or value.strip() == "":
|
|
return default
|
|
return int(value)
|
|
|
|
def _get_list(name, fallback=""):
|
|
value = os.getenv(name)
|
|
if value is None or value.strip() == "":
|
|
value = fallback
|
|
return [item.strip() for item in value.split(",") if item.strip()]
|
|
|
|
|
|
def _get_bool(name, default=False):
|
|
value = os.getenv(name)
|
|
if value is None:
|
|
return default
|
|
return value.strip().lower() in {"1", "true", "yes", "on"}
|
|
|
|
|
|
def is_placeholder_env_value(name, value):
|
|
normalized = (value or "").strip()
|
|
if not normalized:
|
|
return False
|
|
|
|
normalized_lower = normalized.lower()
|
|
placeholder_values = {item.lower() for item in PLACEHOLDER_ENV_VALUES.get(name, set())}
|
|
if normalized_lower in placeholder_values:
|
|
return True
|
|
|
|
if normalized_lower.startswith("replace-with-"):
|
|
return True
|
|
|
|
if normalized_lower in {"example.com", "example.org"}:
|
|
return True
|
|
|
|
if normalized_lower.startswith("https://your-") and ".example.com" in normalized_lower:
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
_load_dotenv()
|
|
|
|
# 邮箱配置
|
|
EMAIL_PROVIDER = _get_str("EMAIL_PROVIDER", "cloudflare").lower()
|
|
SUPPORTED_EMAIL_PROVIDERS = ("cloudflare", "duckmail")
|
|
EMAIL_API_URL = _get_str("EMAIL_API_URL")
|
|
EMAIL_API_TOKEN = _get_str("EMAIL_API_TOKEN")
|
|
EMAIL_DOMAIN = _get_str("EMAIL_DOMAIN")
|
|
EMAIL_DOMAINS = _get_list("EMAIL_DOMAINS", EMAIL_DOMAIN)
|
|
DUCKMAIL_API_URL = _get_str("DUCKMAIL_API_URL", "https://api.duckmail.sbs")
|
|
DUCKMAIL_API_KEY = _get_str("DUCKMAIL_API_KEY")
|
|
DUCKMAIL_DOMAIN = _get_str("DUCKMAIL_DOMAIN")
|
|
DUCKMAIL_DOMAINS = _get_list("DUCKMAIL_DOMAINS", DUCKMAIL_DOMAIN)
|
|
|
|
# 上传目标
|
|
SERVER_URL = _get_str("SERVER_URL")
|
|
SERVER_ADMIN_PASSWORD = _get_str("SERVER_ADMIN_PASSWORD")
|
|
|
|
# 注册默认参数
|
|
DEFAULT_COUNT = _get_int("DEFAULT_COUNT", 5)
|
|
DEFAULT_CONCURRENCY = _get_int("DEFAULT_CONCURRENCY", 2)
|
|
DEFAULT_DELAY = _get_int("DEFAULT_DELAY", 10)
|
|
DEFAULT_UPLOAD = _get_bool("DEFAULT_UPLOAD", True)
|
|
|
|
# 浏览器模式
|
|
REGISTER_HEADLESS = _get_bool("REGISTER_HEADLESS", True)
|
|
# Firecrawl 未单独配置时,默认继承 REGISTER_HEADLESS,避免意外跑到前台。
|
|
FIRECRAWL_REGISTER_HEADLESS = _get_bool("FIRECRAWL_REGISTER_HEADLESS", REGISTER_HEADLESS)
|
|
EMAIL_CODE_TIMEOUT = _get_int("EMAIL_CODE_TIMEOUT", 90)
|
|
API_KEY_TIMEOUT = _get_int("API_KEY_TIMEOUT", 20)
|
|
EMAIL_POLL_INTERVAL = _get_int("EMAIL_POLL_INTERVAL", 3)
|
|
|
|
# Solver 配置
|
|
SOLVER_PORT = _get_str("SOLVER_PORT", "5073")
|
|
LOCAL_SOLVER_URL = _get_str("LOCAL_SOLVER_URL", f"http://127.0.0.1:{SOLVER_PORT}")
|
|
SOLVER_THREADS = _get_int("SOLVER_THREADS", 1)
|