spec_v2_tight.md 38 KB


title: 实施规格书_飞舟脚本_2026-10-13

# 飞舟脚本 App · 实施规格书

配套设计文件:https://ardot.tencent.com/file/734917825641912\
版本:2026-10-13 · 适用于把本设计交付给编码 AI / 开发执行\
**本文档是"可执行规格",画布只是视觉参考。有冲突时以本文档为准。**

##

§0 怎么用这份文档

先填 §7 技术栈 —— 不填则 §3 的字段控件类型无法映射,开发只能猜。

§1 是页面边界(特别注意 C1–C5 是同一个页面)。

§2 是导航与状态机 —— 决定跳转与互斥,必须先实现。

§3 是字段清单,§4 是交互规则,§5 是必须替换的假数据。

§6 是设计令牌,直接落成主题变量。

§9 列出了已知的不一致与待确认项,开工前先过一遍。

## §1 页面清单(画板 → 页面/状态映射) 底栏只有 3 个 tab:任务 / 记录 / 我的。 |

    编号
    画板名
    节点 ID
    类型
    归属

|

    A1
    卡密登录
    `16:257`
    独立窗口(**无底栏**)
    启动入口

|

    A2
    卡密登录 · 校验中
    `16:1491`
    A1 的**加载态**
    同一页

|

    A3
    卡密登录 · 校验失败
    `16:288`
    A1 的**错误态**
    同一页

|

    A4
    权限引导弹窗
    `30:738`
    弹窗
    叠在 **B1** 上

|

    B1
    任务列表
    `30:102`
    **一级页**
    任务 tab · 默认落点

|

    B2
    任务列表 · 运行中
    `30:203`
    B1 的**运行态**
    同一页

|

    C1
    ID提取
    `3:1`
    **二级页**
    任务 › ID提取 · **首屏**

|

    C1r
    ID提取 · 运行中
    `16:138`
    C1 的**运行态**
    同一页

|

    C2
    ID提取 · 脚本二三
    `16:483`
    C1 的**第 2 屏(滚动位置)**
    同一页

|

    C3
    ID提取 · 脚本四
    `16:589`
    C1 的**第 3 屏**
    同一页

|

    C4
    ID提取 · 功能设置
    `16:706`
    C1 的**第 4 屏**
    同一页

|

    C5
    ID提取 · 功能设置(滚到底)
    `16:965`
    C1 的**底部**
    同一页

|

    C6
    UID私信
    `3:534`
    二级页
    任务 › UID私信

|

    C7
    UID私信 · 脚本一展开
    `7:11`
    C6 的**展开态**
    同一页

|

    C8
    养号
    `3:469`
    二级页
    任务 › 养号

|

    C9
    视频功能
    `3:629`
    二级页
    任务 › 视频功能

|

    D1
    记录列表
    `30:871`
    **一级页**
    记录 tab

|

    D2
    记录空态
    `30:958`
    D1 的**空态**
    同一页

|

    D3
    运行详情
    `30:1241`
    D1 的**二级页**
    记录 › 单次运行

|

    E1
    我的
    `7:289`
    **一级页**(可滚动)
    我的 tab

|

    E2
    我的 · 解绑确认
    `16:850`
    弹窗
    叠在 E1 上

|

    F1
    ID提取 · 未选脚本
    `16:23`
    弹窗
    叠在 C1 上

|

    F2
    ID提取 · 权限拦截
    `16:319`
    弹窗
    叠在 C1 上

|

    F3
    切换任务确认
    `30:1005`
    弹窗
    叠在 B2 上

|

    F4
    ID提取 · 运行中卡密到期
    `16:1360`
    弹窗
    叠在 C1r 上

|

    F5
    脚本报错
    `30:1119`
    C1r 的**报错态** + 弹窗
    同一页

|

    H1
    悬浮球 · 空闲(收起)
    `34:9`
    **全局悬浮窗**
    浮于**其他应用**之上

|

    H2
    悬浮球 · 空闲(展开)
    `34:23`
    同上 · 扇形展开
    同一组件

|

    H3
    悬浮球 · 运行中(展开)
    `34:37`
    同上 · 运行态
    同一组件

|

    H4
    悬浮球 · 报错(收起)
    `34:53`
    同上 · 报错态
    同一组件

|

    H5
    悬浮球 · 停止二次确认
    `34:121`
    弹窗
    叠在 H3 上

|

    H6
    悬浮球 · 退出二次确认
    `34:173`
    弹窗
    叠在 H2 上

|

    H7
    悬浮球 · 拖到右侧(扇形镜像)
    `34:223`
    同一组件 · **镜像布局**
    位置变体示意(见 §10.11)

### ⚠️ 最重要的一条 C1 / C1r / C2 / C3 / C4 / C5 是同一个「ID提取」页面的 6 个采样点,不是 6 个页面。\ ID提取 是一个可滚动的长页面:脚本选择(脚本一~四)→ 功能设置(14 项)。\ C2–C5 只是把它滚动到不同位置时的样子。 ###

