feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
移植自 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:
@@ -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"]
|
||||
Reference in New Issue
Block a user