Files
douyin-pc/docs/2026-09-05-23-41-unread-boundary-mark-readed.md
T
2026-09-06 01:00:17 +08:00

3.2 KiB
Raw Blame History

未读边界与精确标记已读限制

用户确认

  1. --unread 应在当前页发现已读(has_read=true)后停止请求后续页,保留该页所有未读,而不是遇到未读停止。
  2. 标记操作只允许影响本次获取的数据,不允许可能扩大到整个通知分组的操作。

已完成

src/get_notifications.py 的 --unread 将边界条件传入 collect_notifications。当前页处理完成后,出现布尔 true 则结束;布尔 false 的通知进入最终列表。未出现已读时继续,仍受 --pages、has_more、有效游标限制。未知已读状态不充当边界。stop_reason 新增 read_boundary。普通多页抓取行为不变。

遇到第一页全已读时只请求一页,返回空未读列表。混合页保留所有未读,不假定页内严格按已读状态排序。该策略遵从用户边界要求,不保证读取到历史中不连续的未读通知。

--mark-readed 当前状态:受阻,未完成远端标记

参数已经接入,但精确标记接口尚未确认。使用时先正常获取并原子保存,再输出明确错误、退出码 2;文件 mark_read_status=blocked_unverified_endpoint。不发送标记请求、不修改本地 has_read 冒充远端成功。未传参数时为 not_requested。

这一行为是安全失败占位,不是可用的标记已读功能。即使列表为空,显式要求该未支持功能也报错,避免让调用方误认接口已实现。

只读调研证据

通过 browser-harness 检查现有登录页面加载的网页脚本,未点击通知面板,未发送 is_mark_read=1

  • client-entry~3.5f79a59b.js,模块 702705 的列表调用:GET /aweme/v1/web/notice/,默认 is_new_notice=1、is_mark_read=1。
  • 同模块包含 /notice/count/、/notice/detail/、/notice/digg/list/ 和 /notice/del/。
  • notice/del/ 的 notice_id_str 与 action_type 属于删除调用,不可据此推断标记已读。
  • client-entry~2baf5df4.4c8adae5.js 调用 notice/detail/id_list 中携带 notice_id_str、type,用于详情读取;没有证据表明是精确标记接口。
  • 15347.ee40c89f.js 中的 BatchMarkConversationReadRequestBody 属于私信会话,不等同互动通知,未复用。
  • 未发现可证明仅标记指定通知 ID 的调用;列表 is_mark_read=1 是否影响整个分组尚未确认。当前已加载代码搜索不能证明服务端不存在精确接口。

后续需有明确按 ID 标记接口或能验证影响范围的证据,才能实现远端标记;不能以批量分组标记替代用户要求。

运行与验证

依赖与安装方法不变,参考 2026-09-05-23-15-current-user-notifications.md,无新增包。

python3 src/get_notifications.py --unread --pages 10
# 当前会保存数据后返回退出码 2,不会标记已读
python3 src/get_notifications.py --unread --mark-readed --output src/notifications-unread.json
python3 src/test_notifications.py

离线检查通过:混合页停止且保留未读、纯已读页停止、纯未读页继续至已读边界、不带参数保持多页行为、mark-readed 保存后非零退出且状态明确。没有执行真实账号标记,没有重新写入现有通知数据文件。本说明取代此前“全已读仍继续翻页”的 --unread 语义。