设备状态监控
实时展示所有设备状态、当前执行任务及进度
设备列表
| 设备 | 型号 | 电量 | 任务状态 | 前台App | 进度 | 当前任务 | 当前动作 | 最近错误 | 操作 |
|---|
异常汇总
任务运行概况
账号
每台设备上登录的抖音账号(谁在哪台机器上、卡在不在机内、能不能发视频)
| 设备号 | 账号名称 | 抖音号 | 手机号 | 注册时间 | 卡在机内 | 可发视频 | 简介 | 备注 | 操作 |
|---|
这张台账有三个用处:① 人在机器旁时对照(手机端 Agent 的「身份大字页」也会显示本机账号);
② 任务的「条件判断」可以直接从这里取号(编辑器里把候选值来源选成「本机台账」,
就不用把几十个号手写进去);③ 设备池里能看到每台登记了几个号。
⚠ 台账里的抖音号是纯号(如
⚠ 台账里的抖音号是纯号(如
35377983067),只当"比对用的候选值"。
不要拿它去填「去重」的身份元素 —— 身份比对的是元素原文
(抖音号:35377983067),格式不同会让去重静默失效。
发布任务
到点自动跑:推送素材 → 你的抖音步骤 → 标记结果(抖音那几步的选择器要你自己抓一次)
明细表(与时间线同一份数据)
| 发布日期 | 设备号 | 账号 | 编号 | 视频文件 | 标题 | 状态 | 分享链接 | 操作 |
|---|
视频文件名规则
上传后自动按 (手机号, 日期, 编号) 配对:有编号按编号精确对,没编号按顺序配 —— 没传标题的视频不会被推送(先在计划页改标题或补传标题)。
平台只负责把视频推到手机(推到
计划页的「推送到手机」是同一件事的人工入口(推完你在手机上发,发完点「标记已发布」)。
⚠ 发布结果以每行的状态为准:失败(可重试)说明推送都没成功、可以再推; 结果未知(需确认)说明推送之后那一段出了岔子、可能已经发出去了, 要先到抖音里看一眼,再用「已发出 / 未发出」裁决(平台不会自动重发)。
手机号_日期_编号(编号可省略,日期如 20260912 就是发布日期);
标题 txt 每行 标题内容_手机号_日期_编号 或 手机号_日期_编号_标题(两种写法都认,编号都可省略,标题里可以有下划线、可以有 #话题;# 开头的行只要认得出手机号/日期就当标题,认不出才当注释忽略)。
手机号必须在「账号台账」里,否则拒收。上传后自动按 (手机号, 日期, 编号) 配对:有编号按编号精确对,没编号按顺序配 —— 没传标题的视频不会被推送(先在计划页改标题或补传标题)。
平台只负责把视频推到手机(推到
/sdcard/DCIM/Camera/、把文件时间改成"现在"好排在相册最前、触发相册刷新并按路径校验进了索引、
把标题写进手机剪贴板);**抖音里怎么发由你在任务里自己写步骤** ——
步骤顺序是:「推送发布视频」→ 你自己的发布步骤(打开抖音→点+→相册→选视频→下一步→粘贴标题→发布)→ 最后放一个「标记发布结果」。计划页的「推送到手机」是同一件事的人工入口(推完你在手机上发,发完点「标记已发布」)。
⚠ 发布结果以每行的状态为准:失败(可重试)说明推送都没成功、可以再推; 结果未知(需确认)说明推送之后那一段出了岔子、可能已经发出去了, 要先到抖音里看一眼,再用「已发出 / 未发出」裁决(平台不会自动重发)。
任务
任务计划定时调度与自定义动作复用管理
| ID | 任务名 | 类型 | 启用 | 目标 | 调度 | 下次运行 | 重试 | 操作 |
|---|
把常用步骤打包成可复用的动作,拖入任务步骤编辑器使用;也可在任务编辑器里"☑选中步骤→打包"生成
| 图标 | 动作名 | 步骤数 | 创建时间 | 操作 |
|---|
步骤默认值:新建步骤时预填这套参数(只影响之后新建的步骤,已有步骤不动;
单步想改就打开那个任务改那一步)。
录制动作:在设备画面上点/划/按键,自动翻译成步骤 —— 既能存成可复用的「自定义动作」, 也能只取一个手势回填到滑动步骤上(步骤编辑器里滑动那一步有「录制手势」按钮)。
录制动作:在设备画面上点/划/按键,自动翻译成步骤 —— 既能存成可复用的「自定义动作」, 也能只取一个手势回填到滑动步骤上(步骤编辑器里滑动那一步有「录制手势」按钮)。
加载中…
📺 实时画面
运行任务时自动跟随操作的设备;
也可手动选择设备观看
也可手动选择设备观看
1️⃣ 说清楚要做什么
AI 会自己在设备上探索,把走通的路径写成任务步骤
2️⃣ 选一台空闲设备
有任务在跑的设备不可选(AI 不与任务抢设备)
3️⃣ 任务设置(可选,留空由 AI 判断)
▸
探索回放
AI 在设备上的每一步(看屏 / 读元素树 / 点按验证)会实时显示在这里。
日志查看
原始文本日志 + 任务步骤明细(结构化,可按设备/任务/时间过滤)
最近运行概览
| 开始 | 设备 | 任务 | 步骤数 | 失败 |
|---|
| 时间 | 设备 | 任务 | 步骤 | 标签 | 类型 | 结果 | 耗时 | 详情 |
|---|
用户管理
管理后台登录用户
| ID | 用户名 | 管理员 | 权限 | 操作 |
|---|
工具
管理员专用:设备工具与应用管理集合
实现:ClipInject APK 透明 Activity 写入剪贴板(Android 10+ 可用,u2 setClipboard 在 Android 12/13 会被系统丢弃);设备需先安装 com.example.clipinject,注入后自动读回比对验证。
点击"刷新设备"加载
选中目标设备后,命令里的
-s <设备> 自动附加,直接写
shell ls /sdcard 即可。离线设备也可选,用"重连设备"恢复。
禁止 kill-server / disconnect(会中断共享的 adb transport,导致设备连接全部重建)。(执行命令后输出显示在这里)
| 主机名 | 显示名 | IP | 系统 | 在线 | 授权 | 密钥过期 | 操作 |
|---|---|---|---|---|---|---|---|
| 点击"刷新设备"加载 | |||||||
"设置IP"可修改设备 IPv4(会断开当前连接,平台 serial 随之变化,需同步设备池);"密钥不过期"= 关闭设备密钥验证,设备不会被定期踢下线;auth key 生成后只显示一次,请立即复制。
| 应用名 | 包名 | 版本 | 大小 | 上传时间 | 操作 |
|---|
📱 设备端应用商店(Agent 直连安装)
设备上装的 Agent 自己来拉这份应用清单 → 在手机上选一个 → 自己下载 → 自己调系统安装器安装。
因为安装由设备上的 App 发起,走的是普通应用安装流程,
不会触发 MIUI 针对 adb 安装的「USB 安装」拦截(那正是
接口契约见
adb install 报 USER_RESTRICTED 的原因)。
适合"人就在机器旁边"的场景(本来就要点一次安装确认)。平台批量推送仍用上面的「安装」按钮。
接口契约见
doc/DEVICE_AGENT.md;令牌属于凭据,别外传。
| 时间 | 设备 | 应用 | 动作 | 说明 |
|---|---|---|---|---|
| 暂无记录(设备还没从商店装过东西) | ||||
| 设备 | 状态 | 版本号 | versionCode |
|---|---|---|---|
| 输入包名后点击"查询版本" | |||
查询所有设备(本地 adb 含 USB + 设备池)上该包名的安装情况与版本号,用于对比各设备 App 版本是否一致;未连接的设备会自动连接(绝不断开,不影响任务)。
| 应用 | 版本号 | versionCode | APK 路径 |
|---|---|---|---|
| 选择设备后点击"查看应用" | |||
| serial | 识别 | 来源 | 首次发现 | 最近发现 | 在线 | 操作 |
|---|---|---|---|---|---|---|
| 尚未扫描 | ||||||
扫描局域网/Tailscale 网段中开放 adb 5555 的设备进入待连接池;
确认后才加入正式设备池(不自动连接、不参与任务调度)。未授权设备(手机未接受 RSA 弹窗)不会出现。
「识别」列:平台按设备指纹认出这台其实就是池中某台设备换了 IP —— 确认后自动认领: 迁移原记录(名称/型号/备注全保留),并把分组与任务里的旧地址一并换成新地址。新设备则必须填名称。
「识别」列:平台按设备指纹认出这台其实就是池中某台设备换了 IP —— 确认后自动认领: 迁移原记录(名称/型号/备注全保留),并把分组与任务里的旧地址一并换成新地址。新设备则必须填名称。
设备池断联设备
(仍在设备池内,扫描线程每轮自动重连;也可手动立即重连)
| serial | 名称 | 型号 | 状态 | 操作 |
|---|---|---|---|---|
| 全部在线 | ||||
定时用
低于阈值时推 webhook 通知(事件
电量只放内存、不落库(重启后重新采一轮),所以不占数据库、不影响备份。 设备离线时显示最后一次读数(置灰),不会变成空白。
dumpsys battery(只读)采集池内在线设备的电量,显示在
「监控 → 设备列表」的电量列与大屏卡片上。低于阈值时推 webhook 通知(事件
device.battery.low,要在「系统 → 通知」里勾选订阅才发):
掉到低电量报一次、掉到严重再报一次、恢复再报一次,不做重复刷屏。电量只放内存、不落库(重启后重新采一轮),所以不占数据库、不影响备份。 设备离线时显示最后一次读数(置灰),不会变成空白。
| serial | 名称 | 型号 | 在线 | 状态 | 指纹 | 账号 | 添加时间 | 操作 |
|---|
新增设备流程:手机开 USB 调试 → 连上后「adb 终端」执行
设备名称必填且唯一:它是设备在平台里的身份(分组/任务/日志都按名称认设备); 设备换了 IP 时用「换地址」把记录迁过去,分组与任务的引用会自动同步,不用重新配。
tcpip 5555 转网络调试 →
Tailscale 上线(同一账号)→ 在此添加 IP:5555(自动尝试连接)→
任务运行时 u2 自动推送 atx-agent。停用 = 不参与任务调度,删除 = 从池中移除(不影响其他系统)。设备名称必填且唯一:它是设备在平台里的身份(分组/任务/日志都按名称认设备); 设备换了 IP 时用「换地址」把记录迁过去,分组与任务的引用会自动同步,不用重新配。
| 分组名 | 描述 | 设备数 | 设备列表 | 操作 |
|---|
管理设备分组,用于任务按分组执行。分组内的设备需先在设备池管理中确认(不在池内的设备不参与调度)。
系统
系统数据备份导出/导入(仅管理员)
导出当前系统数据为 zip:把数据库(MySQL 或回退模式的 SQLite)整库一致快照成
清单见预览的「表数据行数」(由模型元数据自动派生,新增表不会漏);备份里记录了来源环境,跨环境导入默认拒绝。
users.db 归档(全部业务表:用户 / 任务计划 / 设备分组 /
自定义动作 / APK 记录 / 设备池 / 待连接设备 / AI 会话 / 经验库 / 经验巡检 / 动作库 / 系统配置)+ 可选的
apks/ 应用文件。恢复用:换机 / 整库迁移 / 出问题前留底。
清单见预览的「表数据行数」(由模型元数据自动派生,新增表不会漏);备份里记录了来源环境,跨环境导入默认拒绝。
⚠️ 备份为全量快照:含用户口令哈希、AI 配置里的 API Key 等敏感信息,请妥善保管,勿外传、勿提交到 git。
导入恢复:上传平台导出的
备份来自另一个环境(dev↔prod)时默认拒绝导入,需在预览页显式勾选「允许跨环境导入」。
.zip 或 .db → 先校验预览 →
确认后系统会自动备份当前库(data/backups/pre_restore_*.zip,可直接再导入回来)并把恢复任务挂起,
重启 web_server 后生效(导入将覆盖现有全部数据;数据替换在单个事务里完成,失败会自动回滚)。
备份来自另一个环境(dev↔prod)时默认拒绝导入,需在预览页显式勾选「允许跨环境导入」。
通知:把平台事件(任务失败/成功、设备上下线、安装完成、备份恢复…)推到 webhook,
例如企业微信群机器人。每条 webhook 自己勾选关心哪些事件——不勾就不推。
为防刷屏:同一条 webhook 默认每 30 秒合并一次同类事件、每分钟最多 18 条 (企业微信硬限 20),超出的会压成一条「被限流折叠」摘要而不是丢掉。详见
为防刷屏:同一条 webhook 默认每 30 秒合并一次同类事件、每分钟最多 18 条 (企业微信硬限 20),超出的会压成一条「被限流折叠」摘要而不是丢掉。详见
doc/NOTIFY.md。
| 名称 | 格式 | URL | 订阅 | 状态 | 操作 |
|---|
发送记录
仅本次运行期间(重启清空);完整历史见
logs/notify.log
| 时间 | Webhook | 事件 | 结果 | 详情 |
|---|