"""项目根配置:只放核心程序级配置。 任务自身的参数(观看时长、点赞开关、滑动速度等)不在这里, 放各自 tasks/xxx.py 顶部,保持每个任务自包含、互不干扰。 改 STF 地址/token、adb 路径、web 端口都改这里。 安全:STF_TOKEN / WEB_SECRET_KEY 建议用环境变量注入(生产不要提交到 git)。 支持 `.env` 文件(项目根目录),也可直接 `export STF_TOKEN=xxx`。 """ import os # 可选加载 .env 文件(不存在则忽略) _env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env") if os.path.exists(_env_path): try: with open(_env_path, encoding="utf-8") as _f: for _line in _f: _line = _line.strip() if _line and not _line.startswith("#") and "=" in _line: _k, _v = _line.split("=", 1) os.environ.setdefault(_k.strip(), _v.strip()) except OSError: pass def _env(key, default): """读环境变量,未设置则返回默认值。""" return os.environ.get(key, default) # ================== STF 配置 ================== STF_URL = _env("STF_URL", "http://192.168.20.220:7100") STF_TOKEN = _env("STF_TOKEN", "") # 写入 .env,不要提交到 git # ================== adb 路径 ================== # adb 二进制及依赖统一放在 bin/adb/ 下 # Windows: adb.exe(依赖同目录的 dll) # Linux: adb(需 chmod +x,Linux 版二进制) # 代码自动识别操作系统,用户只需把对应平台的 adb 放进 bin/adb/ import sys as _sys _ADB_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "bin", "adb") if _sys.platform == "win32": ADB_PATH = os.path.join(_ADB_DIR, "adb.exe") else: # Linux / macOS:用 bin/adb/adb(无 .exe 后缀) # 部署后需执行 chmod +x bin/adb/adb ADB_PATH = os.path.join(_ADB_DIR, "adb") # ================== Web 后台 ================== WEB_HOST = "0.0.0.0" # 端口必须避开 Windows 动态端口范围(本机被改成 1024-15000,默认 49152-65535) # 用 18050 处于动态范围之外,不会被出站连接随机占用,避免 WinError 10013 WEB_PORT = 18050 # ================== 数据目录 ================== # 持久化数据(分组、任务计划)存放目录 DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") # APK 文件存储目录(应用管理功能) APK_DIR = os.path.join(DATA_DIR, "apks") # ================== 悬空设备自愈 ================== # 启动时是否自动释放"仍被本账户占用"的设备(上次崩溃/强杀残留)。 # 仅单实例部署时设为 True:多实例共用同一 STF 账户时不要开,会误释放另一实例的运行中任务。 AUTO_RELEASE_STALE_OCCUPY = _env("AUTO_RELEASE_STALE_OCCUPY", "false").lower() in ("1", "true", "yes") # ================== 维护(STF 容器一键重启) ================== # 维护页"一键重启 STF 容器"通过 SSH 到部署机执行 docker restart。 # 前置条件:本机可免密 SSH 到目标机(stf@220 需已授权本机公钥)。 STF_SSH_TARGET = _env("STF_SSH_TARGET", "stf@192.168.20.220") STF_DOCKER_CONTAINER = _env("STF_DOCKER_CONTAINER", "stf") # ================== 维护(Tailscale 管理) ================== # 维护页"Tailscale 管理"调用官方 API v2 管理 tailnet 设备。 # TAILSCALE_API_KEY:Tailscale 后台 → Settings → API Access Tokens 生成(或 OAuth client_id:secret) # TAILSCALE_TAILNET:tailnet 名称/ID,个人账号一般是登录邮箱前缀 # 安全:密钥用环境变量/.env 注入,不要写死在代码或提交到 git。 TAILSCALE_API_KEY = _env("TAILSCALE_API_KEY", "") # 写入 .env,不要提交到 git TAILSCALE_TAILNET = _env("TAILSCALE_TAILNET", "skn1422726308@gmail.com")