实际需要实现的页面只有 5 个 + 3 个 tab + 1 个全局悬浮窗

卡密登录(A1/A2/A3 三态)

任务列表(B1/B2 两态)

任务详情(4 种:ID提取 / UID私信 / 养号 / 视频功能)—— ID提取 最长,可滚动

运行记录(D1/D2 两态 + D3 详情)

我的(E1,可滚动)

\+ H 组悬浮球(一个常驻的全局悬浮窗,浮在所有应用之上)—— 详见 §10

## §2 导航与状态机 ### 2.1 启动与卡密

  启动 → 读本地卡密
    ├─ 无卡密 / 已过期  → A1 卡密登录
    └─ 有效              → B1 任务列表
  A1 ──点「登录激活」→ A2(按钮转「登录中…」+ 转圈,禁用防重复点)
    ├─ 校验失败 → A3(输入框变玫瑰色 + 下方红字提示,仍停在 A1)
    └─ 校验成功 → 检查权限
          ├─ 缺权限 → A4 权限引导弹窗
          └─ 权限齐 → B1

### 2.2 一级 / 二级导航

  B1 任务列表 ──点任务卡主体──→ 对应二级页(C1/C6/C8/C9)
  二级页 ──点「← 返回」──→ B1
  B1/B2/D1/D2/D3/E1 ──点底栏──→ 三个 tab 互切
  D1 记录列表 ──点任一条目──→ D3 运行详情
  D3 ──点「← 返回」──→ D1

### 2.3 全局运行状态机(全局单跑)

          空闲(idle)
            │
            │ 发起运行(前置校验全通过)
            ▼
          运行中(running)────────────────────────────┐
            │                                          │
            ├─ 正常跑完      → 完成(success)          │
            ├─ 点「停止运行」 → 手动停止(stopped)      │ 点别的任务「运行」
            ├─ 卡密到期      → 弹 F4 → 回 A1           ├→ 弹 F3 确认
            ├─ 脚本报错      → 弹 F5(可看日志)        │   └「停止并开始」→ 停旧的,起新的
            └─ 权限被关闭    → 归入「报错中断」          │
                                                      ──┘
  所有结束 → 回到「空闲」,并**写入 D1 一条记录**

互斥规则:任何时刻只允许一个脚本在运行(跨任务也互斥)。 运行中,其他任务的「运行」按钮仍然可点,点击后弹 F3 确认,不做禁用。 运行中,不允许在同一运行中切脚本 —— 必须先停。 ### 2.4 全局运行条 位置:顶部,状态栏下方(x=20, y=70, w=335, h=44) 显示条件:仅「运行中」时出现;空闲/完成时整条隐藏(不占高度) 内容:● {任务名} · 脚本X · 运行中 + 右侧等宽字体计时 报错态(F5):整条变玫瑰红,文案 脚本一 · 执行出错已停止,右侧 已终止 交互:点击整条 → 跳回运行中的那个任务的详情页 职责分工:运行条 = 状态与导航;页面底部 CTA = 启停控制。运行条上不放停止按钮 ### 2.5 运行前置校验顺序

点「开始运行」时,按此顺序校验,任一步不过就拦截:

卡密有效? → 否:不做提示,直接回 A1

无障碍 + 悬浮窗权限齐? → 否:弹 F2

已选脚本? → 否:弹 F1

已有脚本在运行? → 是:弹 F3;否:直接启动

## §3 字段表 ### C1 ID提取 · 脚本选择 |

    字段
    控件
    默认值
    校验 / 备注

|

    脚本一 ~ 脚本四
    **单选圆点**
    脚本一 选中
    同一时间仅可运行一个;页面内有说明「单选:同一时间仅可运行一个脚本」

|

    自定关注或粉丝页面提 ID
    复选框
    ✓
    脚本一展开项

|

    自定页面提 ID
    复选框
    ✗

|

    主播去重
    复选框
    ✓

|

    ├ 去重模式
    下拉
    `ID 模式`

|

    └ 进入页面
    下拉
    `粉丝页`

|

    主播 ID
    输入
    `ID1#ID2#ID3`
    多个用 `#` 分隔

|

    使用文本 ID
    复选框 + 文件选择
    ✗
    路径框**右对齐**;按钮「选择」

|

    底部提示
    文案
    `↓ 下方还有「功能设置」,向下滚动查看`

脚本二/三/四的展开内容见 C2、C3。

### C2 ID提取 · 脚本二 / 脚本三(展开态) 脚本二 · 评论页提 ID |

    字段
    控件
    默认

|

    自定评论页面提 ID
    复选框
    ✓

|

    提取评论的人的粉丝 ID
    复选框
    ✗

脚本三 · 文本 UID 裂变提 ID |

    字段
    控件
    默认

|

    文本 UID 裂变提 ID
    复选框
    ✗

|

    UID 博主去重
    复选框
    ✓

|

    进入页面
    下拉
    `关注页`

