get-danmu:多平台弹幕获取与服务工具

一款基于 Python 开发的命令行工具,专注于弹幕获取、本地存储与服务搭建,支持腾讯、爱奇艺、优酷、B站、芒果平台,可满足私人影视库的弹幕需求。

开始使用 查看PyPI

工具简介

get-danmu 是一款轻量级但功能强大的弹幕处理工具,主要特点包括:

多平台适配

支持腾讯视频、爱奇艺、优酷、B站和芒果TV五大主流视频平台的弹幕获取。

灵活存储

支持本地文件存储(CSV/XML)和SQLite数据库管理,满足不同场景需求。

弹幕服务

搭建兼容dandanplay接口的本地弹幕服务器,无缝对接私人影视库工具。

可编程调用

提供API接口,可轻松集成到其他Python项目中,扩展功能无限可能。

支持平台

已适配5大主流视频平台,覆盖大部分影视内容场景:

腾讯视频
爱奇艺
优酷 (需提供Cookie)
B站 (建议提供Cookie)
芒果TV

环境要求与安装

环境要求

安装方式

一键安装(推荐)

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手动更新数据库弹幕,弥补无法自动更新的不足。
命令格式

第一次搭建

  1. 需要先指定数据库存储位置
# 指定数据库存储路径(首次使用需执行,后续可直接调用其他功能)
get-danmu --db [数据库路径]

# 示例:将数据库保存在 E:\danmu_database 目录
get-danmu --db E:\danmu_database
  1. 获取弹幕并存储到数据库中需要指定-S参数
# 获取腾讯视频弹幕并存储到数据库中
get-danmu https://v.qq.com/x/cover/mcv8hkc8zk8lnov/j4100jwv4qo.html -S
  1. 开启服务器
# 启动服务器(默认端口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 版本(初代版本)

完成核心功能

开源声明

  1. 本工具仅用于个人学习与研究禁止任何商业用途(包括但不限于盈利性服务、企业内部使用等)
  2. 工具所使用的接口均来源于公开网络,若涉及第三方平台(如腾讯视频、B站等)权益,请联系维护者删除相关代码
  3. 如因违规使用(如商业用途、侵权、违反平台规则等)产生法律纠纷,均由使用者自行承担,与工具维护者无关
  4. 若发现侵权或违规使用情况,请通过维护者邮箱联系,会在3个工作日内处理
  5. 除去上述要求外,还需遵守本项目的开源协议

致谢

项目信息