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,85 @@
# audio_line —— 音频创作管线配置
# 复制到 agent-local/tools/ave/config/local.yaml 并填入真实 API 密钥
# 优先级: local.yaml > config.yaml > 默认值
# === 输入/输出路径 ===
paths:
work_dir: "./work/audio_line" # 临时工作目录
output_dir: "./output/audio_line" # 成品输出目录
model_cache: "./cache/models" # 模型缓存
# === 音轨分离 ===
separation:
model: "htdemucs_ft" # Demucs 模型: htdemucs | htdemucs_ft | htdemucs_6s
device: "cpu" # cpu | mps (M1/M2/M3 GPU)
shifts: 2 # 推理增强次数 (≥1), >1 提高质量但慢
overlap: 0.25 # 分帧重叠率
segments: "default" # 分帧长度 "default" | int
# === BPM/节拍检测 ===
beat:
min_bpm: 60 # 最小 BPM
max_bpm: 200 # 最大 BPM
onset_backend: "librosa" # 节拍 onset 后端
downbeat_model: "madmom" # 重拍检测模型 (madmom | librosa)
# === 节奏重塑 (Mubert API) ===
mubert:
api_key: "" # Mubert API Key
base_url: "https://api.mubert.com/v2"
default_duration: 30 # 默认生成时长(秒)
default_genre: "electronic" # 默认风格
default_bpm: 128 # 默认 BPM
max_retries: 3
timeout: 60
# === 歌词创作 (oMLX 本地 LLM) ===
lyrics:
llm_url: "http://localhost:8000/v1" # oMLX 地址
llm_model: "Qwen3-8B" # 可用模型
max_tokens: 1024
temperature: 0.8
# 提示词模板
rewrite_prompt: >
你是一位专业歌词改编者。请根据以下要求对原曲歌词进行二次创作:
主题: {topic}
风格: {style}
保留原曲的段落结构(Intro/Verse/Chorus/Bridge/Outro)和押韵模式。
输出格式: 每段以[Intro][Verse][Chorus]标记开头。
lyric_analysis_prompt: >
分析以下歌词的段落结构、押韵模式和情感走向。
输出 JSON 格式。
# === 旋律编曲 (Suno API) ===
suno:
api_key: "" # Suno API Key
base_url: "https://api.suno.ai/v1"
default_duration: 30 # 默认生成时长
model: "suno-v4" # Suno 模型版本
max_retries: 2
timeout: 120
# === 混音母带 ===
mixing:
target_loudness: -14.0 # LUFS 目标响度 (Spotify: -14, YouTube: -14, Apple: -16)
headroom: 1.0 # 峰值头上空间 (dB)
sample_rate: 44100 # 输出采样率
bit_depth: 16 # 输出位深
eq_preset: "default" # EQ 预设
compressor_threshold: -20 # 压缩器阈值 (dB)
compressor_ratio: 3.0 # 压缩比
compressor_attack: 5 # 启动时间 (ms)
compressor_release: 100 # 释放时间 (ms)
# === 对齐 ===
alignment:
time_tolerance: 0.1 # 时间对准容差 (秒)
crossfade: 0.05 # 交叉淡入淡出时长 (秒)
stretch_method: "phase_vocoder" # 时间伸缩方法: phase_vocoder | wsola | rubberband
# === 输出 ===
export:
formats: ["wav", "mp3"] # 默认导出格式
mp3_bitrate: "320k" # MP3 比特率
include_stems: true # 是否同时导出分轨
stem_labels: ["vocals", "drums", "bass", "other", "full_mix"]