|

    裂变文本
    输入 + 按钮
    路径框右对齐 / 按钮「选择」

当前脚本提示条:当前脚本:自定评论页面提 ID(居中、浅色底) ### C3 ID提取 · 脚本四(展开态) |

    字段
    控件
    默认

|

    关键词视频提 ID
    复选框
    ✗

|

    关键词主播
    输入
    `关键词`

|

    关键词提取主播粉丝 ID
    复选框
    ✗

|

    关键词提取评论区 ID
    复选框
    ✗

|

    关键词提取评论的人的粉丝 ID
    复选框
    ✗

### C4 ID提取 · 功能设置(14 项,C2/C3/C5 共用同一张卡) |

    #
    字段
    控件
    默认值
    备注

|

    1
    过滤私密账户
    复选框
    ✓

|

    2
    过滤无头像账户
    复选框
    ✓

|

    3
    提取区域
    输入 + 按钮
    `国家简码:JP#TW#US` / 按钮「含对应区域ID条款」
    说明两行见下

|

    —
    (说明)
    文案
    `国家简码:如日本填 JP;台湾:TW,多国则用 # 隔开`

|

    —
    (说明)
    文案
    `如:JP#TW#CN#US,不填则匹配所有国家`

|

    4
    语言区域
    下拉
    `通杀`

|

    5
    昵称个签检测
    下拉
    `通杀`

|

    6
    云端去重
    复选框 + 输入 + 按钮
    ✓ / `表名:字符` / 按钮「连通测试」

|

    7
    AI 头像识别
    复选框
    ✓

|

    8
    AI性别
    下拉
    `男`

|

    9
    AI 年龄 >
    输入
    `20`

|

    10
    关注量
    **区间输入(双框)**
    `0` ~ `500000`
    数字居中,框宽 56px

|

    11
    粉丝量
    区间输入
    `0` ~ `500000`

|

    12
    获赞量
    区间输入
    `0` ~ `500000`

|

    13
    视频量
    区间输入
    `0` ~ `500000`

|

    14
    提取符合
    输入 + 后缀文案
    `0` + `个 ID 后停止`

### C6 UID私信 |

    分组
    字段
    控件
    默认

|

    脚本选择
    脚本一 · 已提 UID 私信
    单选
    ✓

|

    脚本二 · 自己粉丝私信
    单选
    ✗

|

    功能设置
    AI 性别
    下拉
    `男`

|

    关注数量
    区间输入
    `100` ~ `200`

|

    私信数量
    区间输入
    `20` ~ `30`

|

    休息时间(秒)
    区间输入
    `100` ~ `500`

|

    私信 / 评论设置
    随机私信文本
    文件选择
    按钮「选择文件」

|

    随机评论文本
    文件选择
    按钮「选择文件」

### C7 UID私信 · 脚本一(展开态) |

    分组
    字段
    控件
    默认

|

    脚本一(展开)
    UID 私信
    复选框
    ✓

|

    筛首视频日期
    下拉
    `7 天内`

|

    首视频点赞 / 首视频评论
    开关
    `都执行`

|

    已筛符合的 UID 文本
    输入 + 按钮
    路径框右对齐 / 按钮「选择」

|

    功能设置
    进行关注 / 进行私信
    开关
    `开启`

|

    关注数量
    区间输入
    `100` ~ `200`

|

    私信数量
    区间输入
    `20` ~ `30`

|

    去重方式
    下拉
    `关注+私信去重`

### C8 养号 |

    分组
    字段
    控件
    默认

|

    脚本选择
    随机操作养号
    单选(已选)
    ✓

|

    养号参数
    浏览时长(分钟)
    区间输入
    `3` ~ `8`

|

    点赞概率
    下拉
    `30%`

|

    评论概率
    下拉
    `10%`

|

    关注概率
    下拉
    `15%`

|

    单次操作
    区间输入
    `10` ~ `30`

|

    底部提示
    文案
    —
    `随机浏览、点赞、评论模拟真实活跃度`

### C9 视频功能 |

    分组
    字段
    控件
    默认

|

    脚本选择
    关键词视频功能
    单选(已选)
    ✓

|

    功能设置
    关键词
    输入
    `搜索`

|

    主播区域
    输入
    `国家简码`

|

    停止个数
    区间输入
    `1` ~ `5`

|

    间隔时间(秒)
    区间输入
    `20` ~ `20`

|

    执行操作
    4 个开关胶囊
    关注 开 / 私信 开 / 点赞 关 / 评论 关

|

    私信 / 评论设置
    随机私信内容 1-3
    文件选择
    按钮「选择文件」

|

    随机评论内容 1-3
    文件选择
    按钮「选择文件」

### B1/B2 任务列表 |

    字段
    说明

|

    页面标题
    `飞舟脚本` / 副标题 `TikTok 自动化脚本 · 选择任务`

|

    区标题
    `任务` + 说明 `全局单跑:同一时间仅可运行一个脚本`

