""" GFIL BLOG 统一配置加载器 用法: from config import TELEGRAPH_TOKEN, BLOG_URL, ... 所有密钥从 .env 加载,修改密钥只需改 .env 一个文件 """ import os import sys BASE_DIR = os.path.dirname(os.path.abspath(__file__)) ENV_FILE = os.path.join(BASE_DIR, ".env") def _load_env(): """手动解析 .env,零依赖""" env = {} if os.path.exists(ENV_FILE): with open(ENV_FILE, "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line or line.startswith("#") or "=" not in line: continue key, _, val = line.partition("=") env[key.strip()] = val.strip().strip('"').strip("'") return env _env = _load_env() def _get(key, default=""): """优先环境变量,其次 .env 文件""" return os.environ.get(key) or _env.get(key, default) # --- 服务器 --- SSH_HOST = _get("SSH_HOST", "") SSH_USER = _get("SSH_USER", "root") SSH_PASS = _get("SSH_PASS") SSH_PORT = int(_get("SSH_PORT", "22")) # --- API Keys --- TELEGRAPH_TOKEN = _get("TELEGRAPH_TOKEN") GITHUB_TOKEN = _get("GITHUB_TOKEN") GITHUB_TOKEN_ALT = _get("GITHUB_TOKEN_ALT") TG_BOT_TOKEN = _get("TG_BOT_TOKEN") DISCORD_WEBHOOK = _get("DISCORD_WEBHOOK") DEEPSEEK_KEY = _get("DEEPSEEK_KEY") DEVTO_KEY = _get("DEVTO_KEY") INDEXNOW_KEY = _get("INDEXNOW_KEY") SCREENSHOTONE_KEY = _get("SCREENSHOTONE_KEY") SHOTSTACK_KEY = _get("SHOTSTACK_KEY") BUFFER_TOKEN = _get("BUFFER_TOKEN") # --- Google --- GOOGLE_EMAIL = _get("GOOGLE_EMAIL") GOOGLE_PASS = _get("GOOGLE_PASS") SMTP_PASS = _get("SMTP_PASS") GA_ID = _get("GA_ID") GOOGLE_VERIFY = _get("GOOGLE_VERIFY") # --- URLs --- BLOG_URL = _get("BLOG_URL", "https://blog.quant-view.xyz") TERMINAL_URL = _get("TERMINAL_URL", "https://gfil-intel.xyz") LANDING_URL = _get("LANDING_URL", "https://gold-node.xyz") TG_CHANNEL = _get("TG_CHANNEL", "https://t.me/GFIL_Trading") DISCORD_INVITE = _get("DISCORD_INVITE", "https://discord.gg/GMmMCD4MCr") TOOLS_URL = f"{BLOG_URL}/tools/" # --- 本地代理 --- HTTP_PROXY = _get("HTTP_PROXY") # --- 邮箱 --- MAILERLITE_GROUP_ID = "189341033455158511" # --- 密钥状态检查 --- def check_config(): """打印配置状态,快速发现过期密钥""" keys = { "Telegraph": TELEGRAPH_TOKEN, "GitHub": GITHUB_TOKEN, "TG Bot": TG_BOT_TOKEN, "Discord": DISCORD_WEBHOOK, "DeepSeek": DEEPSEEK_KEY, } print("=== 配置状态检查 ===") for name, val in keys.items(): if not val: print(f" {name}: MISSING!") elif "expired" in val.lower() or "invalid" in val.lower(): print(f" {name}: EXPIRED/INVALID") else: masked = val[:15] + "..." if len(val) > 15 else val print(f" {name}: {masked}") if __name__ == "__main__": check_config()