feat: add history replay and work filters
This commit is contained in:
@@ -0,0 +1,327 @@
|
||||
# 0.1.7:历史事件预览操作、指定作品监控与完整业务输出
|
||||
|
||||
## 需求与确认结果
|
||||
|
||||
本次需求包括:
|
||||
|
||||
1. 系统输出不再对业务数据脱敏。
|
||||
2. 大号可以获取全部历史事件,预览、选择后交给小号执行;新消息优先。
|
||||
3. 大号可以获取近期或全部历史作品,选择仅监控指定作品的点赞、收藏、评论等互动。
|
||||
|
||||
通过交互确认:
|
||||
|
||||
- UID、通知 ID、昵称、评论、私信正文、作品 ID/描述、URL、平台资料和结构化业务结果按原文输出。
|
||||
- Cookie、Authorization、Session、Token、密码和签名继续强制隐藏,避免日志成为可直接接管账号的凭据文件。
|
||||
- 历史事件必须先完整获取和预览,用户逐条勾选或全选,二次确认后才能产生真实任务。
|
||||
- 作品监控升级后默认“全部作品”,保持旧行为;用户主动保存选择后进入“指定作品”模式,新发布作品不会自动加入。
|
||||
|
||||
排查和验证期间先通过 Windows MCP“停止全部”,保留用户浏览器登录。所有真实账号接口调研均为 GET/SDK 只读请求,固定 `is_mark_read=0`,没有关注、私信、标记已读或自动登录。
|
||||
|
||||
## 只读接口调研
|
||||
|
||||
### 历史互动通知
|
||||
|
||||
在已登录且身份核验一致的页面中,通过 browser-harness 检查网页现有 Webpack SDK:
|
||||
|
||||
- 通知模块当前包含通知列表、计数、详情、点赞用户列表和相关只读函数。
|
||||
- “全部互动”使用 `notice_group=700`。
|
||||
- 列表请求使用 `count`、`min_time`、`max_time` 和 `has_more` 分页。
|
||||
- 本次现场以每页 50 条连续读取前 5 页,得到 250 个唯一通知 ID,接口仍报告有后续页;因此产品不能只取固定 5 页。
|
||||
- 现场历史类型包含评论、关注和点赞/作品互动;行内包含稳定通知 ID、时间、作品 ID及嵌套用户、评论、点赞数据。
|
||||
- 所属 `user_id` 可与已绑定大号逐条核验。
|
||||
|
||||
产品实现持续分页直到平台返回 `has_more=0`,并检测重复/不推进游标。设置 1000 页、50000 条的安全上限;超过时明确报错,不把截断结果冒充“全部”。
|
||||
|
||||
通知列表的网页函数默认可能设置已读参数,因此产品显式传入 `is_mark_read=0`,并在离线浏览器 fixture 中强制断言该参数。
|
||||
|
||||
### 作品列表
|
||||
|
||||
网页现有作品函数使用 `/aweme/v1/web/aweme/post/`,请求字段包括:
|
||||
|
||||
- `sec_user_id`;
|
||||
- `max_cursor`;
|
||||
- `count`;
|
||||
- 时间列表选项。
|
||||
|
||||
响应包含:
|
||||
|
||||
- `aweme_id`;
|
||||
- 完整描述;
|
||||
- 发布时间;
|
||||
- 作者资料;
|
||||
- 点赞、评论、收藏等 statistics;
|
||||
- 视频封面或图集 URL;
|
||||
- `has_more` 和 `max_cursor`。
|
||||
|
||||
“近期作品”取一页 18 条;“全部历史作品”持续翻页直到结束,检测重复游标,安全上限为 1000 页/18000 条,超限明确失败。
|
||||
|
||||
### 收藏事件边界
|
||||
|
||||
当前页面代码和现场 250 条通知中没有发现稳定、独立的“收藏通知类型常量”。点赞通知存在多个子类型,其中现场出现的子类型 22 实际可对应图文作品点赞,不能错误硬编码为收藏。
|
||||
|
||||
因此产品采用可验证的结构策略:
|
||||
|
||||
- 若通知含 `favorite` 或 `collect` 业务对象,提取其中的来源用户和作品。
|
||||
- 无论事件被平台归类为点赞、评论、收藏或其他,只要携带作品 ID,就执行同一作品范围过滤。
|
||||
- UI 将 `general_notice` 显示为“收藏/其他作品互动”。
|
||||
- 不声称平台一定会为每次收藏推送通知;系统只能处理平台实际提供的推送或历史记录。
|
||||
|
||||
## 网页原生只读请求
|
||||
|
||||
新增通用 `native_read_script()`,继续复用网页自身 Axios/XHR 请求层,不手工拼接简化 fetch:
|
||||
|
||||
1. 动态取得当前页面 Webpack require。
|
||||
2. 以 JSON 字符串形式的**完整端点字面量**匹配模块和导出函数,避免 `/notice/count/`、`/notice/delete/` 等前缀相似端点误匹配。
|
||||
3. 历史通知函数还要求源码含 `is_new_notice` 标记。
|
||||
4. 作品函数使用网页现有 `fetchUserPost` 导出。
|
||||
5. 临时 Axios response observer 只匹配同源、精确 pathname及本次分页参数。
|
||||
6. 从 XHR `responseText` 读取原始文本,再交给 Python `json.loads`,避免 JavaScript 对 64 位 ID舍入。
|
||||
7. 成功、失败和超时都在 `finally` 中删除 observer。
|
||||
8. 不修改全局 XHR、不篡改响应、不创建额外登录状态。
|
||||
|
||||
最初通用匹配只检查端点前缀,现场只读验证误选到 notice count 函数并返回业务码 5。修复为完整端点字面量后,再次现场验证:
|
||||
|
||||
```json
|
||||
{
|
||||
"identity_verified": true,
|
||||
"history_http": 200,
|
||||
"history_status": 0,
|
||||
"history_count": 3,
|
||||
"history_mark_read": 0,
|
||||
"history_ids_exact": true,
|
||||
"history_identity_verified": true,
|
||||
"works_http": 200,
|
||||
"works_status": 0,
|
||||
"works_count": 3,
|
||||
"works_ids_exact": true,
|
||||
"works_identity_verified": true,
|
||||
"real_write_actions": 0
|
||||
}
|
||||
```
|
||||
|
||||
调研 SSH/CDP 临时转发随后关闭,不关闭用户浏览器。
|
||||
|
||||
## 历史事件操作
|
||||
|
||||
### UI 流程
|
||||
|
||||
大号工具栏新增“历史事件操作”:
|
||||
|
||||
1. 只允许已登录且已绑定身份的大号。
|
||||
2. 点击后只读获取全部可用历史互动。
|
||||
3. 完成后打开预览表,显示:
|
||||
- 时间;
|
||||
- 类型;
|
||||
- 来源 UID和昵称;
|
||||
- 作品 ID和完整描述;
|
||||
- 评论/内容;
|
||||
- 通知 ID;
|
||||
- 完整业务 JSON。
|
||||
4. 初始不勾选,不产生任务。
|
||||
5. 支持逐条勾选、全选和清空。
|
||||
6. 点击确定后再次显示“可能产生真实关注和私信”的确认框,默认按钮为“否”。
|
||||
7. 用户再次确认后,UI只发送已加载通知 ID;Engine根据内存缓存取回原始对象,拒绝未加载或伪造 ID。
|
||||
|
||||
缓存仅存在于当前程序运行期;重启后必须重新获取,避免使用陈旧平台结果。
|
||||
|
||||
### 入库和去重
|
||||
|
||||
`Store.ingest(source, notice, origin)` 新增来源:
|
||||
|
||||
- `live`:实时推送;
|
||||
- `history`:用户确认的历史列表。
|
||||
|
||||
事件仍以 `(source,nid)` 唯一,历史列表和实时推送不会对同一通知创建两套事件。历史确认使用当前大号规则快照,并继续经过:
|
||||
|
||||
- 规则开关;
|
||||
- 通知类别;
|
||||
- 指定作品范围;
|
||||
- 有效来源 UID;
|
||||
- 自操作保护;
|
||||
- 组共享 UID 冷却;
|
||||
- pending/running/unknown 重复保护。
|
||||
|
||||
界面确认结果显示:选择数量、新增事件数量和实际创建任务数量。三者可能不同,详细原因写入每日运行日志。
|
||||
|
||||
## 新消息优先
|
||||
|
||||
数据库迁移新增:
|
||||
|
||||
```sql
|
||||
events.origin TEXT NOT NULL DEFAULT 'live';
|
||||
tasks.priority INTEGER NOT NULL DEFAULT 100;
|
||||
```
|
||||
|
||||
- 实时任务优先级 100。
|
||||
- 历史任务优先级 0。
|
||||
- Worker领取时 `ORDER BY priority DESC,id`。
|
||||
- waiting events也先分配 live,再分配 history。
|
||||
- 正在执行的历史任务不强行中断;完成当前平台请求后再领取实时任务。
|
||||
|
||||
### 同 UID冲突
|
||||
|
||||
若实时新消息到达时,同一大号组和目标 UID已有尚未执行的历史任务:
|
||||
|
||||
- pending历史任务改为 cancelled;
|
||||
- 记录“新消息优先,取消未执行历史任务”;
|
||||
- 创建实时任务;
|
||||
- 不把历史任务改派或重发。
|
||||
|
||||
若历史任务已 running 或 unknown,继续遵守“在途不强停、结果不确定不重发”,不创建可能重复打扰的新任务。
|
||||
|
||||
若同一通知先从历史列表进入、随后相同 nid实时推送到达:
|
||||
|
||||
- events.origin 从 history 提升为 live;
|
||||
- 其 pending任务优先级提升到 100;
|
||||
- 不重复创建事件或任务。
|
||||
|
||||
## 指定作品监控
|
||||
|
||||
大号工具栏新增:
|
||||
|
||||
- “获取近期作品”;
|
||||
- “获取全部历史作品”。
|
||||
|
||||
作品表显示发布时间、完整描述、作品 ID、statistics、封面 URL和完整业务 JSON。
|
||||
|
||||
规则新增:
|
||||
|
||||
```json
|
||||
{
|
||||
"work_mode": "all",
|
||||
"work_ids": []
|
||||
}
|
||||
```
|
||||
|
||||
### 全部作品模式
|
||||
|
||||
- 升级默认值。
|
||||
- 与旧版本一致。
|
||||
- 以后发布的新作品自动包含。
|
||||
|
||||
### 指定作品模式
|
||||
|
||||
- 至少选择一个作品。
|
||||
- `work_ids` 去重并持久化,最多 50000 个 ASCII 十进制 ID。
|
||||
- 新作品不会自动加入。
|
||||
- 近期列表没有显示的既有历史选择会保留,避免用户只刷新近期作品就误删旧选择。
|
||||
- 需要统一移除旧选择时,使用“获取全部历史作品”。
|
||||
- 点赞、评论、收藏/其他作品互动必须提取出作品 ID且在列表内,否则事件记录为 ignored、不生成任务。
|
||||
- 关注通知没有作品 ID,不受作品范围限制。
|
||||
- 修改范围只影响之后入库的事件;已创建任务保留原规则快照。
|
||||
|
||||
`Window.rules()` 保存普通规则时也会携带原 `work_mode/work_ids`,不会因为修改私信正文或间隔而意外重置作品选择。
|
||||
|
||||
## 完整业务输出与凭据保护
|
||||
|
||||
### 已移除的业务字段隐藏
|
||||
|
||||
以下内容现在原样进入 UI、任务结果、本地 profile和每日日志:
|
||||
|
||||
- 完整 UID和通知 ID;
|
||||
- 昵称、平台资料和手机号等资料字段;
|
||||
- 作品 ID、描述、统计、封面 URL;
|
||||
- 评论内容;
|
||||
- 私信正文;
|
||||
- 业务 URL;
|
||||
- SDK成功、失败和待核对结果结构。
|
||||
|
||||
删除了通知 ID哈希、UID尾号显示、URL隐藏、正文隐藏和“复杂数据不记录”。结构化 dict/list 使用 UTF-8 JSON输出,不截断单行业务文本。
|
||||
|
||||
`get_current_user` 和异步 Session现在返回完整业务资料,并补充兼容用的 `douyin_id/avatar_url` 字段。Store保存完整业务 profile。
|
||||
|
||||
### 仍强制保护的认证字段
|
||||
|
||||
以下字段无论嵌套深度都替换为 `[凭据已隐藏]`:
|
||||
|
||||
- Cookie;
|
||||
- Authorization;
|
||||
- Session ID;
|
||||
- Token/msToken;
|
||||
- password/secret;
|
||||
- verifyFp;
|
||||
- a_bogus、X-Bogus、X-TT-Params和签名。
|
||||
|
||||
URL本身保留,但认证查询参数值会隐藏。控制字符、换行和双向文本控制符继续清理,防止伪造日志行;这不是业务字段脱敏。
|
||||
|
||||
任务结果以前只保留私信 client/server ID。本次改为保存完整 business result;若结果中包含认证键,先递归替换凭据值,再写 SQLite和日志。未知结果继续附加 `SDK_RESULT_UNCONFIRMED`,不会自动重发。
|
||||
|
||||
## 测试
|
||||
|
||||
### Python测试
|
||||
|
||||
Linux与Windows完整 pytest:
|
||||
|
||||
```text
|
||||
73 passed
|
||||
```
|
||||
|
||||
新增覆盖:
|
||||
|
||||
- 历史通知双页分页、完整 64 位 nid、`is_mark_read=0`;
|
||||
- 作品双页分页、完整 aweme ID、描述、统计和封面 URL;
|
||||
- 历史/作品重复游标拒绝;
|
||||
- 历史或作品所属身份不符时失败关闭;
|
||||
- Native SDK模块精确端点匹配、Axios observer成功/失败后清理;
|
||||
- 历史预览尚未确认时任务数为 0;
|
||||
- 未加载的历史 ID拒绝;
|
||||
- 用户确认后按规则创建任务;
|
||||
- 指定作品允许所选点赞/收藏结构,拒绝范围外作品;
|
||||
- 关注不受作品筛选;
|
||||
- live任务先于history任务领取;
|
||||
- 同 UID实时消息取消未执行历史任务;
|
||||
- 同 nid历史任务提升为实时优先级;
|
||||
- 默认作品模式、作品 ID类型/数量验证和旧规则迁移;
|
||||
- UI按钮只接受已绑定大号;
|
||||
- 历史预览业务字段原样显示、默认不选、二次确认;
|
||||
- 作品预览保存指定模式和完整业务字段;
|
||||
- profile保留手机号等业务字段,Cookie值隐藏;
|
||||
- 私信成功结果保留完整正文,Token值隐藏。
|
||||
|
||||
### Windows fingerprint-chromium矩阵
|
||||
|
||||
新增:
|
||||
|
||||
```text
|
||||
native_history_and_works_pagination_identity_precision_and_cleanup
|
||||
```
|
||||
|
||||
真实离线 Chromium fixture要求:
|
||||
|
||||
- 历史请求 `notice_group=700`、`is_mark_read=0`;
|
||||
- 历史分页两页;
|
||||
- 作品使用绑定账号的 sec_uid并分页两页;
|
||||
- 通知和作品 64 位 ID保留字符串精度;
|
||||
- 每条用户/作者身份匹配;
|
||||
- 所有临时 Axios observer清理,不破坏原有 observer。
|
||||
|
||||
原有详情、登录、身份隔离、目录/端口、固定种子、重连、小号删除和浏览器关闭矩阵继续通过。报告 `real_write_actions=0`。
|
||||
|
||||
### 构建
|
||||
|
||||
- 13 个相关 Python文件 LSP error检查:0。
|
||||
- Windows pytest:73项通过。
|
||||
- 打包后 smoke:Qt、核心模块、SQLite、Patchright、内置浏览器路径均通过;accounts=0、real_write_actions=0。
|
||||
- 23个 Python源文件 SHA256与Windows build-manifest全部一致。
|
||||
- 浏览器和运行时保持 fingerprint-chromium 148.0.7778.215、Patchright 1.62.3、Python 3.12.10。
|
||||
|
||||
## 发布
|
||||
|
||||
```text
|
||||
C:\Users\rogee\Desktop\抖音账号助手-0.1.7\
|
||||
DouyinAccounts-0.1.7-Windows-x64-Setup.exe
|
||||
SHA256SUMS.txt
|
||||
使用说明.txt
|
||||
```
|
||||
|
||||
- 安装包大小:222682833字节。
|
||||
- SHA256:`5401c81ab96565e41ea4ffdaf423723faafae4f4088f39ca6967afac750a8428`。
|
||||
|
||||
未自动安装、启动业务或把真实历史事件入队。建议覆盖安装后:
|
||||
|
||||
1. 先打开“获取近期作品”,确认完整业务字段和默认“全部作品”。
|
||||
2. 如需节省小号配额,切换为指定作品并保存。
|
||||
3. 打开“历史事件操作”,先选少量可验证事件,确认预览和二次确认流程。
|
||||
4. 手动启动账号组,观察新消息是否优先于历史待执行任务。
|
||||
|
||||
历史批量确认会产生真实关注/私信,必须由用户自行验收和承担平台行为结果。
|
||||
Reference in New Issue
Block a user