|

    任务卡 ×4
    图标 · 任务名 · **状态徽标** · 当前脚本 · 上次运行 · 「运行」按钮

状态徽标取值:空闲(灰) / 运行中(绿) / 未配置(琥珀)\ 任务卡副文案: ID提取 → 当前:脚本一 · 粉丝页提 ID / 上次 10:24 · 提取 128 个 ID UID私信 → 当前:脚本一 · 已提 UID 私信 / 上次 09:58 · 私信 30 人 养号 → 当前:随机操作养号 / 上次 09:12 · 运行 6 分钟 视频功能 → 当前:关键词视频功能 / 还未运行过 ### D1/D3 运行记录 |

    字段
    说明

|

    D1 区标题
    `运行记录` + `共 3 条 · 点任一条查看执行日志`

|

    记录条目
    图标 · `{任务} · {脚本}` · **结果标签** · 时间行 · 结果行 · 右箭头

|

    **结果标签取值**
    `已完成`(绿) / `手动停止`(灰) / `报错中断`(玫瑰红)

|

    D3 摘要卡
    任务名 · 结果标签 · `时间 · 耗时 · 结果量` · 结果文件名 + 「打开」「分享」

|

    D3 日志卡
    标题「执行日志」+「复制」按钮 + 等宽字体日志行

|

    **日志级别配色**
    `INFO` 灰 / `WARN` 琥珀 / `ERROR` 玫瑰红

### E1 我的 |

    分组
    字段
    控件
    值

|

    卡密
    卡密状态
    标签
    `已登录`(绿)

|

    卡密到期时间
    只读值 + 提醒标签
    `2026-12-31 23:59` + `即将到期`(琥珀)

|

    解绑卡密
    按钮
    `解绑`(玫瑰色)

|

    应用
    TikTok 客户端(未安装态)
    标签 + 按钮
    `未安装`(灰)+「下载」

|

    TikTok 客户端(已安装态)
    标签 + 按钮
    `已安装 v39.5.4`(绿)+「更新」

|

    关于
    脚本版本
    只读值
    `2026.10.10`

|

    更新日志
    按钮
    `查看`

|

    检查更新
    标签
    `已是最新`(绿)

⚠️ 「应用」区两行是**互斥状态对照**,运行时按安装状态**只渲染一行**。

### 弹窗文案(A4 / F1–F5 / E2) |

    编号
    标题
    说明
    按钮

|

    A4
    `需要开启权限`
    `为正常执行脚本,请先授予以下权限`
    权限 3 行(无障碍 已开启 / 悬浮窗 未开启 / **通知 未开启(可选)**)+「去授权」+「稍后再说」

|

    F1
    `无法开始运行`
    `请先选择要运行的脚本`
    「知道了」

|

    F2
    `无法开始运行`
    `无障碍与悬浮窗权限未开启,脚本无法执行`
    权限 3 行 +「去授权」+「稍后再说」

|

    F3
    `{任务名}正在运行`
    `开始 {目标任务} 将先停止当前脚本(全局单跑)`
    「取消」+「停止并开始」

|

    F4
    `正在运行的脚本已停止`
    `卡密已到期,需重新登录后继续使用` + 小字 `确认后将返回卡密登录界面`
    **仅「确认」**

|

    F5
    `脚本执行出错`
    `无障碍服务被关闭,脚本已停止运行`
    「查看日志」+「知道了」

|

    E2
    `确认解绑卡密?`
    `解绑后需重新输入卡密才能使用` / `正在运行的脚本将立即停止`
    「取消」+「确认解绑」(玫瑰色)

A4 与 F2 结构完全一致,仅标题/说明/权限初始状态不同,**可复用同一组件**。

## §4 交互规则清单 |

    #
    触发
    行为

|

    1
    启动且无有效卡密
    **自动跳 A1**,不弹提示

|

    2
    运行中卡密到期
    弹 F4 → 点「确认」→ **自动回 A1**

|

    3
    E1 点「解绑」
    弹 E2 → 「确认解绑」→ **自动回 A1**

|

    4
    点「开始运行」
    按 §2.5 顺序校验,不过则拦截

|

    5
    运行中点其他任务「运行」
    弹 F3;「停止并开始」→ 先停旧再起新。**按钮不禁用**

|

    6
    运行中切换任意页面
    顶部运行条**始终可见**(它是全局组件)

|

    7
    点运行条
    跳回运行中的任务详情页

|

    8
    脚本报错
    运行条变红 + 弹 F5;点「查看日志」→ D3

|

    9
    全局互斥
    任何时刻仅一个脚本运行(跨任务)

|

    10
    记录条目点击
    进 D3

|

    11
    「我的」页内容超出
    **页面可滚动**(底部渐隐 + 右侧滚动指示条)

|

    12
    ID提取 / 功能设置页内容超出
    **可滚动**(同上)

|

    13
    脚本卡点击
    展开/收起配置项(箭头方向随之变化)

|

    14
    二级页「← 返回」
    回 B1

