不改核心代码,5 步给抖音批量下载器接一个新下载模式
【免费下载链接】douyin-downloaderA practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具,去水印,支持视频、图集、合集、音乐(原声)。项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader
想让抖音批量下载器把某个博主"仅点赞视频""收藏夹内容"也按你的规则存下来,却发现配置里的mode只有 post、like、mix、music 这几个选项?直接往下载器主流程里塞逻辑,下次升级一更新就全白干。换个思路:这个项目自带"策略 + 注册表"的扩展点,新下载模式写成独立策略文件、登记进注册表就能被主流程自动调度,限速、去重、增量判断、进度上报全部白拿,核心下载链路一行不动。
为什么不用改核心代码?策略 + 注册表说了算
把这个抖音下载器想成一列火车:下载器主流程是车头,负责进站、点火、到站报数;每种下载模式是一节车厢,靠统一的 coupler 接口(耦合器,即接口约定)挂上就能被拖着跑。车头从不关心后面挂的是"作品车厢"还是"音乐车厢",它只认接口。
这套机制由三块零件咬合:
- 策略基类:core/user_modes/base_strategy.py 里的
BaseUserModeStrategy,定义了每节车厢必须长成的形状——声明mode_name(模式名)、api_method_name(用哪个接口取数),实现collect_items(把内容抓成统一的作品列表); - 注册表:core/user_mode_registry.py 里的
UserModeRegistry,一张"模式名 → 策略类"的目录表,出厂预置 post / like / mix / music / collect / collectmix 六节车厢,并留了公开的register方法给你挂新车厢; - 调度方:
UserDownloader读 YAML 配置里的mode列表,逐个到注册表查策略、实例化、执行,全程不关心策略内部。
YAML 配置(mode: [post, like, ...]) ↓ UserDownloader 按配置取模式 ↓ UserModeRegistry 查表 → 策略类 ↓ 策略.collect_items() 收集作品 ↓ 下载器公共流水线:去重 → 限速 → 增量判断 → 并发下载 → 结果汇总💡 划重点:最妙的是箭头最后一段。只要你的策略返回的作品列表是标准结构,跨模式去重、限速(rate_limit)、增量下载(increase)、失败重试就自动生效——这些能力长在车头里,不在车厢里。
如何 5 步接上你的第一个下载模式?
下面以新增一个comment模式(按"评论区热度"筛选下载)为例,5 步走完。
步骤 1|通读基类契约
打开 core/user_modes/ 下任意一个现有策略(比如post_strategy.py)对照基类,确认要实现的两个点:collect_items返回作品列表,apply_filters可以按需追加筛选。效果:心里有谱,不用碰download_mode主方法。
class BaseUserModeStrategy(ABC): mode_name = "" api_method_name = "" async def collect_items(self, sec_uid, user_info): return await self._collect_paged_aweme(sec_uid, user_info)步骤 2|新建策略文件
在core/user_modes/下新建comment_strategy.py,继承基类,声明模式名与取数方法名,覆盖collect_items返回标准作品列表。效果:一节新车厢造好,接口形状和老车厢完全一致。
class CommentUserModeStrategy(BaseUserModeStrategy): mode_name = "comment" api_method_name = "get_user_comment" async def collect_items(self, sec_uid, user_info): fetcher = self.downloader.api_client.get_user_comment return [self._extract_aweme_from_item(item) for item in await fetcher(sec_uid)]⚠️ 避坑:api_method_name必须指向api_client上真实存在的方法;如果抖音接口给的是"评论→作品"的中间结构,用基类自带的_extract_aweme_from_item把它拍平成作品项,别自己造格式。
步骤 3|把模式登记进注册表
在UserModeRegistry.__init__的_registry字典里加一行映射(这是唯一的"登记动作",策略本体全在新文件里)。效果:调度方查表时能找到你的策略类。
self._registry = { ..., "comment": CommentUserModeStrategy, }步骤 4|在配置里触发新模式
复制一份config.example.yml改名为config.yml,把新 mode 加进列表并按需给数量上限。效果:mode是列表,写几个就跑几个,顺序即执行顺序。
mode: [post, comment] number: post: 0 comment: 50步骤 5|跑一遍验证
执行python run.py <用户主页链接>,盯两处:日志出现User mode started: mode=comment,下载目录按作者/模式分层的结构里多出comment子文件夹。效果:新车厢被正常拖跑,去重、限速、进度条都没掉链子。
加载失败、分页提前停、数量不生效怎么查?
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
日志Unsupported user mode | 注册表没登记,或 YAML 里的 mode 名与mode_name拼写不一致 | 对齐三处字符串:mode:、register键、mode_name |
日志API method get_xxx not implemented | api_method_name拼错,或api_client没有该方法 | 核对 core/api_client.py 方法名,缺接口就先补取数方法 |
日志cursor did not advance, stop paging | 分页游标没前进,翻页提前终止 | 检查has_more/max_cursor传参,或改用基类_collect_paged_entries非分页取数 |
number上限不生效 | 写错了配置层级,或 mode 名写错导致取不到限制值 | 确认number下的键与 mode 名一致;mode写成字符串时只跑一个模式 |
| 全部显示 skipped | 增量下载判定为已下载过(磁盘主文件还在) | 临时把对应 mode 的increase设为false强制重下 |
怎么把多个扩展点串成流水线?
一个任务里同时配置多个 mode 时,UserDownloader会依次执行并共享seen_aweme_ids,同一作品在 post 和 comment 里重复出现也只下一次。再叠上项目自带的可选扩展点,就是一条完整流水线:
用户主页 → post + like + comment 多模式顺序执行 → 跨模式去重 → 增量/重试 → comments 配置落 *_comments.json → transcript 配置做语音转写 → notifications 推 Bark / Telegram / Webhook两个零代码的现成案例:评论采集——把comments.enabled打开,每个作品自动多出一份*_comments.json,含include_replies、max_comments两个旋钮;下载完成推送——notifications.providers里加一条 webhook,下载一结束就把成功/失败统计推到手机,失败也能收到。
| 扩展方案 | 代码量 | 获得的能力 | 适用场景 |
|---|---|---|---|
| 策略 + 注册表(本文) | 一个策略文件 + 一行注册 | 新数据源,自动继承限速/去重/增量/进度 | 要按新规则抓取作品,长期复用 |
| 纯配置组合 | 零 | 只能从内置 mode 和开关里挑 | 快速出活,不改代码 |
| 外部脚本后处理 | 独立脚本 | 完全自由 | 下载完成后的二次加工(归档、转存),但拿不到下载器内部状态 |
总结与延伸方向
给这个抖音批量下载器扩下载模式的本质就三步:定契约(继承基类)、写策略(覆盖collect_items)、挂注册表(一行登记),车头永远不用改。接下来可以试试:
- 照
post_strategy.py加一个"仅置顶作品"策略,复用现成的_is_pinned_aweme判断; - 把
comment策略的筛选逻辑接到comments配置上,实现"按评论数取 Top N"; - 把
notifications的 webhook 指向自建服务,让整条下载流水线的状态进团队群。
仓库地址:https://gitcode.com/GitHub_Trending/do/douyin-downloader,clone 下来按本文 5 步走一遍即可。
【免费下载链接】douyin-downloaderA practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具,去水印,支持视频、图集、合集、音乐(原声)。项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考