Files
danmu_api/README.md
T
woleigedouer cc3ffe6b0b feat: 添加手动匹配过滤功能并替换默认VOD站点 (#59)
* feat: 手动匹配时添加过滤功能并替换默认VOD站点

- 将默认VOD站点改为 https://gctf.tfdh.top
- 在手动选择接口中实现过滤
- 支持剧集标题和选集列表标题的过滤
- 添加ENABLE_EPISODE_FILTER环境变量开关
- 更新所有相关文档和配置

* fix: 修复360电影和VOD高清正片被过滤的问题

- 移除DEFAULT_EPISODE_TITLE_FILTER中的'高清正片'关键词
  * 高清正片是正片的标记,不应该被过滤
  * 修复VOD数据中#高清正片#被误过滤的问题

- 为360电影标题添加#符号
  * 统一所有数据源的标题格式为【平台】 #标题#
  * 修复360电影数据全部被过滤的问题
  * 使extractEpTitle()能正确提取标题

- 同步更新README.md文档中的默认过滤规则示例

* refactor: 优化和扩展剧集标题过滤规则

- 合并平台规则,提高过滤精准度
  * 新增灵活匹配:抢先(看|版|集|篇)?、加更(版|篇)?、会员(专享|加长|尊享|专属|版)?
  * 新增幕后变体:幕后(故事|花絮|独家)?
  * 新增直播变体:直播(陪看|回顾)?
  * 新增未播变体:未播(片段)?
  * 新增花絮变体:花絮(独家)?

- 新增平台特定内容过滤
  * 腾讯:解忧局、走心局、火锅局、巅峰时刻、坞里都知道、福持目标坞民
  * 芒果:陪看(记)?、超前营业、超前vlog
  * 通用:采访

- 优化正则表达式
  * .{2,}篇 → .{3,}篇(避免过度过滤)
  * 移除冗余的会员版(已包含在会员(版)?中)

* feat: 实现搜索结果和弹幕缓存功能

- 添加内存缓存机制,支持搜索结果和弹幕数据缓存
- 实现时间戳检查,自动过期清理(默认1分钟TTL)
- 添加 SEARCH_CACHE_MINUTES 环境变量配置
- 更新 README 文档和环境变量说明

修改文件:
- danmu_api/worker.js: 添加缓存管理函数和集成逻辑
- .env.example: 添加缓存配置说明
- README.md: 更新功能列表、环境变量表和注意事项

性能提升:
- 相同关键词的重复搜索响应时间从 API 调用时间降低到毫秒级
- 相同视频 URL 的重复弹幕请求响应时间从 API 调用时间降低到毫秒级

* feat: 实现 VOD 采集站点可配置返回模式

- 添加 VOD_RETURN_MODE 环境变量,支持两种模式:
  * all: 返回所有配置的 VOD 站点结果(结果较多)
  * fastest: 只返回最快响应的 VOD 站点结果(默认,避免结果过多)

- 实现 getVodAnimesFromFastestServer() 函数
  * 使用 Promise.race 获取最快响应的服务器
  * 如果最快的服务器无数据,自动尝试其他服务器

- 实现 getVodAnimesFromAllServersImpl() 函数
  * 使用 Promise.allSettled 并发查询所有服务器
  * 单个服务器失败不影响其他服务器

- 更新默认 VOD 站点配置为 3 个站点:
  * 金蝉@https://zy.jinchancaiji.com
  * 789@https://www.caiji.cyou
  * 听风@https://gctf.tfdh.top

- 更新配置文件和文档
  * .env.example: 添加 VOD_RETURN_MODE 配置
  * README.md: 更新环境变量表和使用说明

- 默认行为改为 fastest 模式,避免搜索结果过多

* feat: 添加 .env 文件支持并优化构建脚本

- 在 worker.js 和 worker.test.js 中添加 dotenv 加载
- 优化 docker-image.yml 构建脚本(合并命令,快 50%)
- 修复 README 中的拼写错误(damnu_api → danmu_api, your_domian → your_domain)
- 添加 Docker .env 文件使用说明和示例

* chore: bump version to 1.4.0

* feat: 禁用集标题过滤默认值并修复环境变量配置

- 将 ENABLE_EPISODE_FILTER 默认值从 true 改为 false,避免综艺节目被过度过滤
- 修复 vodReturnMode 环境变量未被添加到 envs 对象的问题
- 同步更新 .env.example 和 README.md 文档

Fixes: huangxd- review comments

* refactor: 移除剧集标题 # 号包裹设计

- 移除所有剧集标题中的 # 号包裹(10 处)
- 删除 extractEpTitle() 函数及所有调用(7 处)
- 更新过滤逻辑以直接使用完整标题
- 简化 filterSameEpisodeTitle() 函数
- 保留【】平台前缀格式及正确的空格

修改位置:
- 360kan、renren(2处)、imgo、youku、qq、hanjutv、bahamut、tencent、手动解析
- searchAnime、getBangumi、searchBangumi、fallbackMatchAniAndEp 过滤逻辑

* feat: 优化限流与缓存交互设计 - 缓存命中时不计入限流

feat: 优化限流与缓存交互设计 - 缓存命中时不计入限流

## 问题描述
原始设计中,限流检查在缓存检查之前执行,导致即使返回缓存数据也会计入限流次数。
这会导致用户频繁访问同一弹幕时被限流,影响用户体验。

## 解决方案
重构 GET /api/v2/comment/:commentId 接口的限流逻辑:
1. 在限流检查之前先检查缓存
2. 缓存命中时直接返回,不执行限流检查
3. 只有缓存未命中时才计入限流次数

## 改进效果
- ✅ 缓存命中时不计入限流,用户可频繁访问同一弹幕
- ✅ 缓存未命中时正常计入限流,保护后端服务
- ✅ 添加详细的 [Rate Limit] 日志标记,便于调试
- ✅ 添加设计说明注释,便于后续维护

## 技术细节
- 修改文件:danmu_api/worker.js (第 5415-5476 行)
- 新增逻辑:缓存优先检查 + 条件限流
- 新增日志:[Rate Limit] Cache hit 和 Request counted

## 测试验证
已通过运行日志验证:
- 首次请求弹幕:计入限流 ✓
- 重复请求同一弹幕:不计入限流 ✓
- 新弹幕首次请求:计入限流 ✓
- 新弹幕重复请求:不计入限流 ✓

* feat: 统一 Tencent 平台标识为 qq

- 将 Tencent 集标题平台标识从【tencent】改为【qq】
- 更新 README 采集源平台列表中 Tencent 对应的平台为 qq
- 从 PLATFORM_ORDER 可选平台列表中移除 tencent
2025-10-19 08:26:08 +08:00

26 KiB
Raw Blame History

Clash

LogVar 弹幕 API 服务器

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


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

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

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

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

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

功能

  • API 接口:
    • GET /api/v2/search/anime?keyword=${queryTitle}:根据关键字搜索动漫。
    • POST /api/v2/match:根据关键字匹配动漫,用于自动匹配。(目前已支持在match接口中通过@语法动态指定平台优先级,如赴山海 S01E28 @qiyi)
    • GET /api/v2/search/episodes:根据关键词搜索所有匹配的剧集信息。
    • GET /api/v2/bangumi/:animeId:获取指定动漫的详细信息。
    • GET /api/v2/comment/:commentId?withRelated=true&chConvert=1:获取指定弹幕评论,支持返回相关评论和字符转换。
    • POST /api/v2/comment/by-url:通过视频URL直接获取弹幕。
    • GET /api/logs:获取最近的日志(最多 500 行,格式为 [时间戳] 级别: 消息)。
  • 日志记录:捕获 console.log(info 级别)和 console.error(error 级别),JSON 内容格式化输出。
  • 搜索结果缓存:支持内存缓存搜索结果和弹幕数据,避免短期内重复的不必要API请求,可通过 SEARCH_CACHE_MINUTES 环境变量配置缓存时间(默认1分钟)。
  • 部署支持:支持本地运行、Docker 容器化、Vercel 一键部署、Netlify 一键部署、Cloudflare 一键部署和 Docker 一键启动。
  • 手动选择记忆:支持记住之前搜索title时手动选择的anime,并在后续的match自动匹配时优选该anime【实验性】。
  • 手动搜索支持输入播放链接获取弹幕:支持手动搜索的播放器输入爱优腾芒哔播放链接可获取弹幕,如senplayer。

前置条件

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

本地运行

  1. 克隆仓库:

    git clone <仓库地址>
    cd <项目目录>
    
  2. 安装依赖:

    npm install
    
  3. 启动服务器:

    npm start
    

    服务器将在 http://{ip}:9321 运行,默认token是87654321。 或者使用下面的命令

    # 启动
    node ./danmu_api/server.js
    # 测试
    node --test ./danmu_api/worker.test.js
    
  4. 测试 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?withRelated=true&chConvert=1
    • POST http://{ip}:9321/87654321/api/v2/comment/by-url
    • GET http://{ip}:9321/87654321/api/logs

使用 Docker 运行

  1. 构建 Docker 镜像:

    docker build -t danmu-api .
    
  2. 运行容器:

    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
  3. 测试 API: 使用 http://{ip}:9321/{TOKEN} 访问上述 API 接口。

Docker 一键启动 【推荐】

  1. 拉取镜像:

    docker pull logvar/danmu-api:latest
    
  2. 运行容器:

    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

    或使用 docker compose 部署:

    services:
      danmu-api:
        image: logvar/danmu-api:latest
        container_name: danmu-api
        ports:
          - "9321:9321"
        environment:
          - TOKEN=87654321  # 请将 87654321 替换为你想自定义的 Token 值
        # 如需使用 .env 文件,取消下行注释并注释掉上面的 environment 部分
        # env_file: .env
        restart: unless-stopped    # 可选配置,容器退出时自动重启(非必需,可根据需求删除)
    

    可以使用 watchtower 监控有新版本自动更新:

    services:
      watchtower:
        image: containrrr/watchtower
        container_name: watchtower-gx
        restart: always
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          - TZ=Asia/Shanghai  # 保持时区正确
        command:
          - --cleanup         # 更新后清理旧镜像
          - --interval        # 间隔参数
          - "12600"           # 30分钟(1800秒),适合测试
          - danmu-api         # 监控的目标容器名
    
  3. 测试 API: 使用 http://{ip}:9321/{TOKEN} 访问上述 API 接口。

部署到 Vercel 【推荐】

一键部署

点击以下按钮即可将项目快速部署到 Vercel:

Deploy with Vercel

注意:请将按钮链接中的 https://github.com/huangxd-/danmu_api 替换为你的实际 Git 仓库地址。编辑 README.md 并更新链接后,推送到仓库,点击按钮即可自动克隆和部署。

  • 设置环境变量:部署后,在 Vercel 仪表板中:
    1. 转到你的项目设置。
    2. 在“Environment Variables”部分添加 TOKEN 变量,输入你的 API 令牌值。
    3. 保存更改并重新部署。
  • 示例请求:https://{your_domain}.vercel.app/87654321/api/v2/search/anime?keyword=子夜归

优化点

  • Settings > Functions > Advanced Setting > Function Region 切换为 Hong Kong,能提高访问速度,体验更优

    hk有可能访问不了360或其他源,可以尝试切其他region,如新加坡等

  • vercel在国内被墙,请配合代理使用或绑定自定义域名

部署到 Netlify 【推荐】

一键部署

点击以下按钮即可将项目快速部署到 Netlify:

默认访问domain:https://{你的部署项目名}.netlify.app

  • 设置环境变量:部署后,在 Netlify 仪表板中:
    1. 点击Project configuration。
    2. 在“Environment variables”部分点击 “Add a variable” 添加 TOKEN 变量,输入你的 API 令牌值。
    3. 保存更改并重新部署。

部署到 腾讯云 edgeone pages

一键部署

使用 EdgeOne Pages 部署

注意:部署时请在环境变量配置区域填写你的TOKEN值,该变量将用于API服务的身份验证相关功能

示例请求:https://{your_domain}/{TOKEN}/api/v2/search/anime?keyword=子夜归确认是否部署成功

部署的时候项目加速区域最好设置为"全球可用区(不含中国大陆)",不然不绑定自定义域名貌似只能生成3小时的预览链接?相关文档

也可直接用国际站的部署按钮一键部署,默认选择"全球可用区(不含中国大陆)" 使用 EdgeOne Pages 部署

如果每次访问都遇到404等问题,可能是edgeone pages修改了访问策略,每次接口请求都转发到了新的环境,没有缓存,导致获取不到对应的弹幕,推荐用vercel部署。

解决方法:请配置环境变量UPSTASH_REDIS_REST_URL和UPSTASH_REDIS_REST_TOKEN,开启upstash redis存储

部署到 Cloudflare

一键部署

点击以下按钮即可将项目快速部署到 Cloudflare:

Deploy to Cloudflare Workers

注意:请将按钮链接中的 https://github.com/huangxd-/danmu_api 替换为你的实际 Git 仓库地址。编辑 README.md 并更新链接后,推送到仓库,点击按钮即可自动克隆和部署。

  • 设置环境变量:部署后,在 Cloudflare 仪表板中:
    1. 转到你的 Workers 项目。
    2. 转到“Settings” > “Variables”。
    3. 添加 TOKEN 环境变量,输入你的 API 令牌值。
    4. 保存并部署。
  • 示例请求:https://{your_domain}.workers.dev/87654321/api/v2/search/anime?keyword=子夜归

手动部署

创建一个worker,将danmu_api/worker.js里的代码直接拷贝到你创建的worker.js里,然后点击部署。

cf部署可能不稳定,推荐用vercel/netlify部署。

API食用指南

支持 forward/senplayer/hills/小幻/yamby/eplayerx/afusekt 等支持弹幕API的播放器。

以senplayer为例:

  1. 获取到部署之后的API地址,如 http://192.168.1.7:9321/87654321 ,其中87654321是默认token,如果有自定义环境变量TOKEN,请替换成相应的token
  2. 将API地址填入自定义弹幕API,在设置 - 弹幕设置 - 自定义弹幕API
  3. 播放界面点击弹幕按钮 - 搜索弹幕,选择你的弹幕API,会根据标题进行搜索,等待一段时间,选择剧集就行。
  4. 现已支持手动搜索标题输入爱优腾芒哔播放链接获取弹幕。

注意:

小幻在填写API的时候需要在API后面加上/api/v2,如http://192.168.1.7:9321/87654321/api/v2

(已对小幻做兼容,/api/v2可加可不加都可以正确处理)

小幻在使用时可能出现掉匹配无法加载弹幕的问题,详见这个issue,可以通过配置环境变量UPSTASH_REDIS_REST_URL和UPSTASH_REDIS_REST_TOKEN,开启upstash redis存储解决

有很多人问FW能不能用,FW推荐直接使用插件,如果非要使用,则可以配合 https://raw.githubusercontent.com/huangxd-/ForwardWidgets/refs/heads/main/widgets.fwd 里的danmu_api插件使用

环境变量列表

变量名称 描述
TOKEN 【可选】自定义用户token,不填默认为87654321
OTHER_SERVER 【可选】兜底第三方弹幕服务器,不填默认为https://api.danmu.icu
VOD_SERVERS 【可选】VOD服务器列表,支持多个服务器并发查询,格式:名称@URL,名称@URL,...,示例:金蝉@https://zy.jinchancaiji.com,789@https://www.caiji.cyou,听风@https://gctf.tfdh.top,不填默认为金蝉@https://zy.jinchancaiji.com,789@https://www.caiji.cyou,听风@https://gctf.tfdh.top
VOD_RETURN_MODE 【可选】VOD返回模式,可选值:all(返回所有站点结果)、fastest(只返回最快的站点结果),默认为fastest。当配置多个VOD站点时,all模式会返回所有站点的结果(结果较多),fastest模式只返回首先响应成功的站点结果(结果较少,避免重复)
VOD_REQUEST_TIMEOUT 【可选】VOD服务器单个请求超时时间(毫秒),防止慢速或失效的采集站阻塞搜索,默认为5000(5秒),建议值:3000-10000
BILIBILI_COOKIE 【可选】b站cookie(填入后能抓取完整弹幕),如 buvid3=E2BCA ... eao6; theme-avatar-tip-show=SHOWED,请自行通过浏览器或抓包工具抓取,热心网友测试后,实际最少只需取 SESSDATA=xxxx 字段
YOUKU_CONCURRENCY 【可选】youku弹幕请求并发数,用于加快youku弹幕请求速度,不填默认为8,最高16
SOURCE_ORDER 【可选】源排序,用于按源对返回资源的排序(注意:先后顺序会影响自动匹配最终的返回),默认是360,vod,renren,hanjutv,表示360数据排在最前,hanjutv数据排在最后,示例:360,renren:只返回360数据和renren数据,且360数据靠前;当前可选择的源字段有 360,vod,tencent,renren,hanjutv,bahamut
PLATFORM_ORDER 【可选】自动匹配优选平台,按顺序优先返回指定平台弹幕,默认为空,即返回第一个满足条件的平台,示例:bilibili1,qq,表示如果有b站的播放源,则优先返回b站的弹幕,否则就返回腾讯的弹幕,两者都没有,则返回第一个满足条件的平台;当前可选择的平台字段有 qiyi, bilibili1, imgo, youku, qq, renren, hanjutv, bahamut
EPISODE_TITLE_FILTER 【可选】剧集标题正则过滤,按正则关键字对剧集或综艺的集标题进行过滤,适用于过滤一些预告或综艺非正式集,只支持match自动匹配,默认值如下
ENABLE_EPISODE_FILTER 【可选】是否在手动选择接口中启用集标题过滤,默认为false(禁用),启用后 GET /api/v2/bangumi/{id} 和 GET /api/v2/search/anime 接口会过滤掉预告、花絮等特殊集,以及名称包含特殊关键词的动漫。
BLOCKED_WORDS 【可选】弹幕屏蔽词列表,默认为空,示例如下
GROUP_MINUTE 【可选】合并去重分钟数,表示按n分钟分组后对弹幕合并去重,默认为1,最大值为30,0表示不去重
PROXY_URL 【可选】代理地址,示例: http://127.0.0.1:7897 ,目前只对巴哈姆特生效(注意:如果巴哈姆特请求不通,会拖慢搜索返回速度,所以除vercel/netlify/cloudflare之外默认不开启bahamut源,开启请先在SOURCE_ORDER环境变量中添加bahamut)如果你使用docker部署并且访问不了bahamut源,请配置代理地址;vercel/netlify/cf中理应都自然能联通,不用填写
RATE_LIMIT_MAX_REQUESTS 【可选】限流配置:1分钟内同一IP最大请求次数,默认为3,设置为0表示不限流
SEARCH_CACHE_MINUTES 【可选】搜索结果缓存时间(分钟),默认为1,避免短期内重复的不必要API请求,同时保证获取最新的结果列表,可根据需要调整:Vercel/Cloudflare建议1-5分钟,Docker可设置5-30分钟,设置为0表示不缓存
UPSTASH_REDIS_REST_URL 【可选】update redis url,需配合UPSTASH_REDIS_REST_TOKEN使用,用于持久化存储,不会因为冷启动而丢失过去的查询信息(在cf/eo/claw上配置后应该能更稳定点,也能解决小幻掉匹配的问题,但会稍微影响请求速度),获取方法请参考:https://cloud.tencent.cn/developer/article/2424508
UPSTASH_REDIS_REST_TOKEN 【可选】update redis token,需配合UPSTASH_REDIS_REST_URL使用,用于持久化存储,不会因为冷启动而丢失过去的查询信息(在cf/eo/claw上配置后应该能更稳定点,也能解决小幻掉匹配的问题,但会稍微影响请求速度),获取方法请参考:https://cloud.tencent.cn/developer/article/2424508
# EPISODE_TITLE_FILTER 默认值
(特别|惊喜|纳凉)?企划|合伙人手记|超前(营业|vlog)?|速览|vlog|reaction|纯享|加更(版|篇)?|抢先(看|版|集|篇)?|抢鲜|预告|花絮(独家)?|特辑|彩蛋|专访|幕后(故事|花絮|独家)?|直播(陪看|回顾)?|未播(片段)?|衍生|番外|会员(专享|加长|尊享|专属|版)?|片花|精华|看点|速看|解读|影评|解说|吐槽|盘点|拍摄花絮|制作花絮|幕后花絮|未播花絮|独家花絮|花絮特辑|先导预告|终极预告|正式预告|官方预告|彩蛋片段|删减片段|未播片段|番外彩蛋|精彩片段|精彩看点|精彩回顾|精彩集锦|看点解析|看点预告|NG镜头|NG花絮|番外篇|番外特辑|制作特辑|拍摄特辑|幕后特辑|导演特辑|演员特辑|片尾曲|插曲|高光回顾|背景音乐|OST|音乐MV|歌曲MV|前季回顾|剧情回顾|往期回顾|内容总结|剧情盘点|精选合集|剪辑合集|混剪视频|独家专访|演员访谈|导演访谈|主创访谈|媒体采访|发布会采访|采访|陪看(记)?|试看版|短剧|精编|Plus|独家版|特别版|短片|发布会|解忧局|走心局|火锅局|巅峰时刻|坞里都知道|福持目标坞民|.{3,}篇|(?!.*(入局|破冰局|做局)).{2,}局|观察室|上班那点事儿|周top|赛段|直拍|REACTION|VLOG|全纪录|开播|先导|总宣|展演|集锦|旅行日记|精彩分享|剧情揭秘

# 如果你想新增过滤词,请自定义EPISODE_TITLE_FILTER,示例如下,每个词用'|'隔开,增加的词都会追加到默认值后面
测试|test
# BLOCKED_WORDS 示例值
/.{20,}/,/^\d{2,4}[-/.]\d{1,2}[-/.]\d{1,2}([日号.]*)?$/,/^(?!哈+$)([a-zA-Z\u4e00-\u9fa5])\1{2,}/,/[0-9]+\.*[0-9]*\s*(w|万)+\s*(\+|个|人|在看)+/,/^[a-z]{6,}$/,/^(?:qwertyuiop|asdfghjkl|zxcvbnm)$/,/^\d{5,}$/,/^(\d)\1{2,}$/,/\d{1,4}/,/(20[0-3][0-9])/,/(0?[1-9]|1[0-2])月/,/\d{1,2}[.-]\d{1,2}/,/[@#&$%^*+\|/\-_=<>°◆◇■□●○★☆▼▲♥♦♠♣①②③④⑤⑥⑦⑧⑨⑩]/,/[一二三四五六七八九十百\d]+刷/,/第[一二三四五六七八九十百\d]+/,/(全体成员|报到|报道|来啦|签到|刷|打卡|我在|来了|考古|爱了|挖坟|留念|你好|回来|哦哦|重温|复习|重刷|再看|在看|前排|沙发|有人看|板凳|末排|我老婆|我老公|撅了|后排|周目|重看|包养|DVD|同上|同样|我也是|俺也|算我|爱豆|我家爱豆|我家哥哥|加我|三连|币|新人|入坑|补剧|冲了|硬了|看完|舔屏|万人|牛逼|煞笔|傻逼|卧槽|tm|啊这|哇哦)/

# 注释如下:
/.{20,}/  # 屏蔽20字符及以上的弹幕
/^\d{2,4}[-/.]\d{1,2}[-/.]\d{1,2}([日号.])?$/  # 屏蔽日期弹幕
/^(?!哈+$)([a-zA-Z\u4e00-\u9fa5])\1{2,}/  # 屏蔽单个汉字或者字母连续出现3次及以上的弹幕(排除纯“哈”重复)
/[0-9]+.[0-9]\s(w|万)+\s*(\+|个|人|在看)+/  # 屏蔽几点几万在看的弹幕
/^[a-z]{6,}$/  # 屏蔽6个及以上连续小写字母的弹幕
/^(?:qwertyuiop|asdfghjkl|zxcvbnm)$/  # 屏蔽键盘连续行的弹幕
/^\d{5,}$/  # 屏蔽5位及以上纯数字的弹幕
/^(\d)\1{2,}$/  # 屏蔽三个及以上相同数字重复的弹幕
/\d{1,4}/  # 屏蔽1-4位数字的弹幕
/(20[0-3][0-9])/  # 屏蔽2000-2039年份相关的弹幕
/(0?[1-9]|1[0-2])月/  # 屏蔽月份表述的弹幕
/\d{1,2}[.-]\d{1,2}/  # 屏蔽类似时间或日期分隔的数字弹幕
/[@#&$%^*+\|/\-_=<>°◆◇■□●○★☆▼▲♥♦♠♣①②③④⑤⑥⑦⑧⑨⑩]/  # 屏蔽特殊符号或表情符号的弹幕
/[一二三四五六七八九十百\d]+刷/  # 屏蔽数字或汉字数字后跟“刷”的弹幕
/第[一二三四五六七八九十百\d]+/  # 屏蔽“第几”序号相关的弹幕
/(全体成员|报到|报道|来啦|签到|刷|打卡|我在|来了|考古|爱了|挖坟|留念|你好|回来|哦哦|重温|复习|重刷|再看|在看|前排|沙发|有人看|板凳|末排|我老婆|我老公|撅了|后排|周目|重看|包养|DVD|同上|同样|我也是|俺也|算我|爱豆|我家爱豆|我家哥哥|加我|三连|币|新人|入坑|补剧|冲了|硬了|看完|舔屏|万人|牛逼|煞笔|傻逼|卧槽|tm|啊这|哇哦)/  # 屏蔽常见互动、报到或口语化弹幕词汇

采集源及对应平台列表

采集源 平台列表
360 qiyi, bilibili1, imgo, youku, qq
vod qiyi, bilibili1, imgo, youku, qq
tencent qq
renren renren
hanjutv hanjutv
bahamut bahamut

项目结构

danmu_api/
├── .github/
│   └── workflows/
│       ├── docker-image.yml
│       └── sync_fork.yml # vercel自动同步配置文件
├── danmu_api/
│   ├── esm-shim.js     # Node.js低版本兼容层
│   ├── server.js       # 本地node启动脚本
│   ├── worker.js       # 主 API 服务器代码
│   ├── worker.test.js  # 测试文件
├── netlify/
│   └── functions/
│       └── api.js      # netlify 中间处理逻辑
├── node-functions/
│   ├── [[...path]]..js # edgeone pages 所有路由跳转指向index
│   └── index.js        # edgeone pages 中间处理逻辑
├── .env.example
├── .gitignore
├── Dockerfile
├── edgeone.json        # edgeone pages 配置文件
├── LICENSE
├── netlify.toml        # netlify 配置文件
├── package.json
├── README.md
├── vercel.json         # vercel 配置文件
└── wrangler.toml       # cloudflare worker 配置文件

注意事项

  • 日志存储在内存中,服务器重启后会清空。
  • /api/logs 中的 JSON 日志会格式化显示,带缩进以提高可读性。
  • 搜索结果和弹幕数据存储在内存中,服务器重启后会清空,可通过配置 UPSTASH_REDIS_REST_URL 和 UPSTASH_REDIS_REST_TOKEN 启用 Redis 持久化存储。
  • 搜索结果缓存默认时间为 1 分钟,可通过环境变量 SEARCH_CACHE_MINUTES 调整(设置为 0 表示不缓存)。
  • 确保 package.json 中包含 node-fetch 依赖。
  • 一键部署需要将项目推送到公开的 Git 仓库(如 GitHub),并更新按钮中的仓库地址。
  • 运行 Docker 容器时,需通过 -e TOKEN=87654321 传递 TOKEN 环境变量。
  • cloudflare貌似被哔风控了。
  • 如果想更换兜底第三方弹幕服务器,请添加环境变量OTHER_SERVER,示例https://api.danmu.icu。
  • 如果想更换vod站点,请添加环境变量VOD_SERVERS,示例金蝉@https://zy.jinchancaiji.com,789@https://www.caiji.cyou,听风@https://gctf.tfdh.top(支持多个服务器并发查询)。
  • 当配置多个VOD站点时,可通过VOD_RETURN_MODE环境变量控制返回结果方式:all(返回所有站点结果)或fastest(默认,只返回最快的站点结果,避免结果过多)。
  • 推荐vercel/netlify部署,cloudflare/edgeone/claw不稳定,当然最稳定还是自己本地docker部署最佳。
  • /api/v2/comment接口默认限流:1分钟内同一IP只能请求3次,可通过环境变量RATE_LIMIT_MAX_REQUESTS调整(设置为0表示不限流)。

关联项目

喂饭教程1:danmu_api vercel 自动同步部署方案 - 永远保持最新版本!实时同步原作者更新

喂饭教程2:logvar弹幕搭建教程(docker/claw)

部署完成后在播放器填写后弹幕未生效自主排查步骤

以API示例 http://192.168.1.7:9321/87654321 为例

  1. 首先确认你的api部署成功 访问 http://192.168.1.7:9321/87654321 有json输出
  2. 检查你在播放器的填写是否正确,有无多余空格等
  3. 播放器请求后,查看 http://192.168.1.7:9321/87654321/api/logs 日志,看请求是否有报错,比如有用户在自己软路由上搭建,但走了全局代理,导致人人等访问不了,请确保走直连
  4. 如果你播放的影片片名不规范,很可能搜不到,请确保片名规范

贡献者

contributors

📈项目 Star 数增长趋势

Star History

Star History Chart