一、平台侧(账号 → 发布计划页) - 新表 video_plan(schema v9→v10):账号×发布日期×编号 → 素材 + 标题 + 发布状态 + 分享链接; 状态机 pending/ready/pushing/publishing/done/failed/unknown/skipped(**failed 与 unknown 必须分开**: 推送阶段的失败可安全重试;碰过抖音之后的岔子只能算"结果未知",绝不自动重发) - 素材上传:文件名 `手机号_日期_编号`(编号可省)解析配对;标题 txt `标题内容_手机号_日期_编号`; 内容寻址落盘 data/videos/YYYY-MM/(sha1 分块算,同名不存两份),**不进整库备份**但进 manifest 反查 - 新蓝图 web/video_plan_api.py:上传/时间线/统计/单条增删改/推送到手机/标记结果/裁决/链接导出 CSV/ 任务列表与一键新建、**就地编辑**(GET/PUT /tasks/<id>)、**一键推送**(POST /push_all,按设备分组、设备内串行) - 账号页拆子分栏(台账 / 发布计划)+ static/admin/release.js;清理 job(04:41 僵尸回收+过期行、04:47 素材文件) - 上传体积:MAX_CONTENT_LENGTH(默认 2GiB)+ 413 JSON + nginx client_max_body_size(修现有 APK 上传隐患) 二、任务侧(平台推素材,抖音流程你自己写) - 新步骤 push_release「推送发布视频」:原子占位 → adb push → **touch 改成"现在"** → 清旧目录同名副本 → 触发扫描并**按路径**校验相册索引 → 标题写进剪贴板;默认目录 /sdcard/DCIM/Camera - 新步骤 mark_release「标记发布结果」:回写 done/failed/unknown,成功时抓作品分享链接、删手机素材 - input_text 支持 text_source=release_title(自动取计划标题 + 回读校验); if_el 的候选值来源新增 release(**本机当前发布计划**的抖音号/昵称,发布前校验"登的是不是要发的号") - build_release_steps 骨架 15 步:⓪ 亮屏 → ① 打开抖音(等首页) → ② 点「我」→ ③ 等抖音号出现 → ④ 条件判断(账号) → then ⑤ 推送 ⑥⑦⑧⑨⑩⑪⑫ 抖音点击/填标题 → ⑬ 标记 / else 发通知跳过 三、修(推送这一路的检测机制) - **uiautomator2 3.x 的 d.shell() 返回 ShellResponse(tuple 子类)不是 str**:`'x' in resp` 恒 False、 `.strip()` 不存在 → "推上去的文件大小不对"每次都判失败(文件其实推上去了)、相册校验永远报没进、 删除确认永远判没删掉。新增 publish_flow._sh() 统一取 .output;大小改成解析 ls -l 的大小列 - **adb push 保留本地 mtime** → 推 3 天前上传的素材在按时间排序的相册里排不到最前, "点第一个 = 刚推的那个"不成立 → 推完 touch - 相册校验**按路径**比(MediaStore 的 _data 会把目录小写、/storage/emulated/0 ≡ /sdcard), 只比文件名会被老目录的同名残留骗过去 - 屏幕没亮就启动抖音会永远停在启动页(UI 树为空)→ 后面"点我/等抖音号"必然 miss, 最后报成误导人的"账号不符" → 骨架第一步固定加「亮屏」,open_app 等「首页」出现 四、其它 - core/ledger.serial_of():设备名 → 当前地址(设备换 IP 后快照是错的) - 通知事件 task.video.published / task.video.failed;备份清单加 video_plan 与素材统计 - 文档同步:DATA_MODEL §2.11 + schema v10、API(新接口与语义)、TASK_DEV §4.7 专章、 ARCHITECTURE(账号页子分栏/release.js/两个 job)、DEPLOY(表数/nginx)、NOTIFY、DEVELOPMENT、README
127 lines
6.2 KiB
Bash
127 lines
6.2 KiB
Bash
# ==============================================================================
|
||
# auto_control 环境变量示例
|
||
# - 复制为项目根目录的 .env 再按需修改(.env 已被 .gitignore 排除,不会进 git)
|
||
# - 加载方式:config.py 逐行解析后用 os.environ.setdefault 注入
|
||
# → 因此"真实环境变量"优先于 .env(容器/CI 里用 env 覆盖更方便)
|
||
# - 标【必须】的项务必设置;其余留空即用代码默认值
|
||
# - 完整说明见 doc/DEVELOPMENT.md §4 配置速查、doc/DEPLOY.md §2.2
|
||
# ==============================================================================
|
||
|
||
# ==================== 数据库 ====================
|
||
# 平台用 MySQL(正式用法)。DEPLOY_ENV 声明"这份配置连的是哪个环境的库",
|
||
# 并与库名一一绑定,启动时会互相校验,不符直接拒绝启动:
|
||
# DEPLOY_ENV=dev → 期望库名 auto_control_dev(本地开发,可随意折腾)
|
||
# DEPLOY_ENV=prod → 期望库名 auto_control (正式数据)
|
||
# 首次连接的库会被打上环境标签(app_meta.deployment_env);标签与 DEPLOY_ENV
|
||
# 不符时拒绝启动——这是防止「开发配置连到生产库」的最后一道闸。
|
||
DEPLOY_ENV=dev
|
||
DB_HOST=
|
||
DB_PORT=3306
|
||
DB_USER=
|
||
DB_PASSWORD=
|
||
DB_NAME=auto_control_dev
|
||
# 排序规则用 _bin(逐码点比较,等价 SQLite 的大小写敏感语义),别改成 _general_ci
|
||
DB_CHARSET=utf8mb4
|
||
DB_COLLATION=utf8mb4_bin
|
||
|
||
# 完整连接串:优先级最高,用于脚本临时指向别的库(一般不用配)
|
||
# DATABASE_URL=mysql+pymysql://user:pass@host:3306/auto_control_dev?charset=utf8mb4
|
||
|
||
# 逃生阀(默认关,仅在明确知道后果时打开)
|
||
# DB_ALLOW_ENV_MISMATCH=1 环境与库名/库标签不符时仍启动(危险)
|
||
# DB_ALLOW_SQLITE_FALLBACK=1 生产环境 DB_HOST 为空时允许回退 SQLite(回滚用)
|
||
# DB_ALLOW_ENV_MISMATCH=0
|
||
# DB_ALLOW_SQLITE_FALLBACK=0
|
||
|
||
|
||
# ==================== Web 服务 ====================
|
||
# 会话密钥【必须,生产务必固定】:不配则每次启动随机生成,重启后登录态失效。
|
||
# 生成:python -c "import secrets; print(secrets.token_hex(32))"
|
||
WEB_SECRET_KEY=请填写随机密钥
|
||
|
||
# 监听地址与端口是 config.py 里的常量(不进 .env):WEB_HOST=0.0.0.0、WEB_PORT=18050
|
||
# 需要修改直接改 config.py(18050 是为了避开 Windows 动态端口段)
|
||
|
||
|
||
# ==================== 设备与 adb ====================
|
||
# USB 设备(serial 无冒号)所在的部署机 —— 平台经它的 adb server 驱动这些设备。
|
||
# 默认 100.100.10.1:5037(220 的 Tailscale IP + adb 容器端口,host 网络模式)。
|
||
# USB_ADB_HOST=100.100.10.1
|
||
# USB_ADB_PORT=5037
|
||
|
||
# 设备自动发现(扫描网段找开放 5555 的设备)。
|
||
# 扫描网段在「工具 → 设备池管理」界面里配置(存数据库 app_meta),此处只管端口与周期。
|
||
# DISCOVERY_PORT=5555
|
||
# DISCOVERY_INTERVAL=60
|
||
|
||
# 把本机的 adb 客户端指向远程 adb server(注意:这三个键由 adb/adbutils 自己读取,
|
||
# 不是本项目代码读的;两个变量名都要设,adb 实际认 ADDRESS,部分库读 HOST)。
|
||
# 用途:让本机 adb 直接看到 220 侧插着的 USB 设备。
|
||
# ANDROID_ADB_SERVER_ADDRESS=192.168.20.220
|
||
# ANDROID_ADB_SERVER_HOST=192.168.20.220
|
||
# ANDROID_ADB_SERVER_PORT=5037
|
||
|
||
|
||
# ==================== Tailscale 管理(工具 → Tailscale 管理) ====================
|
||
# API key:Tailscale 后台 → Settings → API Access Tokens 生成
|
||
TAILSCALE_API_KEY=请填写Tailscale_API_key
|
||
|
||
# tailnet 名/ID(一般填登录邮箱,如 [email protected])
|
||
# [email protected]
|
||
|
||
|
||
# ==================== MCP Server(外部 AI 接入,:8033) ====================
|
||
# 注意:mcp_server 只读进程环境变量,**不读本文件**!
|
||
# 容器场景由 scripts/start.sh 用下面这些变量拉起进程;
|
||
# 本机手动启动请直接在命令行前加环境变量(见 doc/MCP.md §2)。
|
||
#
|
||
# MCP_ENABLED=1 # 仅 start.sh 消费:=0 则不自动拉起 MCP
|
||
# MCP_ALLOW_WRITE=1 # 写操作总开关(0=只读;start.sh 内强制为 1)
|
||
# MCP_PLATFORM_URL=http://127.0.0.1:18050
|
||
# MCP_PLATFORM_USER=admin
|
||
# MCP_PLATFORM_PASS=请填写平台admin密码 # 【改过 admin 密码必须同步,否则 MCP 登录失败】
|
||
# MCP_ALLOWED_SERIALS= # 设备白名单(逗号分隔);空=不限制(语义缺口见 backlog)
|
||
# MCP_HTTP_HOST=0.0.0.0
|
||
# MCP_HTTP_PORT=8033
|
||
# MCP_SCREENSHOT_WIDTH=540 # 返回给模型的截图宽度
|
||
# MCP_JPEG_QUALITY=70
|
||
# MCP_AUDIT_FILE=/tmp/mcp_audit.log
|
||
# MCP_PLATFORM_TIMEOUT=30
|
||
|
||
|
||
# ==================== AI Agent(mcp_agent,命令行/独立运行时用) ====================
|
||
# 注意:同样只读进程环境变量、不读本文件。
|
||
# Web 的「AI 控制台」配置走数据库(app_meta 的 agent_* 键),与本组变量互不影响。
|
||
#
|
||
# AGENT_API_BASE=https://api.deepseek.com
|
||
# AGENT_MODEL=deepseek-v4-flash-vision-exp
|
||
# AGENT_API_KEY=请填写模型 API Key
|
||
# DEEPSEEK_API_KEY= # AGENT_API_KEY 的兼容别名
|
||
# AGENT_MCP_URL=http://127.0.0.1:8033/mcp
|
||
# AGENT_DEFAULT_SERIAL=
|
||
# AGENT_MAX_STEPS=40
|
||
# AGENT_TIMEOUT=120
|
||
# AGENT_LANG=zh
|
||
|
||
|
||
# ==================== 开发/测试 ====================
|
||
# 设置后不启动 cron 调度器(跑测试脚本时避免真实触发任务、占用设备)
|
||
# DISABLE_SCHEDULER=1
|
||
|
||
# 视频发布计划的素材目录(默认 data/videos)。
|
||
# **自动化测试必须指到临时目录**,否则测试传的视频会落进用户真实数据目录。
|
||
# DATA_VIDEO_DIR=/tmp/videos_test
|
||
|
||
# 单次上传体积上限(MB,默认 2048)。
|
||
# ⚠ 必须大于「应用管理」里最大的 APK(实测有 336MB 的包),否则 APK 上传会被一起卡死。
|
||
# MAX_UPLOAD_MB=2048
|
||
|
||
|
||
# ==============================================================================
|
||
# 已废弃的历史配置(STF 已从代码层摘除,下列键代码不再使用,保留仅为兼容旧 .env)
|
||
# STF_URL / STF_TOKEN / STF_SSH_TARGET / STF_SSH_PASSWORD /
|
||
# STF_DOCKER_CONTAINER / STF_ADB_CONTAINER / STF_SCRIPT_PATH /
|
||
# AUTO_RELEASE_STALE_OCCUPY
|
||
# 迁移背景见 doc/STF_REMOVAL.md
|
||
# ==============================================================================
|