|

    15
    所有运行结束
    写一条 D1 记录(含结果分类)

## §5 占位值替换表(必须替换,否则会写死假数据) |

    位置
    当前占位值
    需替换为

|

    E1 · 软件/脚本版本
    `2026.10.10`
    真实脚本版本号规则

|

    E1 · 卡密到期时间
    `2026-12-31 23:59`
    真实到期时间(来自卡密接口)

|

    E1 · TikTok 已安装版本
    `v39.5.4`
    真实适配版本 / 运行时读取

|

    C1 · 主播 ID 示例
    `ID1#ID2#ID3`
    真实示例或留空提示

|

    C4 · 提取区域
    `JP#TW#US` / `JP#TW#CN#US`
    真实默认值

|

    C4/C2/C3/C6/C7/C8/C9 · 所有区间值
    `0~500000` / `100~200` / `20~30` / `100~500` / `3~8` / `10~30` / `1~5` / `20~20`
    真实默认值与上下限

|

    C4 · AI 年龄
    `20`
    真实默认

|

    C4 · 提取符合
    `0`
    真实默认

|

    B1 · 任务卡「上次…」
    `上次 10:24 · 提取 128 个 ID` 等
    读取真实历史记录;无记录显示 `还未运行过`

|

    D1/D3 · 记录与日志
    3 条示例 + 6 行日志
    真实运行记录;日志为**脚本真实输出流**

|

    D3 · 结果文件名
    `uid_20261013.txt`
    真实产物文件名规则

|

    A1 · 卡密输入框示例
    校验失败态里的 `TK9F-2A7C-8E10-4B55`
    仅演示用,不要预填

## §6 设计令牌 ### 颜色 |

    用途
    值

|

    页面底色
    `#030014`

|

    卡片底
    `#FFFFFF` @ 4%(部分 6%)

|

    卡片描边
    `#FFFFFF` @ 8%

|

    弹窗底 / 描边
    `#17142B` / `#FFFFFF` @ 12%

|

    底栏底
    `#0A0A17` @ 96%

|

    主色(渐变)
    `#2EA7FF` → `#9381FF`

|

    主色(单色)
    `#2EA7FF`(激活/链接 `#7CC7FF`)

|

    成功 / 运行中
    `#13DDC4`

|

    警告 / 未配置 / 即将到期
    `#F5C24B`

|

    危险 / 报错 / 解绑
    `#FF5470`

|

    次要紫
    `#9381FF`

|

    主文字
    `#FFFFFF`

|

    正文文字
    `#CFCCE6` / `#E6E4F5`

|

    次要文字
    `#9A97B8` / `#8E8BA8`

|

    弱提示文字
    `#6F6C8A`

### 字体 |

    用途
    字体 / 字号

|

    中文
    `Noto Sans SC`

|

    数字 / 设备号 / 日志
    `JetBrains Mono`

|

    状态栏时间
    `Inter`

|

    页面标题
    22px / SemiBold

|

    二级页返回头标题
    21px / SemiBold

|

    弹窗标题
    18px / SemiBold

|

    区标题 / 任务卡标题
    16px / 15px SemiBold

|

    设置名 / 正文
    13px Regular

|

    标签 / 说明 / 提示
    11–12px

### 尺寸与圆角 |

    元素
    规格

|

    画板
    375 × 812

|

    状态栏
    高 62(**系统绘制,不要实现**)

|

    **全局运行条**
    `x=20, y=70, w=335, h=44`,圆角 12

|

    **返回头**
    高 44,返回热区 44×44,圆角 —

|

    **底栏**
    高 83 = 页签行 49 + 安全区 33

|

    底栏页签图标
    22×22

|

    内容区(空闲)
    `y=62, h=595`

|

    内容区(运行中·有 CTA)
    `y=126, h=531`

|

    内容区(运行中·无 CTA)
    `y=126, h=591`

|

    主 CTA
    `x=20, w=335, h=48`,圆角 99

|

    卡片
    圆角 16 / 14,内边距 14–16

|

    **区间输入框**
    单框宽 **56**,数字**居中**

|

    文件路径输入框
    内容**右对齐**

|

    底部渐隐
    `y=577, h=80`

|

    滚动指示条
    `x=367, w=3`,圆角 99

### 触控标准 新组件(任务卡、记录条目、返回头、运行条)按 44pt 实现(如运行按钮 68×44、返回热区 44×44)。 ⚠️ 既有控件(设置行、胶囊)视觉仍是 26px —— 建议实现时视觉保持紧凑、热区用透明 padding 撑到 44px(§9 有记录)。 ### 图标 线性图标,stroke-width 1.6,圆角端点,viewBox 0 0 24 24。\ 底栏三图标:任务=圆角方框+勾 / 记录=时钟 / 我的=人像。 ### 品牌图标(FluxRpa) 源文件目录 E:\渡梦星舟\飞舟图标\(同一图标的多尺寸,角标数字为圆角半径): |

    文件
    尺寸
    圆角
    本设计中的用途

