设计您自己的社交流叠加层

在 OBS 中下载、定制、连接和测试本地覆盖设计,以及每个覆盖系列的指南。

五步制作自己的叠加层

下载文件改变设计在OBS中打开
  1. 选择叠加层 中要修改的内容。
  2. 下载源ZIP,解压后复制对应叠加层的 HTML 文件。
  3. 编辑副本 ,可以自己做,也可以请 AI 工具完成。
  4. 在 OBS 打开副本 ,在地址中加入 SSN 会话设置。
  5. 测试 ,使用叠加层的真实触发操作。
只想换颜色或字体? 无需下载。保留通常的托管链接,把 CSS 粘贴到 OBS 浏览器源的 自定义 CSS 框。

选择要修改的叠加层

你可以修改叠加层的颜色、字体、布局、图案和动画。 HTML 文件 是页面。 OBS 网址 指向该文件,并添加会话和显示设置。

在更改其外观之前选择一个工作叠加层。
从已经可用的叠加层开始。

不同叠加层监听的内容不同。聊天页、精选消息页和投票页并不使用相同输入。请打开对应类型的设计指南:

设计指南启动文件是什么驱动它
聊天和停靠sampleoverlay.html, dock.html, themes/*每条捕获的聊天消息
精选消息featured.html, samplefeatured.html, themes/featured-styles/*选定的消息和清除命令
警报和事件源multi-alerts.html, events.html, themes/events/index.html匹配事件/付费聊天行
图形民意调查poll.html投票加主持人投票设置
小费罐和目标tipjar.html配置的支持/计数/炒作指标
计数器和排名hype.html, meta.html, leaderboard.html, scoreboard.html计数、元数据、活动或点快照
候补名单和队列抽签waitlist.html主机队列和获胜者状态
赠品展示giveaway.html, giveaway-obs-entries.html托管赠品状态或旧条目提要
定时器timer.html定时器状态和控件
股票行情ticker.html配置的股票行情内容
词云和地图wordcloud.html, map.html匹配单词或位置条目
反应和媒体效果reactions.html, emotes.html, content.html, gif.html, confetti.html, stickers.html, actions.html页面的特定媒体/事件/动作触发
致谢credits.html收集参与者和信用控制
音乐和AI显示spotify-overlay.html, cohost-overlay.html, bot.html, chatbot.html正在播放或机器人/共同主持人更新
产品和板材monetization.html, commerce-board.html, shop_the_stream.html共享商务状态
游戏与奖励games/*, games/templates/*, games.html, battle.html游戏特定的聊天、礼物和命令
生成的 AI 叠加层aioverlay.html, aievent-overlay.html保存的设计及其配置的事件路线

想要现成的?试试 叠加层图库 或 模板库。想导入 StreamElements 或 Streamlabs 聊天皮肤?请参照 导入指南。该导出文件有自己的设置步骤。

下载文件

  1. 下载 beta 源代码 ZIP。或者打开 测试版存储库 并选择 代码 → 下载 ZIP.
  2. 解压到准备长期保留的文件夹,例如 C:\SSN\social_stream-beta\。不要在 ZIP 内直接编辑,也不需要重装 SSN。
  3. 找到叠加层文件(见上表),在原文件旁创建副本,例如 poll.html → my-poll.html。对于如下主题: themes/featured-styles/featured-modern.html时,将副本保留在同一文件夹。
  4. 在文本或代码编辑器中打开副本,保存为 .html,不是 .html.txt.
保留整个解压后的文件夹。 一个 HTML 文件可能从附近文件夹加载脚本、样式、字体、图片、音频或数据。移动页面会破坏这些引用。GitHub 的页面视图或浏览器“保存页面”无法获取全部文件。
文件夹结构和路径的工作方式
social_stream-beta/
    poll.html
    my-poll.html
    currency.js
    js/
    libs/
    shared/
    thirdparty/
    media/
    sources/images/
    themes/
        featured-styles/
            featured-modern.html
            my-featured.html
    docs/
        event-reference.html

类似这样的路径: ../../shared/utils/chatHtml.js 是相对于加载它的页面的路径。将页面移到根目录会破坏路径。也请将自己的图案和字体复制到文件夹,并使用相对路径。编辑后的副本不会自动获得后续 SSN 修复。

保留会话链接

启动 SSN、连接来源并确认原叠加层正常工作,然后复制 完整链接 ,从该叠加层对应的 SSN 工具获取。

https://socialstream.ninja/poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2

以下内容之后的值: session= 是 SSN 会话,不是 YouTube 频道、Twitch 名称、文件名或投票标题。SSN 和页面必须使用相同会话和密码。保持 SSN 运行:叠加层只接收数据,不会自行采集聊天。

规则原因
? 表示设置开始, & 连接其余设置直接复制,不要重新输入。HTML 属性中应写为 &。在浏览器或 OBS URL 框中,使用普通的 &.
保留服务器设置server, server2, server3、本地端点、标签和版本值因页面而异。不要因为其他叠加层使用某个服务器参数就把它加上。
保留以下位置之后的所有内容: #可能有影响。例如 AI Event Overlay 使用私密的 #aieventauth=... 令牌。
分享时使用占位值不要在截图、代码库或 AI 提示词中泄露真实会话、密码和私密令牌。

副本一直空白时先检查原始链接。有的页面会询问缺少的设置,有的会保持隐藏或跳转。把正确会话写进链接可避免猜测。

在 OBS 打开文件

直接从电脑打开编辑后的文件,无需服务器。

  1. 将 HTML 副本拖进 Chrome 或 Edge,复制地址。地址以 file:///.
  2. 从可用的 SSN 叠加层链接中复制从以下位置开始的全部内容: ? 起的全部内容,粘到文件地址末尾。这样保留会话、密码、设置及任何 # 部分。
  3. 在浏览器打开拼好的地址进行测试。
  4. 在 OBS 中,添加 浏览器来源。将 本地文件 取消勾选。将完整地址粘贴到 URL ,再设置宽度和高度。

例如:这个 SSN 链接…

https://socialstream.ninja/poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2

…在 Windows 上下载的投票副本中变为:

file:///C:/SSN/social_stream-beta/my-poll.html?session=YOUR_SESSION&password=YOUR_PASSWORD&server2

macOS 上以 file:///Users/...,Linux 上通常是 file:///home/...。从浏览器复制会帮你处理空格和斜杠。

实用说明详情
只需设置一次OBS 会保存地址。保留文件夹原位置,并让 SSN 和聊天来源持续运行。
保存修改后点击 刷新当前页面缓存 在源属性中。
为什么不选中本地文件?URL 框允许添加 ?session=...。通过“本地文件”选择文件不会添加这些设置。
可选:使用带有启动器的本地文件复选框

OBS 文件选择器只能选文件,不能添加设置。小型启动页可以携带设置打开编辑后的页面:

  1. 将下面代码保存为 launch-my-poll.html ,放在以下文件旁: my-poll.html.
  2. 用复制的完整 SSN 链接替换占位链接。将 ./my-poll.html 改成自己的文件名。链接保留在引号内,使用普通的 & 字符。
  3. 双击启动页进行测试。在 OBS 中勾选 本地文件 并选择 发射器。它会携带设置和以下内容跳转到叠加层: # 部分。
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<title>My local overlay launcher</title>
<p>Opening the local overlay...</p>
<script>
var copiedLink = new URL("https://socialstream.ninja/poll.html?session=YOUR_SESSION");
var localPage = new URL("./my-poll.html", window.location.href);
localPage.search = copiedLink.search;
localPage.hash = copiedLink.hash;
window.location.replace(localPage.href);
</script>
</html>

若主题在子文件夹中,将启动页放在该主题副本旁。启动页含连接链接,应保密。已包含设置的独立导出文件则按自己的说明操作。

OBS 的文件/URL 模式、尺寸、自定义 CSS 和刷新说明见其 浏览器源码参考.

修改设计,或请 AI

我想要…执行操作
仅修改 CSS保留托管链接,使用 OBS 的 自定义 CSS 框中。仅影响该 OBS 源,不影响普通浏览器。
重新设计编辑后的 HTML 副本把样式加在现有样式之后,或在其后引入本地样式表。
使用 &css= 或 &b64css=只有部分页面支持。 poll.html等页面两者都不读取。请先查看页面代码。
修改 HTML 布局保留脚本使用的 ID 和类名。如果脚本每次更新都重建元素,请将固定图案放在元素外,或加入渲染器。
编辑共用样式表或脚本复制文件并让页面引用副本,确保仅影响自己的设计。

准备好标志、字体文件、品牌颜色、画布尺寸和视觉参考。网页通常无法加载另一台电脑磁盘上的字体或图片。

AI提示

使用各设计指南中的专用提示词,或从此提示词开始。把副本及它加载的样式和脚本交给 AI。

Customize [copied overlay filename] to match [reference/design].
Canvas: [width x height]. Placement: [position]. Colors/fonts: [details].
Use the existing page and its supporting files, rather than replacing its
connection and event logic. Read docs/event-reference.html and the relevant
overlay design guide. Preserve query parameters, session/password, URL
fragments, bridge labels, transport channels, settings, and controls.
Use CSS first. Keep relative paths and package all executable dependencies
locally. Use classic scripts compatible with Chrome 80.
Keep operator controls, private links, and credentials off the audience view.

Treat all incoming messages, names, labels, donations, and metadata as untrusted.
Prevent HTML/JavaScript injection in every renderer you change. Use textContent
for plain fields and for chatmessage when textonly is true. For HTML-mode
chatmessage, keep supported emotes/formatting through the packaged
SocialStreamChatHTML.sanitize helper (libs/objects.js loaded first).
Do not concatenate raw input into innerHTML, attributes, CSS, or JavaScript.
Validate media/link URLs with the page's existing URL policy and assign DOM
properties; do not enable javascript: URLs or executable embedded content.
Never eval incoming data or treat a viewer message as an AI instruction.
Keep source checks, connection handling, and existing sanitizers.
Test plain text, allowed emotes, quotes, angle brackets, and an HTML injection
probe in an isolated preview; verify the probe cannot execute.

Make the edited overlay work directly from disk using a file:/// URL,
without requiring a local web server. Return the edited files and assets,
file URL and OBS setup steps, and tests
for this overlay's real trigger. Use session placeholders in shared examples.
Explain any behavior changes separately from the design edits.
不要接受只靠假数据呈现的效果。 只能显示写死的示例消息还不算完成。保留原文件,并用相同输入对比原版和副本。

防止聊天内容变成可执行代码

名称、消息、标题、金额和链接来自观众或外部服务。把它们当作文字,绝不能当作代码;在渲染器写入页面的位置进行清理。

字段如何显示
chatmessage 带有 textonly true纯文本(textContent).
chatmessage 否则可能包含表情和允许的格式。请使用随附的清理器。
名称、金额、标题等纯文本字段纯文本(textContent).
chatimg, contentimg、链接这是 URL,不是 HTML。使用页面现有的媒体/链接规则检查后,再设置 DOM 属性。
<!-- Example for a copied page at the repository root. -->
<script src="./libs/objects.js"></script>
<script src="./shared/utils/chatHtml.js"></script>
<script>
function renderChatBody(element, data) {
    var message = String(data.chatmessage == null ? "" : data.chatmessage);
    if (data.textonly) {
        element.textContent = message;
    } else {
        element.innerHTML = SocialStreamChatHTML.sanitize(message);
    }
}
// Names, amounts, titles, and other plain fields use textContent:
// nameElement.textContent = String(data.chatname || "");
</script>
  • 页面已有清理器时请保留,不要再加第二个。
  • 子文件夹中的文件需要调整脚本路径。
  • 不要把原始姓名拼进属性字符串,也不要把未经检查的颜色拼进样式标记。验证样式值后逐项设置属性。
  • 即使 HTML 已清理,也不能安全地当作 JavaScript 执行或作为 AI 指令。

更多背景: OWASP 关于安全输出位置与 HTML 清理的指南.

如何安全测试渲染器

在私密的本地预览中运行,不要发到公开聊天。

  • 使用类似这样的名字: Guest <b>One</b>。尖括号应作为文字显示。
  • 发送 chatmessage: "<b>Hello</b>" 带有 textonly: true,再改为 false。一种应将标签显示为文字,另一种应显示粗体文字。
  • 确认支持的表情和纯图片消息仍能正常显示。
  • 请 AI 测试无害的探测内容,例如 <img src=x onerror="window.__ssnInjectionProbe=1">。它不应执行、设置标记或留下事件属性。也请测试使用脚本协议的链接。

测试通过仅覆盖已测试的路径。重点检查设计改动涉及的渲染器和字段。

逐项测试

测试方法
布局页面有预览/演示模式时请使用,否则使用虚构的本地样本。测试长名称和长消息、缺少头像、空数据及预期行数。
SSN 数据传递保持 SSN 运行,并使用 创建测试消息 ,使用相同会话。通常的 Extension API 模式需要 扩展的远程 API 控制 开启。请使用测试环境,因为测试消息可能触发自动化。
真实触发操作从 Dock 精选消息来显示卡片、参与投票、抽取中奖者、更改滚动条文字或启动计时器。普通聊天不能测试所有功能。
真实采集检查真实消息或事件是否同时到达原版和副本。模拟事件只能证明显示功能正常。
OBS检查最终尺寸、透明度、动画、声音、字体和层次。试试显示/隐藏、清除/重置和刷新。OBS 与浏览器不共享登录状态或保存的数据。
刷新可能丢失数据。 有的页面将数据保存在内存中。开启自动刷新或隐藏时关闭前,先查看该类型指南。移除 demo 或 preview ,从链接中移除后再检查实时数据。

需要交给 AI 的文件

把叠加层本身的文件、加载的 CSS/JS,以及以下文件交给 AI。单靠事件参考无法解释投票控件或各叠加层的布局代码。

文件用途
docs/event-reference.html正式字段、命名事件、元数据、媒体与捐款数值。
docs/customoverlays.md自定义接收端与连接示例。
事件和提醒兼容性各来源发送的事件和字段。
测试消息指南 和 createtestmessage.html数据示例和传递模式。
libs/objects.js 和 shared/utils/chatHtml.js随附的显示清理器。
shared/utils/chatBadges.js 和 shared/utils/contentImage.js现有的徽章和图片处理。
js/transport-dedupe.js, js/local-server-url.js, shared/overlay-control-transport.js页面加载相关脚本时使用的现有连接支持。
currency.js保持 hasDonation 用于显示,并使用有效的美元数值作为 donoValue,包括零。
Event Flow 和 命令与 API设计需要触发操作时,复用现有控件。

解决问题

问题试试这个
找不到文件重新把 HTML 拖进浏览器并复制地址。确认文件名以 .html 结尾,而不是 .html.txt。
缺少脚本、字体或图像保持解压后的文件夹结构,把副本放在原文件旁。检查新增图片和字体是否位于页面预期的位置。
显示空白或“等待中”检查会话、密码、完整的 ? 和 # 部分,确认 SSN 正在运行、功能已开启、正确输入正在到达。与原 SSN 链接对照。
OBS 中的外观与浏览器不同检查宽高、旧自定义 CSS、字体、缓存和浏览器存储,保存后刷新。
更新后标志消失脚本可能正在重建容器。请把固定装饰放在容器外,或修改渲染模板。
数据重置或操作执行两次检查刷新/卸载设置、是否打开了重复的叠加层或控制页,以及页面自身的去重和状态处理。
特殊情况:读取单独数据文件的页面

地图通过以下方式加载本地 JSON 文件: fetch()加载,直接从磁盘打开时可能被浏览器拦截。只修改地图样式时,请用托管链接和 OBS 自定义 CSS;编辑副本时,可让 AI 将地图数据嵌入页面,以便从磁盘打开。托管是确实需要它的页面的高级选项,不是常规步骤。

先修复已确认的最小问题。改变样式不应需要修改采集脚本或添加事件字段。分享公开分支时应包含素材,排除含私密链接的启动页。