📦huangxd- / danmu_api
← 返回首页
一个人人都能部署的基于 js 的弹幕 API 服务器,支持爱优腾芒哔咪人韩巴狐乐西埋帆红弹幕直接获取,兼容弹弹play的搜索、详情查询和弹幕获取接口规范,并提供日志记录,支持vercel/netlify/edgeone/cloudflare/docker/hf等部署方式,不用提前下载弹幕,没有nas或小鸡也能一键部署。
⚖️ AGPL-3.0#anime#api#danmu#danmuku#server🌐 bks.indevs.in📅 创建于 2025-09-09🔄 更新于 2026-10-25
🔗 GitHub JavaScript

📄 仓库 README

在 GitHub 查看 ↗
来自 GitHub 仓库自述文件 · 版权归原作者所有
Clash

LogVar 弹幕 API 服务器

GitHub GitHub forks GitHub Repo stars GitHub License Docker Image Version Docker Pulls telegram telegram Ask DeepWiki


一个人人都能部署的基于 js 的弹幕 API 服务器,支持爱优腾芒哔咪人韩巴狐乐西埋帆红弹幕直接获取,兼容弹弹play的搜索、详情查询和弹幕获取接口规范,并提供日志记录,支持vercel/netlify/edgeone/cloudflare/docker/hf等部署方式,不用提前下载弹幕,没有nas或小鸡也能一键部署。

本项目仅为个人学习爱好开发,代码开源。如有任何侵权行为,请联系本人删除。

有问题提issue或 私信机器人 都ok。

新加了 tg频道 ,方便发送更新通知,以及群组,太多人私信咨询了,索性增加一个 互助群 ,大家有问题可以在群里求助。

请不要在国内媒体平台宣传本项目!

目录