|

    `FluxRpa_64_13R.png`
    64
    13
    不采用(清晰度不足)

|

    `FluxRpa_128_29R.png`
    128
    29
    不采用(清晰度不足)

|

    `FluxRpa_256_58R.png`
    256
    58
    备用(原方案给球体用,已被去字标版取代)

|

    **`FluxRpa_512_114R.png`**
    **512**
    114
    ✅ **登录页 Logo 72×72**(72dp @4x = 288px,仅 512 够)

|

    **`FluxRpa_mark_only_412.png`**
    **412**
    —
    ✅ **全局悬浮球 Ø48** —— **去字标版**,见下

「去字标版」怎么来的(可复现)

从 FluxRpa_512_114R.png 派生的球体专用图,处理三步:

透明像素填白(保留图标白底观感);

抹掉字标:实测标记与 FLUXRPA 字标的分界在 y = 331(该行彩色像素数为 0,是干净的空隙),

331 行以下全部填白;

以标记 bbox(76,96–435,330,宽 360 高 235,中心 255.5,213)为中心做正方形裁切,\ 边长取「内容最大半径 192.3px ÷ 0.94 × 2 ≈ 410」→ 取 412,使任何内容点都不被圆形裁切到。

效果:标记从占球直径 **70% → 87.4%**(放大 25%),且 **Ø48 下不再有 6px 的字标噪点、四角不被裁**。\
已交付:`品牌资产/FluxRpa_mark_only_412_悬浮球去字标版.png`(412×412,白底)。

实际用途一览(共 9 处) |

    位置
    节点
    尺寸
    用图
    圆角

|

    A1 / A2 / A3 登录牌
    `16:275` / `16:1513` / `16:309`
    72×72
    `FluxRpa_512`(**完整图标**,字标在 72px 下清晰)
    16(= 114/512×72)

|

    H1–H7 悬浮球
    `34:18` / `34:32` / `34:48` / `34:64` / `34:124` / `34:175` / `34:225`
    Ø48
    `mark_only_412`(**去字标**)
    99(**圆形裁切**)

登录页保留**完整图标**(含字标):72px 下字标约 12px 高,可读,且登录页需要完整品牌署名。\
悬浮球用**去字标版**:48px 放不下字标,且球是常驻控件,越简洁越好。

## §7 技术栈(开工前必填) |

    项
    值

|

    运行形态
    ☐ Android 原生(Compose / View) ☐ WebView + H5 ☐ AutoX.js `ui` 模块 ☐ 其他:\_\_\_\_

|

    目标 TikTok 版本
    \_\_\_\_

|

    卡密校验接口
    \_\_\_\_(地址 / 方法 / 请求体 / 返回结构 / 错误码)

|

    权限申请方式
    无障碍:跳系统设置?悬浮窗:`ACTION_MANAGE_OVERLAY_PERMISSION`?

|

    脚本执行与日志回传
    AutoX 事件/回调 结构 \_\_\_\_

|

    记录与配置的本地存储
    \_\_\_\_(SQLite / JSON / MMKV)

|

    结果文件落点
    \_\_\_\_(目录 / 命名规则 / 是否需上传)

|

    更新检查接口
    \_\_\_\_(软件更新 / 脚本更新)

|

    TikTok 客户端下载源
    \_\_\_\_

## §8 分批实施顺序(建议) |

    批次
    内容
    验收

|

    **第 1 批 · 静态壳**
    A1–A4、B1/B2、C1–C9、D1–D3、E1/E2、F1–F5 的页面与导航 + §6 令牌
    能点着走完全部页面,视觉对齐画布

|

    **第 2 批 · 状态与规则**
    §2.3 全局状态机、§2.5 前置校验、§4 全部 15 条交互、5 类弹窗触发
    每种状态都能触发到;互斥不破

|

    **第 3 批 · 业务**
    卡密校验(A2/A3)、真实权限申请、脚本执行 + 日志流、结果文件落点、记录持久化
    真机跑通一个完整任务

每批完成后先出静态预览确认,再进下一批。

## §9 已知不一致与待确认项(开工前先过一遍) |

    #
    问题
    建议

|

    1
    **C6 与 C7 的「功能设置」字段集不同**:C6 是 `AI 性别 / 关注数量 / 私信数量 / 休息时间`,C7 是 `进行关注·进行私信 / 关注数量 / 私信数量 / 去重方式`
    同一页不应有两套,需**二选一统一**(我倾向以 C7 为准,C6 补上开关与去重方式)

|

    2
    **C1–C5 未在画布上加分组标注**
    本规格书 §1 已说明;画布如需标注可另补

|

    3
    **触控目标**:既有控件视觉高 26px \
    实现时热区撑到 44;若要视觉也放大需重排版式

|

    4
    **E1 / 多个二级页内容余量很小**(E1 空闲态约 548/595)
    运行中加运行条后余量更紧;已加底部渐隐,实现时按**可滚动**处理

