feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。

**目前能用的(真环境实测,非推断)**:

    profile/other : 200, 7075 字节  —— 博主主页指标(粉丝/获赞/作品数/昵称)
    aweme/detail  : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)

**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
  1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
     带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
     同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
     挑中的恰好是「批量拉作品列表」这个最敏感的动作。
  2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
     代价,过几小时要重测)。

  所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。

**排查中控住变量后得到的两条事实**(都写进注释了):
  · `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
    UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
    (我先前猜的 sec-ch-ua 不是关键。)
  · 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
    从 CDP 取齐 cookie + UA + hints,而不是各自写死。

「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。

测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
This commit is contained in:
2026-10-10 17:12:25 +08:00
parent 21ff01b894
commit 2112c1a870
1601 changed files with 367425 additions and 0 deletions
@@ -0,0 +1,40 @@
# 角色一致性参考资料(外部学习)
来源:GitHub 开源项目(2026-10-04 抓取)
## shuohao-skills / character-refs(4095 star,Apache-2.0)
仓库:https://github.com/eternityspring/shuohao-skills
作者定位:「给任何故事里的角色真出参考图……先出一张正面全身锚点,
其余视图(大头照、90°侧面、背面、细节、45°大头照)**都只参考这张锚点**」
本目录:
- `01_skill_原文.md` —— SKILL.md(工作流 + 分档 + 冻结机制)
- `02_提示词规范_原文.md` —— **最核心**:每条都是实测失败换来的
- `03_角色卡schema_原文.md` —— 角色卡字段结构
- `04_字段拆解_原文.md` —— 一段话描述 → 分层字段的拆解规则
## 核心方法论(提炼,用于我们的实现)
1. **一组图只有一个根:正面全身锚点**;只有它是文生图,其余全是「锚点 + 一句改图指令」
2. **改图模型只听第一句** —— 派生图第一句必须是明确构图指令
(`Zoom in to an extreme close-up...` / `Rotate the camera 180 degrees around her`)
3. **正面要写几何** —— 「肩、髋、脚都正对镜头,鼻子在脸中线上,两耳一样可见」;
反向词禁 `three-quarter view` / `turned body`(不写几何,模型会画成微侧身)
4. **一致性清单要短、按视图取层** —— 大头照只写脸/头发/上装(写下装 → 镜头拉远);
细节图不列整套服装(列了 → 模型画整个人,实测 8/8 失败)
5. **不写 `character sheet` / `turnaround` / `model sheet`** —— 会让模型在一张图里画多视图
6. **写实画风**:写 `A real photograph, not a render` + 85mm f/5.6 + 真实白平衡 + 不修图不美颜 + 轻微颗粒;
**不写** `photorealistic` / 超高清 / 浅景深(会往 CG 带)
反向词压 AI 感:CGI、塑料皮肤、蜡质皮肤、娃娃脸、过度对称、HDR、过饱和、平光
7. **写光的效果,不写光源**(写 window 会把窗户画进画面)
8. **细节图露肤要带年龄**(`Any visible skin is the skin of a 16-year-old`)否则皮肤会画老
9. **模型不锁定** —— 一致性来自「同一张锚点」,不来自「同一个模型」
10. **冻结三样**:锚点 sha256 / 画风快照 / 描述指纹;变了就标「过期」,**只标记不删除**
## 用户提供的另一份资料要点
- 母版图要**摇一批候选**,挑**最有辨识度**的(不要指望观众记住"漂亮")
- **记忆点**:袖口卷到哪、发尾挑染、领子立起、左耳银钉(一致性检查的抓手)
- **纯灰 #808080** + **同一 seed** + 保存 job ID/seed
- **角色卡 5 硬字段**:脸型 / 发型发色 / 五官比例(可测量)/ 服装剪裁 / 固定配饰
—— 一旦定下,**所有提示词原样复用**("齐肩直发"→"中长发"会被当新角色)
- **分镜提示词结构**:角色字段前置占 **60%**,动作/场景/镜头后置 40%
- **防串脸**:双人镜头拆开;开 `input_fidelity`(可灵为 `image_fidelity`)