feat(video-analysis): 抖音免浏览器解析链路 + 快手支持 + 小红书加固 + 发送防重复
- 抖音(2026-10-13):删除 SSR + playwright 旧链路(douyin_ssr.py 移除, douyin_api.py 精简为下载工具),新增 douyin_web.py(x-tt-argus 网关头 + web detail 接口 + 最高码率梯/多 CDN 回退下载)与 douyin_sign.py (纯 Python a_bogus 签名,vendor 自 f2(Apache-2.0),依赖 gmssl SM3); 实测 10/10 成功率、单作品 <1s(旧浏览器链路 5-15s 且随机撞验证码) - 快手(2026-10-08):kuaishou_content.py 分享页 INIT_STATE 静态解析(无登录态), 清晰度梯最佳档 + 图集 URL 组装,入口/策略/Web 面板同步接入 - 小红书:按链接来源定国际/国内站优先序、视频 backupUrls 逐候选回退、 图片 urlDefault→infoList WB_DFT→url 三档回退 - 长视频防重复发送(2026-10-13):媒体发送带 per-call _timeout(默认 300s), 超时=结果未知不再降级重试;auto/active 两条 handler 互斥 - Web 解析封面抽帧 ffmpeg 加 CREATE_NO_WINDOW(pythonw 下不再弹 cmd 黑窗) - 依赖:+gmssl;测试:新增 test_douyin_web / test_kuaishou_parse / test_video_cleanup, 扩充 test_video_policy / test_video_sender_link / test_video_group_file / test_video_media_naming Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
1 parent
a31aab00e8
commit
a789a44f5d
25 files changed
+3536
-895
No files matched your search
@@ -6,6 +6,7 @@ get_temp_root 的返回值,测试里 monkeypatch 成临时目录。
|
||||
"""
|
||||
|
||||
import importlib.util
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
@@ -127,11 +128,31 @@ def test_work_stem_strips_hashtags_and_spaces(u):
|
||||
|
||||
|
||||
def test_work_stem_empty_falls_back(u):
|
||||
"""没给来源时保持旧契约(固定 `作品`)"""
|
||||
assert u.build_work_stem("") == "作品"
|
||||
assert u.build_work_stem(None) == "作品"
|
||||
assert u.build_work_stem("🎬") == "作品"
|
||||
|
||||
|
||||
def test_work_stem_empty_uses_source_code(u):
|
||||
"""给了来源 → 空标题兜底成 `作品_{来源短码}`:同作品稳定、不同作品不撞
|
||||
|
||||
固定 `作品` 会让同一作者的多个无名作品挤在一个名字下,靠 4 位**时间**短码
|
||||
区分,每次重解析名字都变(S3 key / 群文件成员名不可复现)。
|
||||
"""
|
||||
url = "https://www.douyin.com/video/7412345678901234567"
|
||||
stem = u.build_work_stem("#话题", source=url)
|
||||
assert stem == f"作品_{u.short_source_code(url)}"
|
||||
assert re.fullmatch(r"作品_[0-9a-z]{4}", stem)
|
||||
assert stem == u.build_work_stem("", source=url) # 同来源稳定
|
||||
assert stem != u.build_work_stem("", source=url + "8") # 不同来源不同码
|
||||
|
||||
|
||||
def test_work_stem_source_ignored_when_title_present(u):
|
||||
"""有标题时来源短码不参与(标题本身已有区分度,别把名字改花)"""
|
||||
assert u.build_work_stem("旅行 #随手拍", source="whatever") == "旅行"
|
||||
|
||||
|
||||
def test_work_stem_truncates(u):
|
||||
assert len(u.build_work_stem("标题" * 20)) <= 15
|
||||
|
||||
|
||||
Reference in new issue
Block a user