|

    5
    **未激活页签旧色 `#7A7794` 对比度 4.4:1** 未达 WCAG AA
    已统一改为 `#8E8BA8`(5.6:1),实现时用新值

|

    6
    **B1 任务卡的「上次运行/结果量」需要数据来源**
    依赖任务层提供统计字段,需在 §7 里明确

|

    7
    悬浮球 Ø48 上字标仅约 6px、四角被圆裁
    **已解决**:球体改用**去字标版**(标记放大到球直径 87.4%)。登录页仍用完整图标(72px 下字标清晰),见 §6 品牌图标

|

    8
    **报错态是否该在球内放警示三角**
    已统一为**只换外环颜色**(红环),球内保持品牌图标 —— 与"图标恒定"规则一致

|

    7
    **多脚本并行不支持**(设计上就是全局单跑)
    若未来要支持队列,需重新设计状态机

|

    8
    **D3 日志的长列表**
    日志可能很长,需虚拟滚动;已设计「复制」按钮

## §10 悬浮球(H 组 · 全局悬浮窗) 定位:浮在所有应用之上(含 TikTok),是跨 App 唯一的控制入口与运行状态可视处。\ App 前台也显示(用户已确认)。 ### 10.1 默认位置与尺寸 |

    项
    值

|

    默认位置
    **屏幕左侧**,左边距 12,**垂直居中** → 球心 `(36, 406)`

|

    球体
    **Ø48**(透明热区 64),圆角 99;填充 = **FluxRpa 应用图标**(圆形裁切)

|

    不透明度
    **1.0**(三态统一。球内是图片,半透明会发灰;状态一律靠外环表达)

|

    扇形半径
    **R = 96**

|

    子按钮
    Ø48,圆角 99

|

    扇形夹角
    **60° / 20° / −20° / −60°**(以球心为原点,**向右**展开)

|

    标签胶囊
    高 24、圆角 99、距按钮右侧 4px、11px 字

|

    展开动画
    180ms

### 10.2 按钮坐标(相对屏幕,可直接落码) |

    #
    按钮
    球心
    按钮左上角
    标签左上角 / 宽

|

    1
    运行 / 停止
    (84, 322.9)
    (60, 299)
    (112, 311) / 38

|

    2
    回到 App
    (126.2, 373.2)
    (102, 349)
    (154, 361) / 59

|

    3
    隐藏悬浮球
    (126.2, 438.8)
    (102, 415)
    (154, 427) / 71

|

    4
    退出应用
    (84, 489.1)
    (60, 465)
    (112, 477) / 60

计算式:按钮中心 = 球心 + R·(cosθ, −sinθ)(屏幕坐标 y 向下,故取负 sin) ### 10.3 扇形里的四个按钮 |

    #
    按钮
    图标
    样式
    二次确认

|

    1
    **运行 / 停止**(随状态切换)
    播放三角 / 方块
    运行=品牌渐变实底;停止=`#FF5470` 实底
    **停止要确认,运行不要**

|

    2
    回到 App(任务列表 / 运行详情)
    四宫格
    白 8% 底 + 白 18% 描边
    否

|

    3
    隐藏悬浮球(收起)
    eye-off
    同上
    否

|

    4
    退出应用
    power
    `#FF5470` @14% 底 + 40% 描边,图标与文字 `#FF5470`
    **要确认**

**按钮数量上限就是 4 个**。R=96 时相邻按钮间隙约 17.7px,已接近舒适下限;\
若未来要加第 5 个,建议不要继续挤扇形。

### 10.4 球的三种状态(图标恒定,靠外环表达) |

    状态
    外环
    外环透明度
    呼吸动效

|

    空闲
    `#6F6C8A`
    —(**无**外环)
    无

|

    **运行中**
    `#13DDC4`
    0.22
    有(外扩到 r=28)

|

    **报错**
    `#FF5470`
    0.20
    无(静态外环)

球内**恒定是 FluxRpa 应用图标**,不随状态更换 —— 避免"中间显示播放图标 → 用户以为点了就运行"的歧义;\
点击的语义始终是**展开扇形**,状态一律由**外环颜色**表达。\
⚠️ 报错态**不再**在球内放警示三角(H4 初版曾如此),现统一以红环表达。

### 10.5 手势 |

    手势
    阈值
    行为

|

    单击
    —
    展开 / 收起扇形

|

    按住拖动
    位移 > 8px
    移动位置;松手**吸附最近边缘**并**记忆位置**

扇形方向自适应:球在左 → 向右展开;球被拖到屏幕右侧 → 必须镜像为向左展开,否则整组按钮出屏。 ### 10.6 二次确认弹窗 |

    触发
    标题
    说明
    按钮

|

    停止(H5)
    `停止当前脚本?`
    `脚本一 已运行 12 分 30 秒` / `停止后进度不保留,下次将从开头重新开始`
    取消 / **停止运行**(红)

|

    退出(H6)
    `退出飞舟脚本?`
    `将停止正在运行的脚本,并关闭悬浮球` / `脚本进度不保留,下次运行将从开头重新开始`
    取消 / **退出应用**(红)

