工具简介
get-danmu 是一款轻量级但功能强大的弹幕处理工具,主要特点包括:
多平台适配
支持腾讯视频、爱奇艺、优酷、B站和芒果TV五大主流视频平台的弹幕获取。
灵活存储
支持本地文件存储(CSV/XML)和SQLite数据库管理,满足不同场景需求。
弹幕服务
搭建兼容dandanplay接口的本地弹幕服务器,无缝对接私人影视库工具。
可编程调用
提供API接口,可轻松集成到其他Python项目中,扩展功能无限可能。
支持平台
已适配5大主流视频平台,覆盖大部分影视内容场景:
环境要求与安装
环境要求
- 运行环境:Python 3.7 及以上版本
- 硬件条件: 注意不同架构系统的第三方包兼容情况
安装方式
一键安装(推荐)
pip install get-danmu
新版本会优先分发到Python第三方包管理器仓库上,有闲时间会更新GitHub仓库代码。
源码安装
# 下载仓库后安装依赖
pip install -r requirements.txt
# 安装工具
pip install .
核心功能使用指南
1 弹幕获取与本地保存
直接获取指定视频的弹幕,保存到当前目录或自定义路径,支持时间范围筛选与格式指定。
基础命令
# 方式1:直接指定视频URL
get-danmu [视频URL]
# 方式2:交互式输入视频URL(执行后按提示输入) #推荐
get-danmu
# 简写:可用 get-dm 替代 get-danmu
get-dm [视频URL]
可选参数说明
| 参数 | 格式要求 | 功能描述 |
|---|---|---|
| --start 时间 | 分钟:秒(如 5:30)或 分钟.秒(如 5.5) | 指定弹幕获取的开始时间(仅获取该时间点之后的弹幕) |
| --end 时间 | 同 --start | 指定弹幕获取的结束时间(仅获取该时间点之前的弹幕) |
| --cookie [文件路径] | 本地Cookie文本文件路径(如 ./cookie.txt) | 导入平台Cookie,用于获取完整弹幕(优酷必传,B站建议传) |
| --resettime / -R | 无额外参数 | 弹幕时间校正(需先指定 --start):消除视频片头导致的弹幕时间偏移 |
| --savepath [路径] / -s [路径] | 本地文件夹路径(如 ./danmu_files) | 指定弹幕文件的保存目录(默认保存在当前运行目录) |
| --type [格式] | 可选 xml /csv(默认 csv) | 指定弹幕文件的存储格式(csv读取速度更快) |
| -S | 无额外参数 | 将弹幕同时存入本地数据库(需先通过 --db 指定数据库路径) |
示例
# 1. 获取B站视频弹幕,指定Cookie,保存为csv格式到 ./my_danmu 目录
get-danmu https://www.bilibili.com/bangumi/play/ep1633643?spm_id_from=333.337.0.0 --cookie ./bilibili_cookie.txt --savepath ./my_danmu --type csv
# 2. 获取腾讯视频弹幕,仅获取3分20秒到20分的弹幕
get-danmu https://v.qq.com/x/cover/mcv8hkc8zk8lnov/j4100jwv4qo.html --start 3:20 --end 20:00
2 本地数据库配置
使用SQLite本地文件数据库管理弹幕数据,弹幕文件会自动存储到数据库目录下的danmu_data子目录(首次指定路径时自动创建)。
命令格式
# 指定数据库存储路径(首次使用需执行,后续可直接调用其他功能)
get-danmu --db [数据库路径]
# 示例:将数据库保存在 E:\danmu_database 目录
get-danmu --db E:\danmu_database
3 数据库弹幕管理
对已存入数据库的弹幕进行二次筛选(如调整时间范围)或更新,参数与「弹幕获取」功能一致。
命令格式
get-danmu --data
支持参数
--start、--end、--cookie、--resettime / -R(参数说明同「1. 弹幕获取与本地保存」)
示例
# 更新数据库中某视频的弹幕,校正时间(从2分钟开始的弹幕修正为0起点)
get-danmu --data --start 2:00 --resettime --cookie ./bilibili_cookie.txt
4 代理配置
支持通过代理获取弹幕(适用于网络环境限制场景),可快速配置或清除代理。
命令格式
# 1. 配置代理(示例:使用本地8080端口的HTTP代理)
get-danmu --proxy http://localhost:8080
# 2. 清除已配置的代理
get-danmu --proxy
5 清除所有配置
一键清空工具的所有本地配置(包括数据库路径、代理设置等),恢复初始状态。
命令格式
get-danmu --clear
6 弹幕服务搭建(核心功能)
搭建与「api.dandanplay.net」兼容的弹幕服务器,解决私人影视库(电影/电视剧)的弹幕需求。
核心优势
- 兼容性:接口设计与api.dandanplay.net完全一致,可直接对接依赖该接口的影视库工具(如Jellyfin、Emby等),已测试完美适配Hills、Yamby。
- 性能:处理1万条以内弹幕耗时≈0.1秒,10-15万条热门电影弹幕耗时≈0.5秒。
- 灵活性:支持通过--data手动更新数据库弹幕,弥补无法自动更新的不足。
命令格式
第一次搭建
- 需要先指定数据库存储位置
# 指定数据库存储路径(首次使用需执行,后续可直接调用其他功能)
get-danmu --db [数据库路径]
# 示例:将数据库保存在 E:\danmu_database 目录
get-danmu --db E:\danmu_database
- 获取弹幕并存储到数据库中需要指定
-S参数
# 获取腾讯视频弹幕并存储到数据库中
get-danmu https://v.qq.com/x/cover/mcv8hkc8zk8lnov/j4100jwv4qo.html -S
- 开启服务器
# 启动服务器(默认端口80)
get-danmu --runserver
# 自定义端口(示例:使用8088端口启动服务)
get-danmu --runserver 8088
后续再添加弹幕时无需再指定数据库存放位置,可直接运行服务器,服务器没有提供web管理,只提供了本地的交互式管理get-danmu --data
添加API
现在就可以在Hills和Yamby上添加弹幕api地址了,直接添加你运行服务器的ip即可,例如你服务器ip为192.168.1.3,使用的默认端口80,那么直接添加http://192.168.1.3即可享用弹幕服务器了。
操作说明
- 退出服务器:按下Ctrl + C即可终止服务
- 服务验证:启动后可通过http://127.0.0.1:[端口]访问(或本机ip访问)
安全提示
- 禁止在生产环境或公网部署:代码未经过安全审查,无日志系统,无法抵御网络攻击
- 仅限本地私人使用:建议在家庭局域网内搭建,避免暴露公网
7 配置备份弹幕服务器
配置备份弹幕服务器可以补充本地弹幕不足,优先返回本地弹幕,本地没有的弹幕会重定向到备份服务器。
命令格式
get-danmu --redirect http://[danmu_api服务器ip或域名]:9321/密钥
# 示例
get-danmu --redirect http://1.1.1.1:9321/getdanmu
# 清除配置
get-danmu --redirect
在你的代码中调用
本库可以在你的代码中导入运行,一共提供了五个运行接口。
导入解析核心
from get_danmu.api.danmu_tx import TencentFetcher
from get_danmu.api.danmu_iqiyi import IqiyiFetcher
from get_danmu.api.danmu_mgtv import MgtvFetcher
from get_danmu.api.danmu_bilibili import BilibiliFetcher
from get_danmu.api.danmu_youku import YoukuFetcher
初始化
tx=TencentFetcher(url=url,proxy=proxies)
iqiyi=IqiyiFetcher(url=url,proxy=proxies)
mgtv=MgtvFetcher(url=url,proxy=proxies)
url为视频链接
proxies为代理配置,类型应为字典类型,示例如下
{
'http': 'http://127.0.0.1:7890'
}
需要cookie的接口初始化
yk=YoukuFetcher(url=url,proxy=proxies,cookie=cookies)
bili=BilibiliFetcher(url=url,proxy=proxies,cookie=cookies)
url为视频链接
proxies为代理配置,类型应为字典类型,例子同上
cookies为请求头cookie对于yk接口来说涉及加密为必要参数,类型为字符串而不是字典类型
run获取视频弹幕
danmu_data,duration,title=tx.run(
start_second=self.start_second,
end_second=self.end_second,
progress_callback=update_progress
)
各个接口都有run方法,所传递的参数都一致
start_second为开始时间,即从哪一秒开始,单位秒,类型为int,可以省略为None,默认为从第0秒开始
end_second为结束时间,即从哪一秒结束,单位秒,类型为int,可以省略为None,默认为从剧集最后一秒结束
progress_callback回调函数,会返回当前进度current和总任务个数total,自己计算一下就有进度的百分比了,可以省略为None
该方法会返回三个数据,第一个为danmu_data,duration,title,数据如下
danmu_data=[{
"time_offset": time_offset, #float or int 弹幕出现时间
"mode": mode, #int 类型,一共三种,1-普通弹幕,4-底部弹幕,5-顶部弹幕
"font_size": 25, #int 字体大小
"color": color, #int 32位字体颜色
"timestamp": time, #datetime 弹幕发送时间,如果该平台未提供则会使用现在的时间填充
"content": content #str 弹幕内容
}]
duration=10 #int 单位为秒
title='' #str 该剧集的标题
关于自带的弹幕服务器的API
1. 文件名匹配接口
测试中使用该接口的媒体播放客户端有Hills
POST /api/v2/match
接口说明
此接口用于当用户打开某视频文件时,可以通过文件名称、Hash等信息查找此视频可能对应的节目信息。
此接口首先会使用Hash信息进行搜寻,如果有相应的记录,会返回“精确关联”的结果(即isMatched属性为true,此时列表中只包含一个搜索结果)。
如果Hash信息匹配失败,则会继续通过文件名进行模糊搜寻。
返回值说明
一个包含节目信息的列表,节目在列表中排名越靠前,这个节目越有可能是视频文件的内容。当列表中只有一个节目时(isMatched属性为true),视为“精确关联”——说明此视频已被人工关联了某一节目。客户端应自动选择这个唯一的结果,不必再让用户做出选择。
请求体
{
"fileName": "string",
"fileHash": "string",
"fileSize": 0,
"videoDuration": 0,
"matchMode": "hashAndFileName"
}
其中以fileName参数最为重要,本工具就是使用fileName参数进行匹配的。
返回数据
{
"errorCode": 0,
"success": true,
"errorMessage": "string",
"isMatched": true,
"matches": [
{
"episodeId": 0,
"animeId": 0,
"animeTitle": "string",
"episodeTitle": "string",
"type": "tvseries",
"typeDescription": "string",
"shift": 0,
"imageUrl": "string"
}
]
}
2. 搜索接口
对于打开视频直接使用搜索接口进行查询的媒体客户端有Yamby
GET /api/v2/search/anime?keyword=
接口说明
根据用户提供的关键词,在数据库中搜索对应的作品信息,搜索结果中不包含剧集信息。
关键词说明
关键词长度至少为2。关键词中的空格将被认定为%匹配,其他字符将被作为原始字符去搜索。
请求方式
get,在url中传递keyword或请求体中传递keyword即可。
返回数据
{
"errorCode": 0,
"success": true,
"errorMessage": "string",
"animes": [
{
"animeId": 0,
"bangumiId": "string",
"animeTitle": "string",
"type": "tvseries",
"typeDescription": "string",
"imageUrl": "string",
"startDate": "2025-10-31T14:22:44.592Z",
"episodeCount": 0,
"rating": 0,
"isFavorited": true
}
]
}
3. 剧集搜索接口
此接口用于获取指定编号的作品的详细数据,包括简介、评分、详细剧集等。
GET /api/v2/bangumi/bangumiId
参数说明
bangumiId:支持传入数字形式的 animeId(如 18319)或字符串形式的 bangumiId(如 "tmdb-movie-21832")。
请求方式
get,在url中传递bangumiId即可。
返回数据
{
"errorCode": 0,
"success": true,
"errorMessage": "error",
"bangumi": {
"episodes": [
{
"seasonId": "string",
"episodeId": 0,
"episodeTitle": "string",
"episodeNumber": "string",
"lastWatched": "2025-10-31T14:27:24.947Z",
}
]
}
}
4. 弹幕获取接口
此接口用于获取本工具数据库中记载的指定弹幕库的弹幕数据
GET /api/v2/comment/episodeId
参数说明
episodeId:只支持传入数字形式的 episodeId,episodeId的值可参考第三步的剧集搜索的结果也可参考第一步的搜索结果。
请求方式
get,在url中传递episodeId即可。
返回数据
{
"count": 0,
"comments": [
{
"cid": 0,
"p": "string",
"m": "string"
}
]
}
返回值说明
字段p的说明:格式为出现时间,模式,颜色,用户ID,各个值之间使用英文逗号分隔
- 弹幕出现时间:格式为 0.00,单位为秒,精确到小数点后两位,例如12.34、445.6、789.01
- 弹幕模式:1-普通弹幕,4-底部弹幕,5-顶部弹幕
- 颜色:32位整数表示的颜色,算法为 Rx256x256+Gx256+B,R/G/B的范围应是0-255
- 用户ID:字符串形式表示的用户ID,通常为数字,不会包含特殊字符
更新记录
2025-11-16: 发布 v0.3.8版本
修复获取iqiyi弹幕时可能出现某5分钟弹幕无法解析返回空弹幕的情况,删除xmltodict第三方库依赖,增加第三方库lxml的依赖做解析
2025-11-14: 发布 v0.3.6版本
修复Yamby获取大于一季时无法直接匹配弹幕的问题,修正调试信息,继续完善帮助文档
2025-10-31: 发布 v0.3.5版本
修复获取电影剧集时报错无法返回数据的bug,修复带有空格的剧名可能无法正确找到最佳匹配条目的bug
2025-10-12:发布 v0.3.2 版本
修正api更新处理逻辑,修正web服务返回数据的标准化使得更多的平台支持
2025-10-11:发布 v0.2.0 版本
修正core处理逻辑
2025-10-10:发布 v0.0.1 版本(初代版本)
完成核心功能
开源声明
- 本工具仅用于个人学习与研究,禁止任何商业用途(包括但不限于盈利性服务、企业内部使用等)
- 工具所使用的接口均来源于公开网络,若涉及第三方平台(如腾讯视频、B站等)权益,请联系维护者删除相关代码
- 如因违规使用(如商业用途、侵权、违反平台规则等)产生法律纠纷,均由使用者自行承担,与工具维护者无关
- 若发现侵权或违规使用情况,请通过维护者邮箱联系,会在3个工作日内处理
- 除去上述要求外,还需遵守本项目的开源协议
致谢
- 核心弹幕解析接口-优酷接口思路来源于 DanmuTools
- 弹幕数据标准化采用dandanplay
项目信息
- 项目创建者:李先生
- 项目维护者:李先生
- 维护者邮箱:3101978435@qq.com
- 开源目的:提供私人影视库弹幕解决方案,促进Python命令行工具开发技术的学习与交流