dytl 是一个基于 Rust 的多平台直播工具箱,当前支持抖音、快手和 Twitter/X,主要用于直播间信息获取、用户信息抓取、开播监控与自动录制。
免责声明:本项目仅供学习与个人归档使用。请遵守各平台服务条款与当地法律法规;请勿将 Cookie、账号凭证提交到公开仓库。
src/
├── main.rs # 进程入口
├── cli/ # 命令行解析与子命令
├── config/ # YAML 配置加载与校验
│ ├── platform.rs # 平台枚举
│ ├── model.rs # 运行时配置类型
│ └── load.rs # 解析与规范化
├── core/ # 错误、日志、路径、时间、信号、JSON 工具
├── media/ # 录制 / 播放 / 救援封装
│ ├── ffmpeg/ # ffmpeg/ffplay/hls 实现
│ ├── live_stream.rs
│ └── rescue.rs
├── monitor/ # 统一开播监控与录制子进程生命周期
└── platform/ # 抖音 / 快手 / Twitter 客户端(经 amagi)
依赖方向(上层可依赖下层,反向禁止):
cli → config | monitor | media | platform | core
monitor → config | media | platform | core
media → config | core
platform → core
config → core
- 抖音:
live获取直播间信息、录制直播、使用ffplay预览播放 - 抖音:
user获取用户主页数据和视频列表 - 抖音:
rescue手动修复异常中断后遗留的 TS 分片并封装 MP4 - 快手:
live获取直播间信息、录制直播、使用ffplay预览播放 - 快手:
user获取用户主页数据和作品列表 - Twitter/X:
live获取直播信息、默认解析最高画质 HLS、录制直播、使用ffplay预览播放 - Twitter/X:
download下载已结束且可回放的 broadcast,默认解析最高画质 HLS - Twitter/X:
user获取用户主页数据 - 统一监控:
轮询
config.yaml中的监控目标,开播后自动拉起独立录制子进程
- Rust 工具链
cargoffmpeg- 可选:
ffplay,用于本地预览播放 - 外部依赖:
amagi命令行工具,项目通过它获取抖音/快手/Twitter 接口数据 - 外部依赖:
curl,用于解析 Twitter/X HLS master 中的最高画质 variant
- 默认读取当前工作目录下的
config.yaml - 也可以通过全局参数
--config /abs/path/config.yaml显式指定配置文件 - 可参考 config.example.yaml
- 如果要使用抖音能力,必须配置
douyin.cookies - 如果要使用快手能力,必须配置
kuaishou.cookies - 如果要使用 Twitter/X 能力,必须配置
twitter.cookies,公开直播通常可留空 - 如果要使用统一监控,必须配置
monitor.targets - 可选配置
logging.success_log_path/logging.failure_log_path用于持久记录关键成功和失败事件 - 可选配置
time.utc_offset_hours用于控制终端日志和录制文件名中的时间偏移
cargo run -- monitor如果配置文件不在当前目录:
cargo run -- --config /home/app/dytl/config.yaml monitorcargo build --release编译后的二进制默认位于:
- 调试版:
target/debug/dytl - 发布版:
target/release/dytl
推送符合 v* 的 tag 会触发 .github/workflows/release.yml,多平台交叉编译并上传到 GitHub Release(流程对齐 amagi-rs):
git tag v1.0.0
git push origin v1.0.0产物示例:
| 文件 | 平台 |
|---|---|
dytl-x86_64-unknown-linux-gnu.tar.gz |
Linux x86_64 (glibc) |
dytl-aarch64-unknown-linux-gnu.tar.gz |
Linux aarch64 (glibc) |
dytl-x86_64-unknown-linux-musl.tar.gz |
Linux x86_64 (musl,适合 Alpine) |
dytl-aarch64-unknown-linux-musl.tar.gz |
Linux aarch64 (musl) |
dytl-x86_64-apple-darwin.tar.gz |
macOS Intel |
dytl-aarch64-apple-darwin.tar.gz |
macOS Apple Silicon |
dytl-x86_64-pc-windows-msvc.zip |
Windows x86_64 |
SHA256SUMS.txt |
校验和 |
也可在 Actions 里用 workflow_dispatch 手动触发;若填写已有 tag,会基于该 tag 打包并发布。
监控配置采用统一格式:
logging:
success_log_path: ./content/logs/success.log
failure_log_path: ./content/logs/failure.log
time:
utc_offset_hours: 8
monitor:
poll_interval_sec: 60
restart_interval_hours: 6
auto_rescue:
enabled: true
on_startup: true
interval_minutes: 10
min_age_minutes: 5
targets:
- platform: douyin
account: "test_douyin_sec_uid"
alias: "测试抖音账号"
enabled: true
- platform: kuaishou
account: "test_ks_account"
alias: "测试快手账号"
enabled: false
- platform: twitter
account: "test_screen_user"
alias: "测试推特账号"
enabled: false字段说明:
platform可选值:douyin、dy、kuaishou、ks、twitter、xaccount当platform=douyin时填写sec_uid当platform=kuaishou时填写principal_id当platform=twitter时填写screen_name(不带@)alias可选,自定义显示名称enabled可选,true/false默认值为true设为false时保留在配置中,但不会参与监控poll_interval_sec监控轮询间隔,单位秒 建议不低于30restart_interval_hours定时重启间隔,单位小时 适合长期运行时配合服务模式使用auto_rescue自动巡航封装异常中断遗留的temp_record_*分片目录min_age_minutes用于跳过仍可能正在写入的录制目录success_log_path可选,关键成功事件日志路径,例如用户数据保存、录制封装完成failure_log_path可选,关键失败/告警事件日志路径,例如封装失败、缓存清理失败utc_offset_hours可选,终端日志时间和录制文件名时间使用的 UTC 偏移,范围-23到23
dytl monitordytl --config /home/app/dytl/config.yaml monitor作用:
- 按
config.yaml中的monitor.targets统一监控账号 - 检测到开播后自动启动录制
- 默认按分片录制,结束后自动封装为 MP4
- 服务启动和运行中会自动巡航封装异常中断遗留的
temp_record_*分片目录
dytl douyin live <url 或 web_rid>
dytl douyin live <url 或 web_rid> -r
dytl douyin live <url 或 web_rid> -p
dytl douyin user <sec_uid 或 url> --videos
dytl douyin rescue
dytl rescuedytl kuaishou live <principal_id 或 url>
dytl kuaishou live <principal_id 或 url> -r
dytl kuaishou live <principal_id 或 url> -p
dytl kuaishou user <principal_id 或 url> --works
dytl kuaishou rescuedytl twitter live <broadcast_url/broadcast_id/screen_name/url>
dytl twitter live <broadcast_url/broadcast_id/screen_name/url> -r
dytl twitter live <broadcast_url/broadcast_id/screen_name/url> -p
dytl twitter download <broadcast_url/broadcast_id>
dytl twitter download <broadcast_url/broadcast_id> --jobs 8
dytl twitter download <broadcast_url/broadcast_id> -o ./content/twitter/download/replay.mp4
dytl twitter user <screen_name 或 url>
dytl twitter rescueTwitter/X 直播录制和回放下载默认都会解析 HLS master,并选择分辨率最高、同分辨率下码率最高的 variant。
download 只面向已结束且平台标记为可回放的 broadcast;仍在直播中的目标请使用 twitter live -r。
回放下载默认会读取机器可用并行度,并使用其一半作为分片下载并发;可通过 --jobs N 手动指定。
项目默认输出到 content/:
- 抖音直播录制:
content/douyin/live/ - 快手直播录制:
content/kuaishou/live/ - Twitter/X 直播录制:
content/twitter/live/ - Twitter/X 回放下载:
content/twitter/download/ - 抖音用户数据:
content/douyin/user/ - 快手用户数据:
content/kuaishou/user/ - Twitter/X 用户数据:
content/twitter/user/ - 统一监控停止标记:
content/monitor/
录制过程会先生成临时 TS 分片目录,再在结束后自动封装成 MP4。
如果服务异常中断遗留了 temp_record_* 目录,监控模式会按 monitor.auto_rescue
配置自动巡航封装;也可以手动执行 dytl rescue。
当前录制文件命名格式为:
record_<Unix毫秒时间戳>_<系统时间到秒>_<直播间>.mp4
如果配置了 time.utc_offset_hours,文件名中的日期时间按该偏移计算。
例如:
record_1000000000001_2026-05-12_16-31-45_test_room_id.mp4
长期运行可把 dytl monitor 交给 systemd(或其它进程管理)托管。启动命令示例:
dytl --config /abs/path/config.yaml monitor- 监控功能依赖平台接口可访问;需要 Cookie 的平台在 Cookie 失效后需要手动更新
config.yaml ffplay只影响预览播放,不影响录制rescue处理各平台content/<platform>/live/下符合命名规则的临时录制目录- 如果要长期运行,优先用进程管理器托管
dytl monitor,而不是手工常驻终端