-
Notifications
You must be signed in to change notification settings - Fork 262
自定义HTML模板
v1.10新增
自定义模板可以完全自定义前端页面,如果你觉得默认的DOM结构满足不了自定义需求,可以用自定义模板。对二次开发者来说,推荐优先写自定义模板而不是改主程序代码,这样用户就不用下载多个blivechat版本了。而且自定义模板支持跨域,这意味着你可以把它部署到任何静态网站,然后用户不用下载任何文件,只需要把模板的URL填到在线版的blivechat配置里就可以用了。你甚至可以不做评论栏,而是做一些更实用的功能,比如语音播报
自定义模板能做的事:
- 完全自定义前端,包括DOM结构、CSS
- 复用blivechat的大部分功能,包括和B站服务器通信、解析消息、翻译弹幕等。基本上只需要自己实现渲染消息
- 监听前端处理过的消息,可以访问默认模板不会展示的勋章等信息
模板本质上是独立的网页,主窗口会通过iframe加载模板,之后主窗口和模板窗口通过消息通信。设计成独立网页的形式有以下优点:
- 可以跨域,二次开发者不需要部署完整的blivechat网站,只需要把模板部署到任意静态网站就能用了。用户也不需要把blivechat下载到本地,可以直接用官方的在线版网站
- 不会限制模板使用的技术栈,可以用Vue3、React、jQuery
后端发现模板列表:
- blivechat前端请求模板列表时,后端会扫描
data/custom_public/templates目录下的子目录,如果有template.json文件则把这个目录识别为一个模板目录 -
template.json文件中的url字段是模板网页的URL。支持相对路径或绝对路径,相对路径是相对于模板目录的
即使不在模板列表里,用户也可以在配置里手动输入模板URL,只要房间页面能拿到模板URL就行
房间页面加载模板:
- 房间页面通过iframe加载模板URL
- 模板向父窗口发送
blcTemplateConnect消息 - 父窗口向模板发送
blcInit消息,内容包含前端版本和部分配置等信息,收到这条消息则连接完成 - 后续的直播间消息会发送给模板
可以参考GitHub Discussions上发布的模板
-
在
data/custom_public/templates目录下新建你的模板目录 -
准备
template.json文件:{ "name": "模板名", "version": "版本,例如1.0.0", "author": "作者", "description": "说明", "thumbnail": "预览图URL,例如thumbnail.jpg", "url": "模板URL,例如index.html" }这里的模板URL和预览图URL都支持相对路径或绝对路径,相对路径是相对于模板目录的
-
html文件中要指定
no-referrer,因为B站的图床有防盗链,如果带Referer则不能显示头像<html> <head> <meta name="referrer" content="no-referrer"> ...
-
把
frontend/src/blcsdk.js文件复制到你的模板目录并导入<script src="./blcsdk.js"></script>
-
在脚本中实现你的消息处理器,继承自
blcsdk.MsgHandlerclass MsgHandler extends blcsdk.MsgHandler { addMsg(msg) { ... } }
具体的接口和消息字段可以参考SDK中的文档注释。推荐实现所有接口,不然会少一些功能
-
模板初始化时初始化SDK
await blcsdk.init()
-
设置消息处理器
blcsdk.setMsgHandler(new MsgHandler())
根据情况有以下的发布方式
把模板目录部署到你自己的静态网站,然后把模板URL发给用户,用户在blivechat主页的配置输入即可
除了上面的让用户输入模板URL,你还可以把template.json文件分发给用户,让他放到本地blivechat的模板目录里。这样的好处是用户可以在模板列表里选择,而不需要记URL。注意template.json里的URL要改成你网站的绝对路径URL,不要用相对路径
这是不可以的,因为浏览器禁止在线网站访问本地文件,即使是通过iframe。虽然可以本地启动一个HTTP服务器来绕过,但我不指望用户懂这个
把模板目录打包分发给用户即可
v1.10.1新增
OBS中的自定义CSS只会注入主窗口,所以一般不会影响模板。如果想让OBS的CSS注入模板窗口,需要满足以下条件:
-
blivechat版本 >= v1.10.1
-
模板用的SDK版本 >= v1.0.1
-
CSS中包含字符串
blc-inject-into-template,你可以把它写到注释里/* blc-inject-into-template */这个字符串只是为了区分CSS是不是OBS注入的。blivechat服务器预设CSS不需要包含这个字符串也可以注入模板