功能

  • API 接口:
  • 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 持久化。
  • 弹幕格式输出:支持 JSON 和 XML 及 @dan-uni/dan-any支持的全部输出格式 输出,通过以下方式配置:
  • 环境变量: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 格式弹幕
  • XML 格式说明:完全遵循 Bilibili 标准格式,8字段标准弹幕属性
  • 日志记录:捕获 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。
  • 在 UI 的“接口调试 → 弹幕测试 → 手动匹配测试”中输入关键词并搜索,搜索成功后点击“收藏”按钮即可保存整组搜索结果;已收藏时可再次点击按钮取消收藏。
  • 收藏名称和缓存键使用手动搜索框中的原始关键词,例如搜索“火影忍者”即收藏为“火影忍者”;列表图片取第一条搜索结果的图片。
  • 后续搜索或自动匹配命中收藏时直接从永久缓存返回,不再请求外部弹幕源;除精确关键词外,也会使用收藏剧名包含关系匹配同名剧场版、季度等变体。
  • “收藏”标签页支持搜索收藏、强制刷新和删除,每项会显示收藏时间及最近刷新时间。刷新会绕过已有缓存重新查询;删除会同时移除对应搜索缓存。
  • 收藏不受 SEARCH_CACHE_MINUTES、普通搜索缓存 500 条上限或过期清理影响。
  • 支持定时刷新收藏:在“收藏”标签页点击“定时刷新”按钮,选择每天或每周(1-7 对应周一至周日)与执行时间,固定按北京时间(Asia/Shanghai)运行;已配置的条目按钮会显示类似“每天 03:00”“周一 03:00”,条目下方显示下次执行时间和最近状态。
  • 定时刷新失败会保留旧缓存并在 10 分钟后自动重试一次,仍失败则等待下一个正常周期,不再继续重试;服务停机错过执行时间时,重启后只补执行一次并重新计算下一周期。
  • 定时刷新计划随收藏一起保存在 .cache/favoritesCache 或 Redis 中,Node/Docker 重启后如需保留请挂载 .cache 目录或配置 Upstash Redis;纯内存收藏及计划会随进程重启丢失。Vercel、Cloudflare、Netlify、EdgeOne、Hugging Face 等 serverless 平台不启动调度器,按钮会禁用并提示“仅支持 Node/Docker 部署”。
  • Node/Docker 部署会写入 .cache/favoritesCache 永久保存,请挂载 .cache 目录;serverless 平台必须配置 Redis 才启用收藏按钮,否则界面会置灰并提示配置 UPSTASH_REDIS_REST_URL、UPSTASH_REDIS_REST_TOKEN。配置 Redis 后可跨冷启动和实例恢复。
  • 智能缓存管理:支持内存缓存搜索结果和弹幕数据,避免短期内重复的不必要API请求。包括:
  • 搜索结果缓存(可通过 SEARCH_CACHE_MINUTES 配置,默认1分钟)
  • 弹幕缓存(可通过 COMMENT_CACHE_MINUTES 配置,默认5分钟)
  • 永久收藏缓存(无 TTL、无数量上限,Node/Docker 可持久化到 .cache/favoritesCache)
  • 用户偏好记录(可通过 MAX_LAST_SELECT_MAP 配置,默认100条)
  • Redis 分布式缓存支持,包括本地redis和upstash redis(可选)
  • 配置redis可持久化原有查询信息和永久收藏;搜索结果与弹幕缓存仍只保存在实例内存中,不会写入 Redis
  • 本地和Docker部署支持实时保存缓存到文件(挂载.cache目录即可)
  • 部署支持:支持本地运行、Docker 容器化、Vercel 一键部署、Netlify 一键部署、EdgeOne Makers 一键部署、Cloudflare 一键部署、Hugging Face Spaces部署和 Docker 一键启动。
  • 手动选择记忆:支持记住之前搜索title时手动选择的anime,并在后续的match自动匹配时优选该anime,支持记住集episode,下次自动匹配时会对集进行偏移【实验性】。
  • 手动搜索支持输入播放链接获取弹幕:支持手动搜索的播放器输入爱优腾芒哔咪狐乐西埋巴Ani红播放链接可获取弹幕,如senplayer。
  • 支持空格分隔多个链接合并弹幕,例如:https://www.iqiyi.com/v_xxx.html https://v.qq.com/x/cover/xxx.html
  • 支持链接尾部追加时间偏移,例如:https://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)
  • 解决部分播放器不支持顶部/底部弹幕和彩色弹幕的问题
  • 增加点赞数显示,先去重再拼接点赞标记,点赞数缩写显示,≥5 才显示,避免低赞干扰
  • 弹幕限制数量:支持通过环境变量配置等间隔采样弹幕数量。
  • 弹幕时间偏移功能:支持通过环境变量 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数据获取单独一个分片的弹幕数据
  • UI界面-后台配置管理系统:支持通过UI执行一些操作(详细见 UI 系统使用说明 ),包括:
  • 配置预览
  • 日志查看
  • 接口调试/弹幕测试
    • 自动匹配测试、手动匹配测试及收藏管理
  • 推送弹幕
  • 请求记录
  • 本地弹幕上传、列表管理和删除
  • 系统管理

前置条件

  • Node.js(v18.0.0 或更高版本;理论兼容更低版本,请自行测试)
  • npm
  • Docker(可选,用于容器化部署)

本地运行

  1. 克隆仓库: bash git clone <仓库地址> cd <项目目录>

  2. 安装依赖: bash npm install

  3. 配置应用(可选):

本项目支持两种配置方式,优先级从高到低: 1. 系统环境变量(最高优先级) 2. .env 文件(低优先级)- 复制 config/.env.example 为 config/.env 并修改

  1. 启动服务器: 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),相关用例会自行临时生成并清理,无需手工准备。

  1. 测试 API: 使用 Postman 或 curl 测试: - 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

📈 近 7 天 Star 趋势

每日新增 Star(柱)与累计 Star(线)· 数据来自 GitHub

🏆 排名变化趋势

在各榜单中的排名历史(数字越小越靠前)

📋 历史上榜记录

每次快照的详细数据
日期 榜单 排名 周期新增 总 STAR