feat: finish Douyin production readiness flow

This commit is contained in:
2026-09-15 09:20:51 +08:00
parent 5867aac20f
commit 977e541fef
28 changed files with 1257 additions and 118 deletions
+22
View File
@@ -75,6 +75,10 @@ curl --fail --silent --show-error \
--retry 30 --retry-delay 2 --retry-connrefused \
--output /dev/null "http://127.0.0.1:${CREATORHUB_PORT}/healthz"
curl --fail --silent --show-error \
--retry 30 --retry-delay 2 --retry-connrefused \
--output /dev/null "http://127.0.0.1:${CREATORHUB_PORT}/readyz"
curl --fail --silent --show-error \
--retry 30 --retry-delay 2 --retry-connrefused \
--user "${CONTROL_PLANE_USERNAME}:${CONTROL_PLANE_PASSWORD}" \
@@ -287,10 +291,28 @@ Compose 部署时通常只需设置以下宿主机变量:
| `docker-gateway` | `DOCKER_SOCKET` | 默认值和 Compose 挂载均固定为 `/var/run/docker.sock`;不能只覆盖环境变量 |
| `docker-gateway` | `BROWSER_NETWORK` | `creatorhub_browser` |
| `docker-gateway` | `GATEWAY_TOKEN` | 与平台注册值一致,长度 ≥16;`/v1` 全部接口校验 Bearer 令牌 |
| `docker-gateway` | `BROWSER_CDP_URL` | 空;仅本地联调时连接外部 CDP,例如 `http://host.docker.internal:9222` |
| `docker-gateway` | `BROWSER_CDP_TARGET_ID` | 空;外部 CDP 多页面时必须指定抖音页面 ID |
| `docker-gateway` | `LOG_LEVEL` | 默认 `info` |
不要把凭据写入仓库或 Compose 文件。
### 本地 9222 CDP 联调
网关支持显式连接已经登录的本地 CDP,不创建或回收 Docker 浏览器。仅用于开发和真实平台链路测试,不应在生产 Compose 中设置。先从 `http://127.0.0.1:9222/json/list` 选择唯一的抖音页面 `id`,再在宿主机启动网关:
```bash
export LISTEN_ADDR=127.0.0.1:18081
export GATEWAY_TOKEN=0123456789abcdef
export BROWSER_CDP_URL=http://127.0.0.1:9222
export BROWSER_CDP_TARGET_ID=<已登录抖音页面的 target id>
export BROWSER_CDP_ALIAS=local-cdp
export BROWSER_CDP_NETWORK_ID=local-cdp
python3 -m cmd.docker_gateway.gateway
```
该模式的 generation 固定为 `binding_version=1`、`runtime_id=64 个 0`、`network_id=local-cdp`。生命周期接口明确不可用于此浏览器;身份、受限读取、事件订阅和动作接口仍要求完整 generation,并继续执行 UID 核对。`BROWSER_CDP_TARGET_ID` 必须固定到抖音页面,不能把包含多个网站的 CDP 页面列表交给自动猜测。
### P0-lite 停机通知
当前只使用 `creator-hub` 的专用 Logrus JSON logger 作为通知渠道;它固定输出警告,不继承业务 `LOG_LEVEL`。选择它是因为 Compose 已可靠收集服务日志,不需要新增外部账号、凭据、网络重试或通知依赖。仅 `policy_hold` 和 `needs_confirmation` 会产生 `operator attention required`,字段限定为 `event_type`、`reason_code`、账号/任务 ID;不会包含请求头、Secret 引用或凭据值。运维可用下列命令接入现有日志采集或人工查看:
+3 -1
View File
@@ -1556,13 +1556,15 @@ G-douyin-base(cookies/get/identity/action/events均在此对象上加各自字
| POST `/v1/browsers/{alias}/douyin/cookies` | G-douyin-base + `"cookies":[{"name":"sessionid","value":"仅在私密请求文件填入","domain":".douyin.com","path":"/"}]` | GATE-04 |
| POST `/v1/browsers/{alias}/douyin/get` | G-douyin-base + `"url":"https://www.douyin.com/aweme/v1/web/user/profile/self/?aid=6383&device_platform=webapp"` | GATE-04 |
| POST `/v1/browsers/{alias}/douyin/identity` | G-douyin-base + `"expected_account_key":"实际UID或已核实账号标识"` | AC-06、GATE-04 |
| POST `/v1/browsers/{alias}/douyin/messages` | G-douyin-base + `"expected_uid":"真实数字UID","target_uid":"真实对端UID","limit":200`;只读平台 IM 历史,必须返回 `history_source` 与 `history_has_more` | GATE-04、A6 |
| POST `/v1/browsers/{alias}/douyin/action` | G-action;confirm默认false,不得直接把预览改true绕开授权 | GATE-05、OP-07 |
| POST `/v1/browsers/{alias}/douyin/events` | G-douyin-base + `"expected_uid":"真实数字UID"` | GATE-06 |
| GET `/v1/browsers/{alias}/douyin/events` | body=G-douyin-base;query `?limit=100&wait=25`;确认 `?ack=实际delivery_id&limit=1&wait=0` | GATE-06 |
| DELETE `/v1/browsers/{alias}/douyin/events` | body=G-douyin-base | GATE-06 |
受限作品/评论读取在 G-douyin-base 中增加 url:
受限作品/评论/目标账号读取在 G-douyin-base 中增加 url:
- 目标账号:`https://www.douyin.com/aweme/v1/web/user/profile/other/?aid=6383&device_platform=webapp&user_id=实际UID`,或将 `user_id` 换成 `sec_user_id`;只允许这两个身份参数之一。
- 作品:`https://www.douyin.com/aweme/v1/web/aweme/post/?sec_user_id=实际sec_user_id&count=20&max_cursor=0`;下一页仅使用真实返回cursor。
- 一级评论:`https://www.douyin.com/aweme/v1/web/comment/list/?aweme_id=实际平台work_key&count=20&cursor=0`;下一页同理。
- 不允许其他host、额外参数、任意CDP或脚本。源码当前允许非负数字分页,不采用旧文档“只能max_cursor=0”的描述。
+25
View File
@@ -0,0 +1,25 @@
# 抖音真实链路证据(2026-09-14)
## 运行范围
- 分支:`fix/douyin-production-readiness`
- 浏览器:本机已登录 Douyin CDP,外部 gateway 显式绑定 `/jingxuan` 页面 target;未创建 Docker 浏览器。
- 接收账号 UID:`99491952055`
- 实测私信对象 UID:`2328120603967913`
## 已验证
1. 外部 CDP gateway 健康检查成功。
2. 身份读取成功:UID `99491952055`,昵称“抖盲求真”,返回 SecUID。
3. 目标账号读取成功:`/user/profile/other/` 用 `user_id=2328120603967913` 返回目标账号资料及 SecUID。
4. 私信历史读取成功:`history_source=im_sdk_pull`,会话 `0:1:99491952055:2328120603967913`,返回 6 条消息,`history_has_more=false`;其中包含文本、卡片和评价表单等非文本消息。
5. 人工私信动作先预览后确认发送成功。实测文本:`CREATORHUB-DM-LIVE-20260914-A`;平台返回成功状态及服务端消息 ID `7685455260048311865`。
6. 作品媒体下载成功:作品 `7675372156041187705` 返回 `video/mp4`,Base64 解码前长度 `1795724`。
7. 页面 reload 后立即启动监听会经历 IM SDK 未就绪重试,最终 POST 返回 HTTP 200;随后取得 `boundary_source=douyin_identity_extra_now` 的 baseline。
## 未宣称通过
- 本次发送为出站私信,未产生可用于验收“平台→后台”入站通知的事件;没有把它当作入站事件证据。
- 尚未取得可验证、跨进程重启的 Douyin durable event cursor;监听恢复只能建立新的平台时间边界,断连期间事件仍应显示为 gap,不得自动补发。
- 评论、点赞、关注、转发的真实写操作以及自动响应策略尚未逐项验收;`repost` 仍由 gateway 明确返回不可用。
- 生产部署版本、真实小号执行、AI/转写供应商和 PostgreSQL 集成尚未用本分支复验。