一个人人都能部署的基于 js 的弹幕 API 服务器,支持爱优腾芒哔咪人韩巴狐乐西埋帆红弹幕直接获取,兼容弹弹play的搜索、详情查询和弹幕获取接口规范,并提供日志记录,支持vercel/netlify/edgeone/cloudflare/docker/hf等部署方式,不用提前下载弹幕,没有nas或小鸡也能一键部署。
本项目仅为个人学习爱好开发,代码开源。如有任何侵权行为,请联系本人删除。
有问题提issue或 私信机器人 都ok。
新加了 tg频道 ,方便发送更新通知,以及群组,太多人私信咨询了,索性增加一个 互助群 ,大家有问题可以在群里求助。
请不要在国内媒体平台宣传本项目!
GET /api/v2/search/anime?keyword=${queryTitle}:根据关键字搜索动漫。POST /api/v2/match:根据关键字匹配动漫,用于自动匹配。(已支持在match接口中通过@语法动态指定平台优先级,如赴山海 S01E28 @qiyi;已支持从网盘资源命名,如无忧渡.S01E01.2160p.WEB-DL.H265.DDP.5.1中提取 title/season/episode);可通过 AUTO_MATCH_MAPPING_TABLE 配置跨标题、跨季和集数范围映射;已支持外语标题匹配,如Blood.River.S01E05,需配置环境变量TITLE_TO_CHINESE使用;已适配该格式爱情公寓.ipartment.2009.S03E05.H.265.25fps.mkv标题;已支持AI自动匹配,需配合AI相关环境变量使用GET /api/v2/search/episodes:根据关键词搜索所有匹配的剧集信息。GET /api/v2/bangumi/:animeId:获取指定动漫的详细信息。GET /api/v2/comment/:commentId?format=json&duration=true:获取指定弹幕评论;当 duration=true 且返回 JSON 时,会额外附带 videoDuration 字段,优先返回源站时长,拿不到时返回 0。GET /api/v2/comment?url=${videoUrl}&format=json:通过视频URL直接获取弹幕(兼容第三方弹幕服务器格式)。POST /api/v2/segmentcomment?format=json:通过comment接口返回体中的Segment类JSON数据获取单独一个分片的弹幕数据。GET|POST /api/v2/fongmi/danmaku?name={name}&episode={episode}:FengMi影视api。GET|POST /danmaku:兼容FengMi影视弹幕短地址(含 /danmaku/api/v2/fongmi/danmaku 兼容形式);在FengMi自定义弹幕API中直接填写部署根地址(如 http://192.168.1.7:9321)也可使用,兼容地址末尾带 /danmaku 或 /danmaku/ 的写法。GET /api/logs:获取最近的日志(最多 500 行,格式为 [时间戳] 级别: 消息)。GET /api/cache/animes:获取最近的 animes 缓存(系统管理接口,需 ADMIN_TOKEN)。POST /api/v2/favorite/add:新增收藏。手动匹配测试使用 { "keyword": "火影忍者" } 保存搜索关键词及整组搜索结果;同时兼容 { "fileName": "火影忍者 S01E01" }。GET /api/v2/favorite/list:获取收藏摘要列表,包含收藏关键词、来源、总集数、首条搜索结果图片、收藏时间及最近刷新时间;响应中的 favoriteSupported 表示当前部署是否具备持久化收藏能力。POST /api/v2/favorite/refresh:使用 { "keyword": "火影忍者" } 强制重新搜索并更新收藏缓存。POST /api/v2/favorite/schedule:设置或关闭收藏的定时刷新(仅 Node/Docker 部署可用)。设置使用 { "keyword": "火影忍者", "schedule": { "frequency": "daily", "time": "03:00" } };每周模式需额外传 "weekday": 1-7(周一至周日),例如 { "frequency": "weekly", "time": "03:00", "weekday": 1 }。关闭使用 { "keyword": "火影忍者", "schedule": null }。固定按北京时间(Asia/Shanghai)执行,serverless 平台返回 501。POST /api/v2/favorite/remove:使用 { "keyword": "火影忍者" } 删除收藏及对应搜索缓存。POST /api/v2/local-danmu/upload:上传并解析本地弹幕文件(multipart/form-data,字段包括 file、title、year、type,电视剧可指定 season、episode)。每次接收一个文件,最大 10 MB;管理页面的批量导入会依次调用此接口。GET /api/v2/local-danmu/list:获取已上传的本地弹幕资源及按标题、年份、类型、季分组的列表。GET /api/v2/local-danmu/:resourceKey:获取指定本地弹幕资源的元数据;DELETE /api/v2/local-danmu/:resourceKey:删除资源。PATCH /api/v2/local-danmu/:resourceKey:编辑本地弹幕元数据;scope=resource 修改集数和显示文件名,scope=group 修改当前季的标题、年份、类型和季数。目标资源已存在时返回冲突错误,不会覆盖原文件。TOKEN 或 ADMIN_TOKEN。默认仅管理员可上传和删除;设置 LOCAL_DANMU_NOT_REQUIRE_ADMIN=true 后,普通 TOKEN 也可执行上传和删除。Node/Docker 将资源保存到 .cache/local-danmu,云端部署使用 Redis 持久化。DANMU_OUTPUT_FORMAT=json|xml|artplayer.json|baha.json|bili.xml|danuni.json|danuni.binpb|ddplay.json|dplayer.json|vod.json(默认:json)?format=xml 或 ?format=json ...(优先级最高)GET /api/v2/comment/10001?format=xml 返回 XML 格式弹幕console.log(info 级别)和 console.error(error 级别),JSON 内容格式化输出。GET /api/v2/favorite/list 是公开只读接口,无需 token。其他收藏接口在自定义 TOKEN 时,必须使用 /{TOKEN}/api/v2/favorite/... 或 /{ADMIN_TOKEN}/api/v2/favorite/... 形式显式携带 token;使用默认 TOKEN=87654321 且未开启管理员限制时可省略 token。配置 FAVORITE_REQUIRE_ADMIN=true 后,写入和管理操作仅允许 ADMIN_TOKEN。SEARCH_CACHE_MINUTES、普通搜索缓存 500 条上限或过期清理影响。Asia/Shanghai)运行;已配置的条目按钮会显示类似“每天 03:00”“周一 03:00”,条目下方显示下次执行时间和最近状态。.cache/favoritesCache 或 Redis 中,Node/Docker 重启后如需保留请挂载 .cache 目录或配置 Upstash Redis;纯内存收藏及计划会随进程重启丢失。Vercel、Cloudflare、Netlify、EdgeOne、Hugging Face 等 serverless 平台不启动调度器,按钮会禁用并提示“仅支持 Node/Docker 部署”。.cache/favoritesCache 永久保存,请挂载 .cache 目录;serverless 平台必须配置 Redis 才启用收藏按钮,否则界面会置灰并提示配置 UPSTASH_REDIS_REST_URL、UPSTASH_REDIS_REST_TOKEN。配置 Redis 后可跨冷启动和实例恢复。SEARCH_CACHE_MINUTES 配置,默认1分钟)COMMENT_CACHE_MINUTES 配置,默认5分钟).cache/favoritesCache)MAX_LAST_SELECT_MAP 配置,默认100条)senplayer。https://www.iqiyi.com/v_xxx.html https://v.qq.com/x/cover/xxx.htmlhttps://www.iqiyi.com/v_xxx.html@-50(提前50秒)、https://v.qq.com/x/cover/xxx.html@%11(百分比缩放)CONVERT_TOP_BOTTOM_TO_SCROLL)CONVERT_COLOR),支持自定义颜色池(COLOR_POOL)DANMU_OFFSET 配置弹幕时间偏移,解决弹幕与视频不同步的问题。格式为 剧名:秒(全剧偏移)、剧名/季:秒(整季偏移)、剧名/季/集:秒(单集偏移),支持指定来源 剧名@来源:秒、剧名/季@来源1&来源2:秒(不指定来源则对所有来源生效),多条用逗号分隔。例如:overlord/S01:90, re-zero/S02@bilibili:120, re-zero/S02/E03@dandan&bilibili:10。正数表示弹幕延后(向右),负数表示弹幕提前(向左)。另外支持百分比模式:在来源或路径末尾增加 %,如 东方/S03/E02@tencent%:11,表示按公式 原时间 * (视频时长 + 偏移秒数) / 视频时长 缩放全部弹幕时间,更适合整集整体快慢不一致的场景。另外在手动解析链接时,可以在链接末尾追加 @秒数 或 @%秒数 实现单链接时间偏移。/api/v2/comment 请求时支持定义 segmentflag=true 参数,用于请求弹幕分片列表/api/v2/comment/:commentId?format=json&duration=true 可在 JSON 返回体中附带 videoDuration/api/v2/segmentcomment 通过comment接口返回体中的Segment类JSON数据获取单独一个分片的弹幕数据克隆仓库:
bash
git clone <仓库地址>
cd <项目目录>
安装依赖:
bash
npm install
配置应用(可选):
本项目支持两种配置方式,优先级从高到低:
1. 系统环境变量(最高优先级)
2. .env 文件(低优先级)- 复制 config/.env.example 为 config/.env 并修改
bash
npm start
服务器将在 http://{ip}:9321 运行,默认token是87654321。Node 服务默认通过 :: 同时监听 IPv6 和 IPv4;不支持 IPv6 绑定时会自动回退到 0.0.0.0。IPv6 地址访问格式为 http://[IPv6地址]:9321。若操作系统强制启用了 IPV6_V6ONLY,需调整系统网络策略后才能通过同一监听端口接受 IPv4 连接。
如需修改端口,可设置环境变量 DANMU_API_PORT(例如 DANMU_API_PORT=8080 npm start)。
HTTPS 反向代理应传递 X-Forwarded-Proto;无法传递时可设置 DANMU_API_PUBLIC_PROTO=https,用于生成正确的对外弹幕链接。热更新支持:修改 config/.env,应用会自动检测并重新加载配置(无需重启应用)。
或者使用下面的命令
bash
# 启动
node ./danmu_api/server.js
# 测试(danmu_api/tests 下的全部用例)
npm test
# 只跑单个测试文件
node --test danmu_api/tests/utils/merge-util.test.js
# 构建forward弹幕插件
node build-forward-widget.js
# 测试forward弹幕插件(真实联网,需手动执行)
node forward/forward-widget.spec.js
测试用例全部位于
danmu_api/tests/,目录与danmu_api/源码目录一一对应(utils/、sources/、apis/、configs/、models/、ui/), 跨模块的请求级用例放在tests/顶层,共享夹具在tests/helpers/。npm test使用node --test --test-concurrency=1:本地弹幕与 Bangumi Data 用例会读写仓库根目录的.cache/, 因此测试文件必须串行执行,请勿去掉--test-concurrency=1。 该命令依赖 Node 默认的测试文件发现规则(Node 18 及以上均可用),不需要也不应改成--test <目录>形式。danmu_api/tests/manual/live-source-checks.js是依赖真实数据源的手工巡检用例,不会被自动发现、也不参与npm test; 手动执行:node --test danmu_api/tests/manual/live-source-checks.js(详见文件头说明); 其中写入真实平台环境变量 / 触发真实部署 / 写真实 Redis 的用例默认跳过,需要时加LIVE_SOURCE_WRITE_CHECKS=true。 提交 PR 或推送到 main 时会由.github/workflows/test.yml自动执行npm install+npm test(无需任何 secrets, 也不访问外网/Redis,fork PR 同样会跑);CI 使用 Node 24,运行测试需要 Node ≥ 22.3——configs/cache-persistence.test.js与configs/cache-backends.test.js的子进程依赖--experimental-test-module-mocks。 全新 clone 里没有config/.env(仅跟踪config/.env.example),相关用例会自行临时生成并清理,无需手工准备。
GET http://{ip}:9321/87654321
- GET http://{ip}:9321/87654321/api/v2/search/anime?keyword=生万物
- POST http://{ip}:9321/87654321/api/v2/match
- GET http://{ip}:9321/87654321/api/v2/search/episodes?anime=生万物
- GET http://{ip}:9321/87654321/api/v2/bangumi/1
- `GET http://{ip}:9321/876543| 日期 | 榜单 | 排名 | 周期新增 | 总 STAR |
|---|