Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
D

danmu_api

> 编程语言
Open source

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

2.9K stars0 likes1 views
WebsiteGitHub

About

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

LogVar 弹幕 API 服务器

--- 一个人人都能部署的基于 js 的弹幕 API 服务器,支持爱优腾芒哔咪人韩巴狐乐西埋帆红弹幕直接获取,兼容弹弹play的搜索、详情查询和弹幕获取接口规范,并提供日志记录,支持vercel/netlify/edgeone/cloudflare/docker/hf等部署方式,不用提前下载弹幕,没有nas或小鸡也能一键部署。 本项目仅为个人学习爱好开发,代码开源。如有任何侵权行为,请联系本人删除。 有问题提issue或 [私信机器人](https://t.me/ddjdd_bot) 都ok。 新加了 [tg频道](https://t.me/logvar_danmu_channel) ,方便发送更新通知,以及群组,太多人私信咨询了,索性增加一个 [互助群](https://t.me/logvar_danmu_group) ,大家有问题可以在群里求助。 > 请不要在国内媒体平台宣传本项目! # 目录 - [功能](#功能) - [前置条件](#前置条件) - [本地运行](#本地运行) - [使用 Docker 运行](#使用-docker-运行) - [Docker 一键启动 【推荐】](#docker-一键启动-推荐) - [部署到 Vercel 【推荐】](#部署到-vercel-推荐) - [部署到 Netlify](#部署到-netlify) - [部署到 腾讯云 edgeone pages](#部署到-腾讯云-edgeone-pages) - [部署到 Cloudflare](#部署到-cloudflare) - [部署到 Hugging Face Spaces](#部署到-hugging-face-spaces) - [API食用指南](#api食用指南) - [环境变量列表](#环境变量列表) - [采集源及对应平台列表](#采集源及对应平台列表) - [项目结构](#项目结构) - [注意事项](#注意事项) - [关联项目](#关联项目) - [特别感谢](#特别感谢) - [贡献者](#贡献者) ## 功能 - **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 /api/v2/fongmi/danmaku?name={name}&episode={episode}`:FengMi影视api。 - `GET /danmaku/api/v2/fongmi/danmaku?name={name}&episode={episode}`:兼容FengMi影视api短路径。 - `GET /api/logs`:获取最近的日志(最多 500 行,格式为 `[时间戳] 级别: 消息`)。 - `GET /api/cache/animes`:获取最近的 animes 缓存。 - `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](https://github.com/ani-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 一键部署、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 系统使用说明](https://github.com/huangxd-/danmu_api/tree/main/danmu_api/ui/README.md) ),包括: - 配置预览 - 日志查看 - 接口调试/弹幕测试 - 自动匹配测试、手动匹配测试及收藏管理 - 推送弹幕 - 请求记录 - 本地弹幕上传、列表管理和删除 - 系统管理 ## 前置条件 - 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` 并修改 4. **启动服务器**: ```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 # 测试 node --test ./danmu_api/worker.test.js # 构建forward弹幕插件 node build-forward-widget.js # 测试forward弹幕插件 node forward/forward-widget.test.js ``` 5. **测试 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/87654321/api/v2/comment/1?format=json` - `GET http://{ip}:9321/87654321/api/v2/comment/1?format=json&duration=true` - `GET http://{ip}:9321/87654321/api/v2/comment?url=https://v.qq.com/x/cover/xxx.html&format=json` - `GET http://{ip}:9321/87654321/api/v2/extcomment?url=https://v.qq.com/x/cover/xxx.html&format=json` - `POST http://{ip}:9321/87654321/api/v2/segmentcomment?format=json` (请求体包含segment类JSON数据,示例 `{"type": "qq","segment_start":0,"segment_end":30000,"url":"https://dm.video.qq.com/barrage/segment/j0032ubhl9s/t/v1/0/30000"}` ) - `GET http://{ip}:9321/87654321/api/logs` > 注意:TOKEN为默认87654321的情况下,可不带{TOKEN}请求,如`http://{ip}:9321/api/v2/search/anime?keyword=生万物` ### Forward 真机调试 在电脑上启动实时日志接收服务: ```bash node danmu_api/server.js ``` 再在另一个终端生成可与正式插件并存的 debug bundle: ```bash node build-forward-widget.js --debug ``` 在 Forward 中安装 `dist/logvar-danmu.debug.js`,将 `debugEndpoint` 配置为带 token 的电脑局域网地址,例如 `http://192.168.1.10:9321/87654321`。不要填写 `127.0.0.1`,它在手机上指向手机自身。 真机复现时,handler 开始/结束、参数、结果摘要、`info/warn/error`、直接 `console` 输出,以及所有 HTTP GET/POST 的 URL、状态、耗时和异常会实时显示在服务端终端。相同内容也会以 `[ForwardRemote]` 前缀写入 `/api/logs`: ```text GET http://127.0.0.1:9321/87654321/api/logs ``` 服务端不会保存 trace session,也不提供回放接口。正式 bundle 不包含日志回传代码;Cookie、token 和 API key 会在上传前脱敏。日志回传失败不会影响弹幕主流程。 ## 使用 Docker 运行 1. **构建 Docker 镜像**: ```bash docker build -t danmu-api . ``` 2. **运行容器**: ```bash docker run -d -p 9321:9321 --name danmu-api -e TOKEN=87654321 danmu-api ``` - 使用`-e TOKEN=87654321`设置`TOKEN`环境变量,覆盖Dockerfile中的默认值。 - 或使用 `--env-file .env` 加载 .env 文件中的所有环境变量:`docker run -d -p 9321:9321 --name danmu-api --env-file .env danmu-api` > 容器内服务默认启用 IPv4/IPv6 双栈监听。通过 IPv6 从宿主机访问时,Docker 守护进程及容器网络也需要启用 IPv6;否则仍可正常使用 IPv4。 **热更新支持**:如需支持环境变量热更新(修改 `.env` 文件后无需重启容器),请使用 Volume 挂载: ```bash docker run -d -p 9321:9321 --name danmu-api -v $(pwd)/.env:/app/.env --env-file .env danmu-api ``` > **推荐**:使用 docker compose 部署可以更方便地管理配置和支持热更新,详见下方"Docker 一键启动"部分。 3. **测试 API**: 使用 `http://{ip}:9321/{TOKEN}` 访问上述 API 接口。 > 注意:TOKEN为默认87654321的情况下,可不带{TOKEN}请求,如`http://{ip}:9321/api/v2/search/anime?keyword=生万物` ## Docker 一键启动 【推荐】 1. **拉取镜像**: ```bash docker pull logvar/danmu-api:latest ``` 2. **运行容器**: ```bash docker run -d -p 9321:9321 --name danmu-api -e TOKEN=87654321 logvar/danmu-api:latest ``` - 使用`-e TOKEN=87654321`设置`TOKEN`环境变量。 - 或使用 `--env-file .env` 加载 .env 文件中的所有环境变量:`docker run -d -p 9321:9321 --name danmu-api --env-file .env logvar/danmu-api:latest` **热更新支持**:如需支持环境变量热更新(修改 `config/.env` 文件后无需重启容器),请使用 Volume 挂载: ```bash docker run -d -p 9321:9321 --name danmu-api -v $(pwd)/config:/app/config --env-file .env logvar/danmu-api:latest ``` 或使用 docker compose 部署(**推荐,支持环境变量热更新**): ```yaml services: danmu-api: image: logvar/danmu-api:latest ports: - "9321:9321" # 热更新支持:挂载 config/.env 文件,修改后容器会自动重新加载配置(无需重启容器) volumes: - ./config:/app/config # config目录下需要创建.env - ./.chche:/app/.cache # 配置.chche目录,会将缓存实时保存在本地文件 restart: unless-stopped ``` 可以使用 watchtower 监控有新版本自动更新: ```yaml services: watchtower: image: nickfedor/watchtower container_name: watchtower-gx restart:

GitHub Issues· 0 open

View all on GitHub

No open issues yet, or sync has not completed.

Highlights

  • •使用 Docker 运行
  • •Docker 一键启动 【推荐】
  • •部署到 Vercel 【推荐】
  • •部署到 Netlify
  • •部署到 腾讯云 edgeone pages
  • •部署到 Cloudflare
  • •部署到 Hugging Face Spaces
  • •采集源及对应平台列表
  • •GET /api/v2/search/anime?keyword=${queryTitle}:根据关键字搜索动漫。
  • •GET /api/v2/search/episodes:根据关键词搜索所有匹配的剧集信息。

> Tags

JavaScriptanimeapidandanplaydanmu

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言