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,77 @@
# AVE v2.0 配置文件模板
# 复制到 agent-local/tools/ave/config/local.yaml 并填入真实值
# === 火山引擎 (豆包语音 2.0) ===
volcano:
api_key: "sk-xxx" # ARK → API Key 管理
app_id: "xxx" # 语音控制台 → App ID
access_token: "xxx" # 语音控制台 → Access Token
speaker_id: "xxx" # 声音复刻 → 训练后获取
tts_model: "volcano_tts_2.0"
# === 阿里云百炼 ===
aliyun:
api_key: "sk-xxx" # 百炼 → API Key
wan_model: "wan2.2-s2v"
# TTS 模型(实测可用的只有 4 个):
# cosyvoice-v3-flash ← 推荐(支持 88 个音色,含全部 _v3 后缀音色)
# cosyvoice-v3-plus (只支持 longanyang / longanhuan 两个音色)
# cosyvoice-v2 / cosyvoice-v1
# ⚠️ 音色必须与模型匹配,否则报 InvalidParameter(418);音色目录见
# 09_ave/config/cosyvoice_voices.yaml
cosyvoice_model: "cosyvoice-v3-flash"
# === Pexels ===
pexels:
api_key: "xxx" # Pexels API Dashboard
rate_limit: 200 # 请求/小时
# === 大模型 (文案解析) ===
llm:
provider: "openai" # openai | deepseek | volc
api_key: "sk-xxx"
base_url: "https://api.deepseek.com" # 或 openai/volc 地址
model: "deepseek-chat" # 或 gpt-4o / doubao-pro
# === 输出设置 ===
output:
resolution: "1080x1920" # 竖屏
fps: 30
codec: "h264"
bitrate: "8M"
# === 缓存 ===
cache:
enabled: true
max_size_gb: 10
ttl_days: 7
# === 人物置换 (person_swap, 阿里云百炼 Wan2.2-Animate-Mix 视频换人) ===
# 用途: 原视频(人物A动作+场景) + 参考图(人物B形象) → 输出「B 保留动作与场景」的新视频
# 官方模型: wan2.2-animate-mix (2026-10-02 实测校准: 接口 image2video/video-synthesis,
# 字段 input.image_url / input.video_url / parameters.mode)
person_swap:
model: "wan2.2-animate-mix" # 官方模型 id (换人; 另有 wan2.2-animate-move 图生动作)
mode: "std" # 档位: std(¥0.6/秒) | pro(增强版 ¥0.9/秒)
price_per_sec: 0.6 # 单价 元/秒 (std 官方价; pro 改 0.9)
max_duration: 10 # 单条源视频最长秒数(超长自动截取; 按模型支持范围调整)
image_max_side: 2048 # 参考图长边上限
monthly_budget: 300.0 # 月度费用护栏(元), 超预算拒绝新任务
max_retries: 2 # 生成失败自动重试次数(损耗系数 ~1.4 由预算兜底)
timeout_sec: 900 # 单次生成轮询上限(秒)
# ── 可灵 AI(Kling)──
# 用途: 定妆照/角色图 文生图、图生图(character_sheet.py provider=kling)
# 鉴权两种方式二选一(api_key 优先):
# api_key : Bearer 方式(新版/第三方发放 key,格式 api-key-kling-xxx)
# access_key + secret_key : 官方 AK/SK(JWT HS256 签名)
# ⚠️ 真实密钥放 agent-local/tools/ave/config/local.yaml(不同步、不进 git),此处仅占位
# 接口: POST {base_url}/v1/images/generations(异步任务)→ GET .../{task_id} 查询
kling:
api_key: "" # Bearer key(优先)
access_key: "" # 官方 AK(回退 JWT 方式)
secret_key: "" # 官方 SK(回退 JWT 方式)
base_url: "https://api-beijing.klingai.com"
default_model: "kling-v1" # 文生图模型
poll_interval: 5 # 任务轮询间隔(秒)
timeout_sec: 300 # 单任务轮询上限(秒)