### 10.7「退出应用」语义(用户已确认) 停止脚本 + 关闭悬浮球 + 退出到桌面(a 方案)。\ 注意:A1 卡密登录页底部已有一个「退出应用」文本按钮,两者语义应保持一致。 ### 10.8 ⚠️ 位置风险(默认改左侧的原因) 右侧垂直居中时球体占 y 382–430,而 TikTok 右侧点赞/评论栏约从 y 447 起 ——\ 只剩约 17px 余量,换屏幕比例不同的机型或 TikTok 改版就可能压上,且那片是高频滑动区。\ 左侧中部相对更空,因此默认放左侧;但拖动 + 吸附 + 记忆位置仍必须实现。 ### 10.9 技术要点 |

    #
    要点

|

    1
    需 `SYSTEM_ALERT_WINDOW` —— 这是现有权限弹窗中「悬浮窗权限」**唯一实际用途**,故它是**强阻断项**

|

    2
    **Android 10+ 后台启动 Activity 受限**:「回到 App」**不能**用裸 `startActivity`,需通知 / `PendingIntent` 方案

|

    3
    **与无障碍点击冲突**:脚本坐标点击可能点到球;运行时建议降不透明度,脚本侧点击区域避开球位

|

    4
    悬浮窗须 `FLAG_NOT_FOCUSABLE`,否则会抢输入焦点、影响 TikTok 键盘

### 10.10 悬浮球与顶部运行条的关系 两者并存,不互相替代: 顶部全局运行条:只在 App 内可见,承载"点击跳回运行中的任务" 悬浮球:只在 App 外(浮于其他应用时)才有意义,承载"跨 App 启停与状态可视"

用户已确认悬浮球在 App 前台**也显示**。若后续觉得重复,最省事的收敛方式是\
**App 前台时把球降到 0.3 透明度**(保留但不抢注意力),而不是隐藏。

### 10.11 镜像布局(球被拖到屏幕右侧) 球在右边缘时,扇形必须向左镜像展开,标签同步移到按钮左侧。画板:H7 34:223。 球心 (339, 406)(右边距 12,垂直居中不变): |

    #
    按钮
    球心
    按钮左上角
    标签左上角 / 宽

|

    1
    运行 / 停止
    (291, 322.9)
    (267, 299)
    (225, 311) / 38

|

    2
    回到 App
    (248.8, 373.2)
    (225, 349)
    (162, 361) / 59

|

    3
    隐藏悬浮球
    (248.8, 438.8)
    (225, 415)
    (150, 427) / 71

|

    4
    退出应用
    (291, 489.1)
    (267, 465)
    (203, 477) / 60

镜像公式(屏幕坐标 y 向下) 球心:x_镜像 = 屏宽 − 12 − 球半径 按钮:x_镜像 = 屏宽 − x_原 − 按钮宽,等价于角度取 θ′ = 180° − θ,\ 即 60°/20°/−20°/−60° → 120°/160°/200°/240° 标签:由「按钮右侧 + 4」改为「按钮左边 − 4」→ 标签右边 = 按钮左边 − 4

H7 里球体正好压在「参考区」(模拟其他 App 的右侧操作栏)上 ——\
这正是 §10.8 所述重叠风险的可视化,也是必须做**拖动吸附 + 位置记忆**的理由。

## 附:Ardot 设计文件节点索引(供查证)

  A1 16:257    A2 16:1491   A3 16:288    A4 30:738
  B1 30:102    B2 30:203
  C1 3:1       C1r 16:138   C2 16:483    C3 16:589
  C4 16:706    C5 16:965    C6 3:534     C7 7:11
  C8 3:469     C9 3:629
  D1 30:871    D2 30:958    D3 30:1241
  E1 7:289     E2 16:850
  F1 16:23     F2 16:319    F3 30:1005   F4 16:1360   F5 30:1119
  H1 34:9      H2 34:23     H3 34:37     H4 34:53     H5 34:121    H6 34:173
  H7 34:223(球拖到右侧 · 扇形镜像)
  组件母版:
  底栏  任务激活 30:45 / 记录激活 30:64 / 我的激活 30:81
  返回头 ID提取 30:1 / UID私信 30:7 / 养号 30:18 / 视频功能 30:29
  悬浮球背景 34:1(其他应用界面示意)
  品牌图标:球 Ø48 用 FluxRpa_mark_only_412(**去字标**)/ 登录 Logo 72 用 FluxRpa_512(完整)
  登录 Logo 节点:A1 16:275 / A2 16:1513 / A3 16:309
  悬浮球节点:H1 34:18 / H2 34:32 / H3 34:48 / H4 34:64 / H5 34:124 / H6 34:175 / H7 34:225

KS_DOC_REVIEWS JZf9xTgLXBFgjXJ4dJWVsU 187475 https://www.workbuddy.cn/space/d/JZf9xTgLXBFgjXJ4dJWVsU