# danmu **Repository Path**: teakong/danmu ## Basic Information - **Project Name**: danmu - **Description**: 一行代码,集成推送和弹幕API,适用于任何网站。可以自动识别当前浏览的内容发送AI弹幕,还可以自由发布公告、历史评论推送到弹幕,包括不限于个人博客、游戏直播等场景,无需后端开箱可用。 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-06 - **Last Updated**: 2026-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI弹幕组件 一行代码,为任意网站接入弹幕系统。支持 AI 自动弹幕、WebSocket 实时推送、点赞/关闭交互、后端审核过滤,适用于个人博客、直播、评论系统等场景,无需后端开箱可用。 ## 在线演示 | 页面 | 地址 | 说明 | | ---- | ---- | ---- | | [无后端集成](https://teakong.github.io/danmu/index.html) | `https://teakong.github.io/danmu/index.html` | 纯前端弹幕 + 浮窗控制 + 弹幕发送 | | [后端过滤系统](https://teakong.github.io/danmu/server.html) | `https://teakong.github.io/danmu/server.html` | 后端审核 + Redis 缓存 + 注册用户推送 | | [最简集成](https://teakong.github.io/danmu/simple.html) | `https://teakong.github.io/danmu/simple.html` | 一行 script 标签集成示例 | ## 代码仓库 | 平台 | 地址 | 说明 | | ---- | ---- | ---- | | [GitHub](https://github.com/teakong/danmu) | `https://github.com/teakong/danmu` | 国际用户首选 | | [Gitee 码云](https://gitee.com/teakong/danmu) | `https://gitee.com/teakong/danmu` | 国内用户加速访问 | ## 特性 - **一行代码集成**:引入 danmu.js 即自动加载依赖、连接通道、渲染弹幕 - **AI 弹幕**:自动识别当前浏览内容,定时轮询生成并推送 AI 弹幕 - **实时 WebSocket 推送**:基于 Socket.IO,消息低延迟到达 - **浮窗控制面板**:右下角浮动图标,支持停止/启动弹幕、调整透明度/字号/速度/显示区域 - **弹幕发送输入框**:右下角图标点击展开输入框,支持回车发送、关闭按钮 - **开关状态持久化**:弹幕开/关状态写入 localStorage,刷新页面自动恢复 - **后端过滤**:支持 danMuFilter 回调,业务方可异步校验弹幕合法性、查询点赞数 - **点赞 / 关闭交互**:每条弹幕支持点赞(带计数)、关闭/举报按钮 - **可配置**:透明度、字号、飞行速度、颜色、底部高度、点赞/关闭开关均可自定义 - **去重防刷**:按 item.id 去重,避免同一条弹幕重复飞过 - **生命周期管理**:提供 destroy() 方法销毁所有资源,支持重新初始化 - **无需后端开箱可用**:自带 server.php 演示,前端直接调用 jquery.barrager.js 也能渲染 ## 目录结构 ``` danmu/ ├── index.html # 演示页(无后端集成 + 浮窗控制 + 弹幕发送) ├── server.html # 演示页(后端过滤 + Redis 缓存 + 注册用户推送) ├── simple.html # 最简集成示例(一行 script 标签) ├── server.php # 弹幕服务端演示(init/filter/send 路由) ├── FileCache.php # 文件缓存工具 ├── KV.php # KV 缓存接口 ├── RedisCache.php # Redis 缓存实现 ├── LICENSE └── static/ ├── css/ │ ├── barrager.css # 弹幕样式(close/like 图标、背景、动画) │ ├── pusher.css # 推送面板样式 │ └── images/ # 弹幕图标与图片 │ ├── dan-hover.svg # 弹幕运行中图标 │ ├── dan-close.svg # 弹幕已停止图标 │ ├── dan-config.svg # 弹幕设置图标 │ ├── close.svg heart_default.svg heart_hover.svg heart_liked.svg │ └── dan.png *.gif └── js/ ├── danmu.js # 一行集成入口(自动加载依赖 + 调用 init) ├── pusher.js # WebsitePusher 组件主体(推送 + 弹幕 IIFE) ├── danmu-float.js # 浮窗控制面板(停止/启动/设置面板) ├── jquery.barrager.js # 弹幕渲染引擎(定制版:点赞/关闭/透明度/onAction) ├── jquery.min.js # jQuery ├── socket.io.min.js # Socket.IO 客户端 ├── md5.js # md5 工具 └── tinycolor-0.9.15.min.js # 颜色处理(pick-a-color 依赖) ``` ## 快速开始 ### 最简集成(一行代码) 在任意 HTML 页面引入一行 script 标签即可: ```html ``` 或直接使用云端服务: ```html ``` danmu.js 会按序自动加载 md5.js / socket.io.min.js / jquery.barrager.js / pusher.js 与 barrager.css,就绪后调用 WebsitePusher.init() 连接 WebSocket 通道,实时接收并渲染弹幕。 **URL 参数说明:** | 参数 | 说明 | | ---- | ---- | | appName | 应用名称(必填,用于数据统计) | | channelCode | 推送通道码,到弹幕云服务官网注册后获取 | | danMu | 1=开启弹幕,0=关闭 | | danmu | AI 弹幕轮询间隔(秒),0=关闭 | | hideDialog | 1=隐藏推送对话框 | | hidePanel | 1=隐藏推送面板 | | hideIcon | 1=隐藏右下角浮窗图标 | ### 高级集成(自定义配置) ```javascript WebsitePusher.init({ appName: "我的弹幕", channelCode: "你的通道码", danMu: 1, hidePanel: 1, hideDialog: 1, danMuSetting: { opacity: 50, // 背景不透明度 0~100 size: 20, // 字号 8~33 speed: 18, // 飞行秒数 like: 1, // 显示点赞按钮 close: 0, // 不显示关闭按钮 color: "#fff", // 文字颜色 danmu: 30, // 每30秒轮询一次AI弹幕云服务,AI大模型识别当前网页自动生成弹幕 selector: "body" // 默认选择body, 可通过公开API: setDanMuArea设置区域 }, // 弹幕初始化闸门:return false 时不创建 socket 连接 danMuInitCallback: function (settings) { var enabled = localStorage.getItem("danmu_enabled"); return enabled !== "0"; }, // 右下角弹幕图标首次点击(开启弹幕发送) danMuSendOpen: function (settings) { localStorage.setItem("danmu_enabled", "1"); // 创建弹幕发送输入框... }, // 右下角弹幕图标再次点击(关闭弹幕发送) danMuSendClose: function (settings) { localStorage.setItem("danmu_enabled", "0"); // 移除弹幕发送输入框... }, // 弹幕发送后回调(异步推送到后端) sendCallback: function (item, settings) { $.getJSON('server.php', { type: 'send', channelCode: settings.channelCode, head: item.info }); } }); ``` ### 本地演示 直接双击浏览器访问: ``` http://localhost/danmu/index.html # 无后端集成演示 http://localhost/danmu/simple.html # 最简集成示例 ``` 把整个目录放到 PHP 环境(如 XAMPP / phpStudy),浏览器访问: ``` http://localhost/danmu/server.html # 后端过滤演示 ``` ## WebsitePusher 公开 API ### init(options) 接入入口。options 为 settings 覆盖项,嵌套对象(如 danMuSetting)按字段深合并。 ### 运行时控制方法 | 方法 | 说明 | | ---- | ---- | | init(options) | 接入入口,options 为 settings 覆盖项 | | destroy() | 销毁所有资源(DOM/事件/Socket.IO/定时器/缓存),销毁后可重新调用 init() | | stopDanMu() | 停止弹幕:断开 Socket.IO、停 AI 轮询、清屏,保留 token 供恢复 | | startDanMu() | 启动弹幕:重连 Socket.IO、重启 AI 轮询。返回 false 表示 token 不存在无法启动 | | sendDanMu(item) | 主动发送弹幕(仅当前屏幕滚动,不请求后端) | | updateDanMu(options) | 更新弹幕配置并立即生效(外观/AI 轮询) | | hideDanMu() | 隐藏弹幕(visibility:hidden,动画继续不丢消息) | | showDanMu() | 显示弹幕(移除 hideDanMu 的隐藏样式) | | pauseDanMu() | 暂停弹幕(冻结滚动,新消息暂存队列) | | resumeDanMu() | 恢复弹幕(重启滚动,刷新暂存队列) | | clearDanMu() | 清屏(移除所有弹幕元素 + 清空暂停队列,不影响连接) | | setDanMuArea(ratio) | 设置显示区域比例(0.1~1,如 0.5=上半屏) | ### settings 配置项 | 分类 | 字段 | 说明 | | ---- | ---- | ---- | | 基础 | siteName / apiKey / cssSite / jsSite | apiKey 为服务端鉴权契约,勿改名 | | 地址 | pcUrl / pushUrl / apiUrl / authUrl / wsUrl / channelMemberUrl | 弹幕云服务固定地址 | | 用户态 | channelCode / uid / name / createTime / token / avatar / device / clientVersion / screenResolution / userPlatformType / userPlatformVersion | — | | 行为开关 | hideDialog(0/1) / hidePanel(0/1) / danMu(0/1) | hideIcon(0/1) 控制右下角浮窗 | | 文案 | closeText | 弹幕关闭按钮自定义文案 | | 消息 | messageLength | messageIdList 容量上限,默认 20000 | ### danMuSetting 配置项 | 分类 | 字段 | 说明 | | ---- | ---- | ---- | | 外观 | opacity(0~100) / size(8~33) / speed(飞行秒数) / color(文字颜色) / bottom(底部偏移px) | — | | 开关 | close(0/1) / like(0/1) / selector(挂载选择器,默认 body) | — | | AI | danmu(轮询秒数,0=关) / danmuUrl(AI接口,空则回退 apiUrl) / bottomradio(固定底部开关) | — | | 浮窗 | hideIcon(0/1) | 是否隐藏右下角浮窗图标 | ### 回调钩子 均为 settings 属性,回调内 this 指向 settings: | 钩子 | 签名 | 说明 | | ---- | ---- | ---- | | configCallback | (params) => boolean | 打开客服窗口前的拦截,false 则不打开 | | danMuInitCallback | (settings) => boolean | 弹幕初始化闸门,false 则不创建 socket 连接(token 仍保存供 startDanMu 恢复) | | danMuSendOpen | (settings) => any | 右下角弹幕图标首次点击时触发(开启弹幕发送) | | danMuSendClose | (settings) => any | 右下角弹幕图标再次点击时触发(关闭弹幕发送) | | danMuFilter | (item) => any | 每条弹幕分发入口(默认走过滤链) | | danMuFilterCallback | (item, cb) => any | 内部方法,不允许重写;按 item.id 去重 + info 非空校验 | | danMuPopCallback | (dom, item) => any | 弹幕挂载后回调,默认绑定 onAction(barrage, action) | | checkAiDanMu | (doc, pollCount) => any | AI 弹幕轮询入口;pollCount 为第 N 次轮询 | | sendCallback | (item, settings) => any | sendDanMu 发送完成后的回调 | ## 弹幕分发链路 一条弹幕从远端到屏幕的完整流程: ``` 弹幕消息 -> SocketIO(监听到通道有新的弹幕) -> buildBarragerItem(套用 danMuSetting 默认值) -> danMuFilter(业务方异步校验/查询点赞数) -> danMuFilterCallback(去重/校验) -> danMuPopCallback(设置 onAction) -> $(selector).barrager(item) 渲染 -> 交互走 jquery.barrager.js ``` ## 浮窗控制面板参考示例(danmu-float.js) 该控件可使用AI编辑器开发替换, 页面左下角显示弹幕控制浮窗,包含两个图标: - **左侧图标**(停止/启动弹幕):点击切换弹幕运行状态,图标在 dan-hover.svg(运行中)和 dan-close.svg(已停止)之间切换 - **右侧图标**(设置面板):点击弹出设置面板,支持调整透明度、显示区域、字号、速度 弹幕开/关状态通过 localStorage key `danmu_enabled` 持久化: - `"1"` 或不存在 -> 开启(创建 socket 连接) - `"0"` -> 关闭(不创建 socket 连接,token 仍保存) danMuInitCallback 读取 localStorage 决定是否创建 socket 连接,danMuSendOpen/danMuSendClose 写入 localStorage。 所有开关样式、存储配置和交互逻辑由业务方自行定制开发(考虑到业务方的存储方式可能为localStorage或者后端数据库, 只提供公开API对接开发) ## 无后端/后端集成 ### 场景一:无后端(纯前端弹幕) 前端调用 $.getJSON()所有监听同一个通道的浏览器页面均可见, 只支持danMuSetting.close不支持danMuSetting.like ```javascript $.getJSON("https://www.phprm.com/services/push/trigger/4d05f4abdb0a0c2a0269900809946903?head=这是第一条弹幕&avatar=https://www.phprm.com/push/h5/static/avatar/danMu.png"); ``` ### 场景二:后端过滤(注册用户推送) 通过 danMuFilter 回调,业务方可异步校验弹幕合法性、查询点赞数(支持danMuSetting.like=1): ```javascript danMuFilter: function (item) { var _this = this; $.getJSON('server.php', { type: 'filter', messageId: item.id, bizId: "1" }, function(resp) { if (resp.code != 0 || !resp.data) return; item.num = resp.data.likeCount || 0; _this.danMuFilterCallback(item, function (dom) { _this.danMuPopCallback(dom, item); }); }); } ``` **后端 server.php 路由:** | 路由 | 说明 | | ---- | ---- | | type=init | 弹幕初始化,绑定业务 ID 与通道码,发送欢迎弹幕,缓存 messageIdList | | type=filter | 校验弹幕消息 ID 合法性,查询关联业务数据与点赞数 | | type=send | 业务后端调用推送 API,将 messageIdList 缓存到 Redis 供 filter 校验 | | type=checkAiDanMu | 业务后端调用大模型接口识别当前访问网页的内容生成弹幕推送 API,所有人可见 | ## 兼容性 - 严格 ES5,支持 IE / GBK 页面 - 低版本 jQuery(<1.7)无 on/off 时,danmu.js 会自动用 bind/unbind + delegate/undelegate 兼容 - IE < 9 不兼容 CSS 圆角,采用兼容样式,可单独设置弹幕颜色 old_ie_color,建议不要与网页主背景色相同 - localStorage 不可用时自动回退 cookie,兼容 IE6/7 及 file:// 等异常环境 ## 致谢 - 弹幕渲染引擎基于开源项目 [jquery.barrager.js](https://github.com/yaseng/jquery.barrager.js)(作者 yaseng)二次开发