直播事件参考

本页记录 Social Stream Ninja 为主要平台发出的规范事件载荷。在接入新来源、排查集成问题或统一界面标签时,请将其作为共享的权威依据。如需更简短、面向使用方的矩阵,请参阅 事件和提醒兼容性.

重要: 事件是否可用取决于来源、权限和捕获设置。要在停靠面板或精选叠加层中隐藏带事件标记的行,请添加 &hideevents 或 &hideallevents。要隐藏所选事件,请使用 &filterevents=subscription_gift,new_follower,gifted。这些筛选器也可以隐藏带有以下标记的付费行: event;没有事件标记的普通打赏行不会被事件筛选器匹配。其他消息筛选器仍然适用。
选择捕获方法: 对于 YouTube、Twitch 和 Kick, WebSocket 模式 通常提供更广泛的事件覆盖。标准 DOM 捕获读取页面上实际渲染的行和卡片。YouTube Super Chats、Super Stickers 和 Jewel 礼物在两种模式中都有捕获路径;其他礼物、打赏和会员事件因来源而异。受支持的路径和必要设置请参阅平台表格。
正在构建自动化? 请查看 Event Flow 指南 了解如何在自定义触发器、提醒和工作流中使用这些事件载荷。该指南包含 模板变量参考 用于文本格式。
载荷结构: 打赏样式的聊天行应使用 hasDonation 和可选的 donoValue。不要设置 event: "donation" 仅仅因为普通聊天/打赏行有金额;仅对真实平台操作或付费商品类型使用具体事件名称,例如 superchat, supersticker, gift,或 jeweldonation。使用 meta 仅用于使用方确实需要、且现有字段尚未涵盖的额外结构化数据。

功能可用性速览

使用此表查看每种捕获方式目前提供哪些提醒类型。详细载荷说明见下文。

专用的 Multi-Stream Alert Box 将直播事件分为六个核心提醒类别: Follow, Subscription/Member, Donation, Bits/Cheers, Raid/Host,以及 Purchase,以及两个需主动启用的类别(Auction 和 Hype Train)通过 URL 参数启用。这些类别根据现有的 event, membership, subtitle, hasDonation,以及 meta 此处记录的字段;无需单独的载荷格式。

来源 新订阅者 / 会员 新关注者 打赏 计数和其他数据
YouTube(Data API 桥接) 会员加入、续订、赠送 单个订阅者提醒*及总数 Super Chats & Super Stickers 观众、订阅者和观看总数(轮询)
Twitch — DOM 捕获 赠礼包行和获赠通知 - Bits 通过以下字段标记: hasDonation 观众数量、奖励卡片和社区高亮卡片
Twitch — EventSub/Websocket 即时订阅、续订和赠送 即时关注及关注者总数 Cheers、Power-ups 和频道积分兑换 观众/订阅者/关注者总数、直播状态、广告通知
TikTok Live - 关注卡片(TikTok 显示时) 礼物转换为金币总数 观众数量、加入提醒和点赞风暴
YouNow - 粉丝和观众活动 - 来自直播观众面板的观众数量
Favorited Studio - - - 来自直播观众标签页的观众数量
Whatnot - - - 观众数量、加入提醒、直播拍卖元数据、商品和赠品抽奖快照
eBay Live - - - 观众数量、关注者数量、直播事件卡片快照、拍卖页脚元数据(提供时)、爱心回应和即将举行活动的元数据
Streamlabs 提醒框 订阅、礼物、赞助、关注 Cheer/bits、打赏(带货币) Cheer/bits、打赏(hasDonation) 提醒框打开时;也可通过以下方式使用: sources/websocket/streamlabs.html socket 令牌
OBS Flow Actions - - - 用于 Event Flow 的 OBS 输出、场景、回放缓冲区和媒体结束事件,在以下情况下: actions.html 已连接到 OBS WebSocket
Kick — DOM - - - 观众数量及基本奖励/礼物系统通知;如需更丰富的提醒,请使用 Kick 桥接
Kick — Websocket/桥接 新订阅、续订和赠送 关注提醒 + 关注者总数 支持/打赏事件(金额 + 货币) 直播状态、奖励兑换和个人资料元数据
Facebook Live - - DOM 中可见时的 Stars 聊天行、Stars 和观众数轮询
Rumble — DOM 捕获 - - 可见的 Rant 价格 聊天、入站 raid 和观众数轮询
Rumble — Websocket/API URL 新订阅和赠送订阅 关注提醒 + 关注者总数 Rant/打赏(金额 + 货币) 观众总数、订阅者总数、直播状态和聊天信息流
Streamplace - - - 观众数量及聊天姓名、颜色、徽章、回复和链接
WorldsWave - - 存在时的打赏标签 渲染的直播聊天及可选启用的观众数量更新
CHZZK - - 可见的奶酪打赏行 聊天行、徽章图片、表情和观众数轮询
BEAM - - - 聊天行;仅聊天页面提供观众计数器时,还包括观众数轮询
Seal Team Sloth - - - 渲染的弹出聊天行及 viewer_update 启用观众数量时进行轮询
Castyr - - - 渲染的弹出聊天行及可选启用的观众数量更新
RPLAY - - - 已登录 /live/chat/box/ 弹出窗口: type: "rplay" 聊天、头像、等级徽章图像和表情。金币打赏在以下字段中保留金额/单位: hasDonation 用于共享美元换算,不带打赏事件。可选启用的 viewer_update 轮询使用整数 meta 来自 RPLAY 的公开直播端点。排除转发的 Twitch 行。
FLEX TV - - - 渲染的聊天行,包含姓名、作者颜色、徽章图像和会员元数据

*YouTube 订阅者提醒通过轮询获取,可能延迟或不完整。API 参考并未承诺固定的四小时交付窗口。请参阅 官方订阅 API 限制.

字段概览

data 此处指消息对象,不是需要添加的额外包装层。聊天行和仅元数据事件具有不同结构:计数器和状态快照可能省略 chatname/chatmessage。在平台表格中, 消息 描述普通聊天行,而非字面上的 event: "message".

字段 结构 用法
data.type 字符串 叠加层、筛选器和 Event Flow 使用的来源标识符。Instagram 将直播聊天保留为 instagramlive 以及将非直播评论表示为 instagram。请参阅 来源类型指南 用于变体、通用来源和出站路由。
data.chatname 字符串 由来源提供、供消息处理和非叠加层输出使用的显示名称。配置的用户显示名称别名只能在复制的停靠面板和叠加层传输载荷中替换此值。
data.username 字符串 可用时的来源用户名。应用别名的停靠面板或叠加层载荷可能添加此字段以保留原始的 chatname 用于用户操作;规范消息保持不变。
data.userid 字符串 平台专属的用户标识符。用户操作优先使用此值,而非 username 和 chatname.
data.platform字符串(可选)一些集成会将此字段与以下内容一起包含: type。很多来源适配器会省略它;请使用 type 用于来源路由。
data.id字符串 | 数值(可选)消息或事件标识符。其含义取决于来源和传输方式;不要假定它始终是平台原生的管理 ID。使用 meta.messageId 当适配器为删除同步提供它时。
data.donoValue数值(可选)来源提供的数值型等值美元金额,包括估算值。有效值(包括零)会覆盖 currency.js 换算。没有此值时,使用方根据 hasDonation 和来源上下文估算美元金额。原始金额和单位保留在 hasDonation 及现有的提供商元数据中。
data.chatbadges数组 | 字符串(可选)徽章图片 URL 或徽章对象(type: "img" 带有 src, type: "svg" 带有 html,或 type: "text" 带有 text)。转发会将文本徽章的原始标签保留在可选的 rawText 并生成经过转义的 text 用于旧版叠加层。后续转发时,重新生成 text 来自 rawText;不要转义 text 再次。当前渲染器显示 rawText 存在时按字面处理,否则保留旧版编码文本处理。这是表示形式字段,不是渲染 HTML 的许可。旧版来源可以发送单个 HTML 字符串而非数组。渲染徽章的叠加层接受两种格式,并在本地净化徽章 HTML 和 URL,包括发送方为旧版扩展时。无效徽章不得阻止聊天或会员消息显示。
data.event 字符串 | 布尔值 系统活动标识符(例如 viewer_update, subscription_gift, giftpurchase)。普通聊天应将其留空或设为 false,以便叠加层区分系统通知与对话文本。
data.chatmessage 字符串 消息正文。仅在以下条件满足时可包含经过净化/可渲染的 HTML: data.textonly 为 false。
data.textonly 布尔值 仅适用于 data.chatmessage. true 表示渲染 chatmessage 作为纯文本,保留字面标签和看似实体的文本;不要解码、进行 HTML 净化或向该正文添加格式标签。将事件样式应用于显示元素。 false 表示 chatmessage 可以包含经过净化/可渲染的 HTML;不含该标志的旧消息保留此 HTML 行为。其他普通字段为纯文本,以下媒体字段除外: chatimg 和 contentimg。使用以下方式显示纯文本字段: textContent,或在构建 HTML 模板时转义一次;不要删除或反复解码其内容。
data.contentimg 字符串(可选) 内容图片或支持的媒体 URL。在扩展和桌面应用中,需主动启用的 allowExternalGifs 设置会使用消息文本或 HTML 链接中的第一个直接 HTTP(S) GIF 链接填充空字段。URL 路径必须以以下内容结尾: .gif (不区分大小写);保留查询参数和片段。不需要 API 密钥,并保留 chatmessage 和现有附件,并遵循 removeContentImage。可选的 hideExternalGifUrl 设置添加 meta.hideExternalGifUrl: true;停靠面板和精选叠加层仅在图片加载后隐藏对应的 GIF 链接,同时保留周围文本和原始载荷。图片失败或超时会折叠其附件容器,并保留链接可见。仅 GIF 的叠加层在获取图片字节失败时尝试直接显示图片,并在无法获取动画时长时使用已配置的显示时间;失败或停滞的加载会推进队列。它不会添加 event 或更改来源 type。外部图片不经过内容过滤;如果托管方阻止嵌入,可能无法加载。
data.membership 字符串 可读的会员状态,例如 MEMBERSHIP, new_sponsor, gift_recipient。各界面将其用于徽章、筛选器和公告。
data.subtitle 字符串 补充描述(会员时长、等级升级、赠送者等)。保持简短并使用纯文本,方便叠加层将其放在显示名称下方。
data.hasDonation 字符串 货币或虚拟礼物金额($5.00, 500 bits, 300 coins)。即使在以下情况下也要填写: data.event 为空,以便打赏叠加层可以检测到它。
data.meta 数值 | 对象 | 字符串(旧版) 单一计数器(观众、关注者、订阅者)使用纯整数,更丰富的上下文使用对象。一些较旧的事件,例如 Twitch DOM community_highlight,携带字符串。在读取对象属性前检查特定事件的数据结构;新增的结构化详情应放在对象中。
data.firsttime 布尔值 设为 true 当首次聊天者检测和本地数据库都已启用,且这是该用户/来源的第一条已存储聊天消息时。停靠面板用它进行首次聊天高亮和首次聊天提示音筛选;可选的首次聊天徽章设置会在以下字段前添加叶子徽章: chatbadges.
data.lastactivity 数值 启用首次聊天者检测和本地数据库时,该用户上一次已存储聊天活动的 Unix 时间戳(秒)。全新用户省略此字段。

叠加层控制传输与捕获的聊天/事件分开。更新后的接收端使用 ssnControl 封装,其中包含交付 id,展示 target、可选的回复频道和快照客户端 ID。现有功能请求体保持完整。公开功能控制使用频道 7;Actions 保留频道 6。Poll 和 Map 状态包含主播的 epoch, revision 和 reset 标记;Timer、Ticker 和 Spotify 使用 ssnState 带有 epoch 和 revision。这些标记描述主持人状态,并非恢复的投票/聊天历史。来源不得向捕获的消息添加控制封装字段。接收确认不代表操作完成或 OBS 可见。请参阅 迁移状态 了解受支持的功能、回复协商和重连限制。

Phrase Guess 使用原生的 {response: text} 请求,用于 server2 聊天回复,以及 {action: "phraseGuessResponse", value: {type: "bot", chatname: name, chatmessage: text}} 用于仅停靠面板公告。主持人必须启用传入的 server3 消息;禁用主持人控制仍会阻止这些请求。停靠面板公告会作为普通机器人聊天行转发,带有 textonly: true,而不会将它们发送到捕获来源的聊天输入框。旧版 API 模式保留现有命令格式。

Meta 约定

为了保持仪表板和自动化一致,扩展以下内容时请遵循这些约定: data.meta:

  • viewer_update, follower_update, subscriber_update,以及 likes_update 使用纯整数 meta 值。 likes_update 是权威的平台总数:使用方必须直接设置显示值,而不是将其累加。后台脚本将观众数量汇总到 viewer_updates 带有以以下字段为键的对象: data.type.
  • giveaway_state 是由主持人生成、用于受管理显示的仅元数据快照。 meta.giveaway 第 2 版包含 giveawayId,持久的 roundId/epoch,递增的 generation 跨新轮次, revision 在一个轮次内, status, open, draw, keyword, count, ticketCount,冻结的 config,最多 120 个预览 entrants,以及最近的 20 条 winners。条目公开 id, name, platform 和 tickets;获胜者添加 drawnAt 以及授予的 points。Coin Flip Pot 添加 outcome;Number Hunt 添加 number 带有公开的 low, high 和最近的 guesses,绝不包含密钥。使用方按抽奖 ID 筛选并丢弃较旧的 generation/revision。这些是显示样本,不是完整票据账本或付款指令。钱包密钥、余额和预留信息不会出现在面向观众的快照中。主播发布到 giveaway P2P 标签和已启用的叠加层 WebSocket 信息流;这并不表示 OBS 可见。 指南.
  • meta.giveawayControlResult 包含 Event Flow 赠品抽奖操作的结果(ok,可选的 error, giveaway 或 simulated). meta.giveawayHandled 列出已由参与/购买流程操作处理的赠品抽奖 ID,以免自动聊天命令再次扣费。编辑器添加 meta.economyTest 用于模拟赠品抽奖操作;它不是来源平台事件,也不是授权凭据。
  • video_stats 使用结构化的 meta 对象,用于外部编码器/服务器运行状况,包括 provider, label, online, bitrateKbps, rttMs, bufferMs、丢包/丢弃计数器,以及可选的编解码器详情。
  • 打赏样式的事件可包含描述性对象,例如 { amount, currency, supporter } 用于 Kick, { bits } 用于 Twitch cheer。会员事件有自己的来源专属元数据;它们不会自动算作货币打赏。
  • 标准化的 Stripe、Ko-fi、Buy Me a Coffee 和 Fourthwall webhook 消息包含按提供商划定范围的 meta.webhookId,从提供商的稳定事件标识符复制,以便下游页面抑制重试和混合传输导致的重复事件。
  • Twitch 突袭传递 { fromId, fromLogin, viewers }。其他来源不同:Whatnot 使用 meta.numRaiders,SharePlay 则使用可选的 meta.fromLogin/meta.viewers。读取 raid 元数据前请检查特定来源对应的行。
  • Twitch EventSub 奖励兑换提供 meta.rewardId, cost, rewardTitle, redemptionId,以及旧版的 alias 与准备好的消息一起提供。DOM 奖励卡片和其他来源可能提供更少或不同的字段。
  • user_banned 仅含元数据,供管理组件使用。它有意省略 chatname 和 chatmessage;使用 meta.username, meta.displayName, meta.avatarUrl,以及 meta.profileUrl.
  • 支持来源控制删除同步的聊天传输,应将平台原生聊天标识符公开为 meta.messageId 而不是依赖停靠面板内部的 data-mid 值。
  • 来源删除使用 {delete: {type, id}} 用于已知的停靠面板消息 ID,或 {delete: {type, meta: {messageId}}} 用于原生平台消息 ID。已知 ID 只移除匹配的消息。仅知道目标用户时,发送 {delete: {type, userid}} 或 {delete: {type, chatname}} 以从该平台移除该用户的消息。绝不以版主身份替代目标用户。传入的删除不需要启用可选的停靠面板到平台管理同步设置。
  • SSApp 来源身份元数据可能添加 meta.ssnAccountRole, meta.ssnSourceId,以及 meta.ssnSession 当来源被分配非普通账号角色时。
  • Event Flow 可通过设置以下字段请求高亮: meta.featured = true 位于聊天载荷上,会在停靠面板/featured 叠加层中自动精选该消息。
  • AI Event Overlay: 操作 showAiEventOverlay 将触发该操作的消息副本发送至标签 aievent-CONFIGURATION_ID,并添加 meta.aiEventOverlay: {profile: "CONFIGURATION_ID"}。现有消息字段和对象形式的元数据保持不变;标量元数据保留为 meta.value。这是定向传递,不是新的平台事件。原始消息不会被修改。请参阅 设置指南.
  • 可选 meta.aiEventOverlay.variation 选择已保存叠加层设置中批准的完全匹配短语。观众文本和元数据会在生成完成后填入模板字段。
  • AI Event Overlay 显示请求需要配置及其私有显示令牌。设置和 API 密钥只能通过本地 SSN 弹出窗口管理。响应使用 {aiEventResponse: {target, value}} 或 {aiEventResponse: {target, error}}. 生成结果包含 template, duration, warnings, 可选的媒体数据 URL 位于 image/audio.
  • 使用积分支付的 AI 叠加层奖励通过 aiEventPresentation (id, profile, expiresAt, result, message) 发送,并通过 aiEventDelivered(投递 ID)确认接收。积分扣款记录和退款金额保留在主机端。
  • Event Flow 可通过设置以下字段请求在停靠面板中置顶: meta.pinned = true;可选的 meta.pinnedTarget 将该置顶限制到具有匹配以下值的停靠面板: label.
  • Event Flow 热敏打印将结果记录在 meta.thermalPrintResult (success 和可选的 code/error),保留聊天事件和其他元数据。对于具有数字或其他非对象元数据的事件,诊断信息保留在操作结果中,事件保持不变。
  • 可选启用的 SSN 贴图奖励: event: "sticker" 仅发送到 stickers 叠加层标签,在忠诚度积分扣除后使用。它设置 platform 和 type 指向原始消息的 type,并保留 chatname,并且为空的 chatmessage, textonly: true,以及 contentimg 包含打包的相对图像路径或主持人批准的 HTTPS 媒体 URL。 meta.sticker 包含 id, pack, name, cost, duration (秒), motion, redemptionId,以及 expiresAt (Unix 毫秒)。这是 SSN 奖励,并非平台打赏或原生频道积分事件。请参阅 图库和设置指南.
  • 贴图播放器返回控制数据包 {action: "stickerReceipt", meta: {sticker: {redemptionId, success}}} 在图像加载成功或失败时发送给发送方。仅接受来自已连接的 stickers 对等端解决待处理的兑换。交付失败或未确认会触发退款;此控制数据包不是聊天事件。建议每个会话仅保留一个活动贴图显示。
  • AI 舞台叠加层命令使用 { action: "aiOverlay", target, meta } 或由停靠面板控制的联合主持人播放使用 { action: "cohostOverlay", target, meta };保留所有命令详情,例如 command, text, emotion, avatar,以及 tts 内部 meta.
  • 如果平台同时提供多个计数器,应优先使用具有明确键的结构化对象(meta.viewer_count, meta.follower_count),而不是让字符串承担多种含义。
  • 商业叠加层应使用位于以下位置的快照对象: meta (例如 auction_update 和 commerce_update),并避免临时添加顶层字段。

平台覆盖范围

YouTube — 标准 DOM 捕获

实现: sources/youtube.js

  • 保持直播聊天标签页打开。捕获功能读取该会话中渲染的会员和礼物卡片;不要求观看者是频道所有者或版主。账号访问权限和所选聊天视图可能影响哪些行可见。
  • 打开观众人数与聊天活动叠加层并显示观众人数时,系统会自动请求观众人数。设置项 显示观众数量 和 跟踪活跃聊天用户 也会启用数据收集。
  • 用于关注者提醒和其他事件,在扩展设置中启用 WebSocket 模式。
事件 触发时机 载荷说明
sponsorship 不含明确聊天文本的会员欢迎标题(新会员、赠送套装到账),包括结构化欢迎卡片或本地化的“Welcome to …”文本。 membership 填充为翻译后的“MEMBERSHIP”; subtitle 检测到时包含连续记录/等级; nameColor 允许时使用会员绿色。
giftpurchase 赠礼包购买横幅(ytd-sponsorships-live-chat-gift-purchase). membership 变为 gift_giver; subtitle 已知时携带礼物数量;没有 hasDonation 或 donoValue.
giftredemption 面向接收者的礼物兑换公告。 membership 变为“MEMBERSHIP”; subtitle 包含“Gifted by …”。
resub 包含“upgraded to …”的升级横幅。 subtitle 捕获新等级标签; membership 仍为“MEMBERSHIP”。
superchat, supersticker, jeweldonation Super Chats、Super Stickers、打赏公告卡片,以及由 Jewels 驱动的 YouTube Gifts(yt-gift-message-view-model). hasDonation 携带值; event 标识 YouTube 付费商品类型。YouTube Gifts 使用 N Jewels 存在时,或 1 YouTube Gift 当 YouTube 隐藏数量时。礼物图像使用 contentimg,礼物标签使用 subtitle,最少的礼物详情也会镜像到 meta.youtubeGift.
jeweldonation 礼物效果 YouTube 在直播聊天上方显示动态 Jewel 礼物(ytls-gift-overlay-item-view-model). 直接发送到专用 GIF/媒体目标,让动画能够播放而不重复普通礼物行。 contentimg 携带动画资源,而 meta.youtubeGift.animationUrl/animationDescription 保留效果详情。
reaction YouTube 实时表情喷泉中出现观众反应。 直接发送到专用回应目标。匿名表情和图像 URL 保留在 chatmessage/contentimg 以及位于 meta.reactionType/reactionImage。已知的直播变体包括 ❤、😄、🎉、😳 和 💯。
thankyou 存在打赏金额但未提供聊天文本时使用的回退消息。 保留 hasDonation 并为叠加层自动注入“Thank you for your donation!”。
redirect YouTube 重定向横幅出现在直播聊天中(最接近突袭通知的对应内容)。 仅通过 DOM 从以下位置捕获: yt-live-chat-banner-redirect-renderer。设置 event 为 redirect 并使用 membership 作为标签,让叠加层像其他系统通知一样渲染它。
viewer_update 每 30 秒轮询 Social Stream 的观众数端点(发生配额错误时回退到页面抓取)。 meta 是实时观众整数;计入汇总的 viewer_updates 在后台脚本中。

会员区块还会设置 membership 用于版主/会员聊天,而 subtitle 携带月数或等级名称。 sourceName/sourceImg 在以下条件成立后填充: getChannelInfo 成功。标准 DOM 聊天现在包含 meta.messageId 当 YouTube 提供原生直播聊天消息 ID 时,停靠面板使用它进行删除同步。

YouTube — Websocket/Data API 捕获

实现: sources/websocket/youtube.html,共享辅助工具位于 shared/

  • 默认使用 OAuth 权限范围 youtube.readonly 和 youtube.channel-memberships.creator。可选写入权限添加 youtube.force-ssl 用于发送聊天、管理、封禁和编辑直播详情;由于 YouTube 不提供仅限聊天的写入权限范围,Google 可能将其显示为广泛的 YouTube 管理权限。
  • 频道统计遵守各项设置的开关(showsubscount, showviewercount).
  • API 无法提供自定义徽章图像;徽章回退使用下文列出的表情图标。
  • 当 API 明确报告 authorDetails.isChatModerator: true,聊天、Super Chat、Super Sticker、YouTube Gift 和会员赠礼载荷包括 mod: true。不会在事件之间推断或缓存管理员状态。
  • 新订阅者提醒使用 myRecentSubscribers API(每 5 分钟轮询)。注意:结果可能延迟或不完整;只能识别公开可见的订阅。
  • Data API 不提供 YouTube 重定向横幅,因此 redirect 仍仅可从标准 DOM 捕获中获取。
事件 触发时机 载荷说明
superchat 来自 Data API 积压记录或直播轮询的 Super Chat 条目。 hasDonation 保留网站金额(货币 + 值); event 为 superchat。较旧的 WebSocket 版本使用 event: "donation" 用于此行,因此使用方可以继续接受它作为旧版别名。
supersticker Super Stickers(仅有消息文本回退内容,API 不提供图像)。 hasDonation 保存金额; chatmessage 包含解码后的描述文本。
jeweldonation YouTube giftEvent 消息,当观众将 Jewels 兑换为 Gifts 时。 hasDonation 保存 N Jewels,或 1 YouTube Gift 当 YouTube 隐藏数量时; contentimg 提供时使用礼物资源 URL; subtitle 携带礼物标签; meta.youtubeGift 携带额外的礼物详情。
sponsorship 新会员通过以下方式加入: newSponsorEvent. membership 变为 new_sponsor 或 new_member; meta 包含 originalEventType、时长和等级信息。
resub 会员续订或等级升级。 membership 变为 renewed_member (续订)或 upgraded_member (升级); subtitle 显示等级。
giftpurchase 通过 API 购买的赠礼包。 membership 设为 gift_giver; subtitle 列出数量/等级;没有 hasDonation 或 donoValue.
giftredemption 礼物兑换通知。 membership gift_recipient;徽章默认为 🎁; subtitle 表示赠送的等级。
membermilestone 里程碑聊天(memberMonth 或 displayMessage 存在)。 membership member_milestone; subtitle 汇总月数和等级; meta 捕获原始里程碑映射。
viewer_update 启用观众报告时的直播统计信息(同时在线观众)。 meta 是整数计数;与 DOM 脚本保持一致,以便下游使用方可以合并两条数据流。使用以下设置的停靠面板: &showviewercount 请求收集观众数量 70 分钟,并每小时续期,不会永久更改全局设置。
likes_update 在以下情况下轮询官方视频统计信息: 发送平台点赞总数 已启用。 meta 是当前视频点赞数整数。它在计数变化时发出,并在不变时定期发出,让使用方保持更新。全局的 captureliketotals 设置启用此功能;旧版 captureyoutubelikes 仍作为兼容别名。启用弹出窗口中每个停靠面板的 &showlikecount 选项还会持久启用这些全局捕获设置,而手动添加 URL 参数仅控制渲染。关闭显示选项不会禁用全局收集。
subscriber_update 在以下情况下轮询频道统计(订阅者): showsubscount 未明确禁用。 meta 是订阅者总数;界面会更新仪表板计数器。
view_update 在以下情况下轮询频道统计(累计观看次数): showviewercount 或 hype 模式处于活动状态。 meta 是观看次数整数。
live_chat_ended 绑定直播的实时聊天变得不可用。 meta.streamTitle 已缓存直播元数据时填充。
user_banned userBannedEvent 来自直播聊天 API 或 gRPC 流。 用于管理组件的仅元数据事件。 meta 包含用户名/显示名称、频道 ID、头像/个人资料 URL、版主、封禁/禁言时长和是否永久。
new_follower 通过以下方式检测到的新订阅者: myRecentSubscribers API(每 5 分钟轮询)。 chatname 是订阅者的频道名称; chatmessage 为空,除非在 YouTube 来源页面中启用了订阅者提醒消息。 meta 包含 channelId, title, subscribedAt,分组爆发会添加 grouped, count, others,以及 subscribers。注意:结果可能延迟或不完整;只能识别公开可见的订阅。

来自 API 的聊天转发使用 meta.plainText 用于纯文本消息,与富文本 chatmessage 内容。它是文本而非 HTML,仍可包含 Unicode 表情。会员徽章回退为表情(⭐, 💝, 🏅等),以与 DOM 捕获保持一致。普通聊天载荷还包括 meta.messageId 让停靠面板端的删除操作可以往返传回 YouTube 管理 API。

YouTube 订阅者提醒(new_follower)

Social Stream 现在可以使用以下方式检测新的 YouTube 订阅者: myRecentSubscribers API 端点。其工作方式类似于 Streamlabs 订阅者提醒。

工作原理:

  • 每 5 分钟轮询一次 YouTube API,以获取最近的订阅者
  • 在 localStorage 中跟踪已见过的订阅者,以检测新的订阅者
  • 发出 new_follower 事件,带有订阅者的姓名、头像和频道 ID
  • 默认禁用订阅者提醒消息;启用时会使用以下内容的当前翻译字符串: alert-just-subscribed
  • 默认将超过三个新订阅者的集中到达事件分组,避免重连时大量淹没叠加层或 Event Flow
  • 需要在扩展设置中启用 WebSocket 模式

限制(这些是 YouTube API 的限制,而非 Social Stream 的限制):

  • 不保证交付延迟 — SSN 每五分钟轮询一次,但 API 返回的结果可能有延迟或不完整。不要依赖固定的四小时窗口。
  • 仅限公开订阅 — 将订阅列表设为私有的订阅者不会触发提醒。YouTube 上的订阅默认是私有的。
  • 仅频道所有者 — 您只能接收自己拥有且已完成身份验证的频道的订阅者提醒。
  • API 配额使用情况 — 每次轮询消耗 1 个 API 单位。以 5 分钟为间隔,每天约使用 288 个单位(默认每日配额为 10,000)。

Event Flow 编辑器触发器: 使用 data.event === "new_follower" 和 data.type === "youtube"

YouTube Websocket:事件和会员速查

data.event data.membership 场景
sponsorshipnew_sponsor通过以下方式加入的新会员: newSponsorEvent
sponsorshipnew_member通过以下方式加入的新会员: processMembership
resubrenewed_member会员续订
resubupgraded_member等级升级
giftpurchasegift_giver赠送给频道的会员
giftredemptiongift_recipient收到赠送的会员资格
membermilestonemember_milestone会员周年聊天
superchat-Super Chat
supersticker-Super Sticker
user_banned-仅含元数据的封禁/禁言事件
new_follower-新订阅者(轮询;可能有延迟)

Twitch — 标准 DOM 捕获

实现: sources/twitch.js

  • 保持 Twitch 聊天打开。Twitch 渲染会员和用户通知时就会捕获这些内容;不限于主播或版主账号。账号专属功能可能需要身份验证。
  • 观众数量请求访问 https://api.socialstream.ninja/twitch/viewers 每 30 秒一次。
  • 用于关注者提醒、raid 和完整事件支持,在扩展设置中启用 WebSocket 模式。
  • 观众分享的连续观看通知默认禁用,需要 显示 Twitch 连续观看记录 设置。
  • 可选启用的 PluralMind 设置可能替换 chatname, nameColor,以及经代理包装的部分 chatmessage,并可能添加代词文本徽章。 username 仍为 Twitch 登录名;相关删除携带 delete.meta.pluralmind 让停靠面板使用该稳定登录名。
事件 触发时机 载荷说明
reward 频道积分兑换卡片(包括 7TV 奖励容器)。 chatmessage 包含兑换文本; membership 保持不变。
giftpurchase 系统行,例如“User gifting X Subs in the channel”。 chatmessage 是系统行,让叠加层可以突出显示赠送活动。
subscription_gift 赠送订阅通知(“用户向……赠送了一份订阅”)。 标记事件以供高亮筛选器使用; membership 仍为接收者徽章标签。
viewer_update 每 30 秒向 Social Stream 观众数代理获取一次(出错时回退为 0)。 meta 整数型观众数量。
hype_train Twitch 置顶社区高亮在弹出聊天中显示正在进行的 Hype Train。 仅含元数据的 DOM 回退方式,带有 meta.sourceMode 设为 dom。使用可见的等级、计时器和 meta.progressPercent 当 Twitch 不提供 EventSub 点数总计时。
community_highlight Twitch“Community Highlight”小组件内的元素。 meta 是为自动化挂钩提取的高亮文本。
knock 显示在聊天上方的 Stream Together 合作邀请。 chatmessage 包含邀请文本; chatname 可用时根据提醒用户生成。
watch_streak 可选启用、由观众分享并在 Twitch 聊天中渲染的连续观看通知。 meta.streakCount 检测到时包含可见计数; meta.milestoneId 可用时使用 DOM 通知标识符。

Bits/Cheers 填入 hasDonation (例如“500 bits”),即使 data.event 保持为空;渲染打赏组件时依赖该字段。订阅者连续记录信息出现在 subtitle 当徽章提供月数时。

Twitch — EventSub/Websocket

实现: sources/websocket/twitch.js 使用共享核心 providers/twitch/chatClient.js

  • OAuth 权限范围: chat:read, chat:edit, user:write:chat, bits:read, moderator:read:followers, moderator:read:chatters, channel:read:subscriptions, channel:read:hype_train, channel:moderate, moderator:manage:banned_users, moderator:manage:chat_messages, channel:manage:broadcast, channel:read:redemptions, channel:read:ads, channel:manage:ads。主播令牌可解锁订阅者/关注者计数。
  • EventSub 交付事件,并通过 Helix 轮询观众/关注者/订阅者总数。
  • WebSocket 模式提供实时的 关注者提醒、订阅事件、突袭、cheer、Power-ups、频道点数兑换和 hype train 元数据。
  • 共享聊天行使用 Twitch IRC source-room-id 以填充 sourceName/sourceImg 当原始频道与连接频道不同时,带有原始频道。
  • 观众分享的连续观看通知默认禁用,需要 显示 Twitch 连续观看记录 设置。
  • 可选启用的 PluralMind 设置可能替换 chatname, nameColor,以及经代理包装的部分 chatmessage,并可能添加代词文本徽章。 username 和 userid 保留 Twitch 身份;相关删除携带 delete.meta.pluralmind 让停靠面板使用这些稳定字段。
事件 触发时机 载荷说明
cheer 来自 EventSub 的 Cheer 通知 channel.bits.use. hasDonation “N bits”; meta.bits 数值型; chatmessage 保留原始消息;已识别的 cheer 发送者包含 chatimg.
powerup 来自 EventSub 的内置或自定义 Power-up 通知 channel.bits.use. 仅含事件的载荷,其中以下字段为空: chatmessage 且没有 hasDonation,因此不会创建普通聊天行。 meta.bits 为数值型,并且 meta.powerUp 保留 Twitch 子类型、标题/奖励 ID、效果详情,以及可用时提供的消息文本。
new_subscriber channel.subscribe 或带有以下内容的 USERNOTICE: msg-id=sub. meta 包含 { userId, tier, isGift };缓存的订阅者总数在可用时递增;观众总数单独轮询。
resub channel.subscription.message 或 USERNOTICE msg-id=resub. meta 携带连续和累计月数; chatmessage 包含重新订阅文本。
subscription_gift channel.subscription.gift 或 USERNOTICE msg-id=subgift. meta 提供赠送总数和等级; chatmessage 概述该操作。
reward channel.channel_points_custom_reward_redemption.add. meta 包含奖励 ID、标题、费用、提示、用户输入、兑换 ID/状态和旧版别名。没有顶层 reward 对象由此 EventSub 处理器发出。旧版使用方可能仍显示 channel_points 作为已弃用的别名。
raid EventSub channel.raid 或 USERNOTICE msg-id=raid. meta = { fromId, fromLogin, viewers }.
watch_streak 可选启用的 Twitch IRC USERNOTICE,带有 msg-id=viewermilestone 和 msg-param-category=watch-streak. 在以下字段中包含观众: chatname,Twitch 的通知文本位于 chatmessage,以及 meta.streakCount/meta.milestoneId。其他通用 USERNOTICE 类型仍被忽略。
new_follower channel.follow EventSub 通知。 自动递增 follower_update; meta 记录 { userId, followedAt }.
viewer_update Helix streams 每 30 秒轮询一次。 meta 整数型观众数量;除非在设置中启用观众统计,否则抑制。
follower_update Helix 关注者总数,在关注事件后或定期轮询时触发。 meta 整数型关注者数量。
subscriber_update Helix 订阅者总数(需要带有订阅权限范围的主播令牌)。 meta 整数型订阅者数量。
stream_online / stream_offline EventSub stream.online/stream.offline. meta.startedAt 在上线事件中存在;离线使用空对象。
ad_break / ad_request / ad_schedule 广告管理 API 响应(channel.ad_break.begin,手动的 POST channels/ads, GET channels/ads). meta 详细提供时长、请求者和计划载荷,以供仪表板使用。
hype_train EventSub channel.hype_train.begin, channel.hype_train.progress,以及 channel.hype_train.end v2 通知。 仅含元数据的事件:没有 chatname 或 chatmessage. meta.phase 为 begin, progress,或 end; meta 包含列车 ID、等级、进度、目标、总值、贡献者、时间字段、共享列车标志和 trainType。宝藏列车通过以下字段显示: meta.trainType 当 Twitch 为它们添加标签时。
user_banned EventSub channel.ban,或 IRC CLEARCHAT 当 EventSub 封禁事件不可用时的回退方式。 用于管理组件的仅元数据事件。 meta 包含用户名/显示名称、用户 ID、头像/个人资料 URL、版主、原因、封禁/禁言时长和是否永久。

聊天载荷复用共享提供程序,因此 data.event 针对 `/me` 填充(action)以及旧版 bits 标签,即使在 EventSub 流程之外也如此。Twitch GIF 消息将 Giphy 资源放在 contentimg,保留 chatmessage 为空,并在以下字段中保留 Twitch 的回退标签: meta.gifLabel。去重和删除逻辑使用消息 ID;通过 SSN 发送的消息使用原生 message_id 来自 Twitch 的 IRC 回显,位于 data.id.

Twitch Hype Train 元数据

hype_train 仅含元数据,不包含 chatname 或 chatmessage。仪表板应通过以下字段更新现有列车显示: meta.id 而不是将每次进度更新作为聊天追加。Meta Data Bar(meta.html)将这些事件显示为顶部进度条。

字段 输入 说明
type字符串始终 twitch.
event字符串始终 hype_train.
meta.phase字符串begin, progress,或 end.
meta.id字符串稳定的列车 ID。用它来插入或更新一个可见的列车组件。
meta.broadcasterUserId字符串Twitch 主播用户 ID。
meta.broadcasterUserLogin字符串Twitch 主播登录名。
meta.broadcasterUserName字符串Twitch 主播显示名称。
meta.total数值 | nullTwitch 为列车报告的支持总值。
meta.progress数值 | null朝当前等级目标推进的进度。
meta.goal数值 | null当前等级目标。
meta.progressPercent数值 | nullTwitch 仅提供可见弹出窗口进度条时使用的 DOM 回退百分比。
meta.level数值 | null当前或结束时的列车等级。
meta.topContributions数组主要贡献者。每个条目包含 userId, userLogin, userName, type,以及数字形式的 total.
meta.lastContribution对象 | null最近一次贡献,使用与以下字段相同的贡献结构: topContributions.
meta.sharedTrainParticipants数组Twitch 提供时的原始共享列车参与者数据。
meta.startedAt字符串列车开始的 ISO 时间戳。
meta.expiresAt字符串当前列车到期的 ISO 时间戳。
meta.endedAt字符串列车结束的 ISO 时间戳,结束前为空。
meta.cooldownEndsAt字符串冷却结束的 ISO 时间戳,结束前为空。
meta.isSharedTrain布尔值当 Twitch 将列车标记为共享时为 true。
meta.trainType字符串通常 regular;Twitch 对宝藏列车进行标记时,会在这里显示。
meta.allTimeHighLevel数值 | nullTwitch 提供时,表示列车历史最高等级。
meta.allTimeHighTotal数值 | nullTwitch 提供时,表示列车历史最高总量。
meta.sourceMode字符串可选的来源标记,例如 dom.
meta.eventSubType字符串原始 EventSub 类型: channel.hype_train.begin, channel.hype_train.progress, channel.hype_train.end,或 dom.community_highlight.

Twitch EventSub:事件速查

data.event 场景
new_follower用户关注了频道
new_subscriber新订阅
resub带消息的重新订阅
subscription_gift赠送给频道的订阅
cheer使用 Bits 欢呼
powerup使用了内置或自定义 Power-up
reward频道积分兑换
raid收到的突袭
viewer_update同时在线观众数
follower_update关注者总数
subscriber_update订阅者总数
stream_online直播已开始
stream_offline直播结束
ad_break广告插播开始
hype_trainHype Train/Treasure Train 状态元数据
user_banned用户被封禁或禁言

OBS Flow Actions

实现: actions.html 通过 OBS WebSocket v5 事件,带有 dock.html 将 OBS 浏览器源事件作为回退方式

  • 保持 Flow Actions 叠加层打开,并使用与 Event Flow 编辑器/后台相同的 Social Stream 会话,或者让停靠面板在 OBS 内保持加载。
  • 在 OBS 28+ 上配置 OBS WebSocket v5;默认 URL 为 ws://127.0.0.1:4455.
  • 这些是 Event Flow 系统事件。它们不包含 chatname 或 chatmessage,其他 OBS 详情保留在 meta.
事件 触发时机 载荷说明
stream_started OBS 报告直播输出已达到启动状态。 type 为 obs; event 为 stream_started; meta.source 为 obs-websocket 或 obs-browser-source; meta.outputState 可能携带原始 OBS 输出状态。
stream_stopped OBS 报告直播输出已达到停止状态。 type 为 obs; event 为 stream_stopped; meta.outputActive 可能为 false.
recording_started OBS 报告录制已开始。 type 为 obs; meta.obsEvent 标识 OBS 事件来源。
recording_stopped OBS 报告录制已停止。 type 为 obs; meta.outputState 可能携带原始 WebSocket 状态。
scene_changed OBS 更改当前节目场景。 type 为 obs; meta.sceneName OBS 提供时包含场景名称。
media_ended OBS 媒体输入播放结束。 type 为 obs; meta.inputName 和 meta.inputUuid 标识媒体输入。
replay_buffer_saved OBS 保存回放缓冲区。 type 为 obs; meta.savedReplayPath 可能包含已保存的回放路径。

Streamlabs 提醒框

实现: sources/streamlabs.js (提醒框 DOM);可选的 socket 桥接位于 sources/websocket/streamlabs.html

  • 让 Streamlabs 提醒框在标签页或浏览器源中保持打开,以便渲染提醒;内容脚本会读取提醒 DOM 中的消息、图像和令牌。
  • 打赏样式的提醒设置 hasDonation (例如“$10 USD”或“100 bits”)以及可选的 donoValue 以美元计。
  • 推断的事件类型: follow, subscription, gift, cheer, donation, superchat, raid, redeem, merch, sponsor.
  • 对于 socket 桥接,粘贴 Streamlabs Socket API 令牌并连接;无需提醒框页面即可转发提醒。
事件 触发时机 载荷说明
donation 打赏、慈善、JustGiving 或通用的“donated”提醒。 hasDonation 保留货币文本(例如“$36”或“$10 CAD”); donoValue 仅在美元值可用时提供;其他带标签的金额使用共享货币换算。
cheer Twitch bit/cheer 提醒。 hasDonation 变为“100 bits”,而 donoValue 捕获美元值。
subscription 订阅提醒。 已设置标准字段; chatmessage 是提醒行; meta.tokens 携带标记化的值(name、amount、levelName 等)。
gift 赠送的会员/订阅。 meta.tokens.amount 可能显示礼物数量; meta.tokens.levelName 可存放等级。
follow 关注者提醒。 没有打赏字段; chatname 反映提醒名称标记。
raid 突袭提醒。 meta.tokens.count 存在时保存突袭人数。
redeem Cloudbot 兑换提醒。 meta.tokens.product 捕获兑换物品。
merch 周边商品购买提醒。 meta.tokens.product 包含已购买商品的名称。
superchat 来自 YouTube 或受支持提醒集成的 Super Chat 样式提醒。 hasDonation 携带金额;使用方可以继续接受旧版的 donation 别名。
sponsor 由 Streamlabs 显示的赞助者/会员样式提醒。 标准字段;除非文本包含金额,否则不含打赏。

TikTok Live — DOM 捕获和 TikFinity 信息流

实现: sources/tiktok.js 用于原生 TikTok 页面,以及 sources/tikfinity.js 用于 TikFinity 的活动信息流组件/iframe。SSApp 仍有事件覆盖范围最广的原生 TikTok 集成(请参阅 SSApp 文档)。

  • 在主播的直播页面上运行。礼物/点赞/关注横幅仅在会话经过身份验证时填充。
  • TikTok 通过 DOM 检测提供多种事件 无需 WebSocket 模式 — 礼物、关注、点赞和可选启用的加入通知从渲染的行中捕获。
  • TikFinity 组件页面位于 tikfinity.zerody.one/widget/activity-feed* 也适用。嵌入的活动信息流 iframe 为聊天、关注、分享、礼物、订阅、可选启用的加入通知和宝箱发出相同的规范 TikTok 载荷字段。
  • 无需额外的 API 身份验证。
  • SSApp 原生模式 仍会在页面/组件捕获路径之外添加事件: question_new, emote, viewer_update,以及需主动启用的汇总 likes_update.
事件 触发时机 载荷说明
gift 礼物横幅行或 DivGiftMessage 条目。 hasDonation 转换为“N coins”(以礼物查询作为回退方式); membership 可用时使用徽章文本。
joined 全局设置启用时的加入通知: 捕获“joined”直播事件 设置已启用。 跳过分享通知; chatname 对于某些系统字符串可能为空。
followed 从社交卡片解析的关注消息。 确保 chatname 在发出之前存在。
shared TikFinity 分享行。 chatmessage 是渲染的分享文本。
subscribe TikFinity 订阅行。 membership 设为 SUBSCRIBER.
envelope TikFinity 宝箱行。 meta.coins 和 meta.canOpen 携带宝箱详情。
liked 由 TikTok 社交卡片触发的点赞风暴摘要。 chatname TikTok 提供时会包含;匿名/系统点赞卡片仍可能发出。TikTok 通过普通后台路径发送此内容。后台将一份副本路由到 Reactions Overlay,然后仅在以下条件成立时继续进入主聊天/事件处理管线: capturelikeevent 已启用。
likes_update SSApp 收到权威的 TikTok LIVE 累计总数,而 captureliketotals 已启用。 meta 是当前总数整数。SSApp 立即发送第一个值,将突发更新合并为最多每五秒一次,约每 90 秒重复最新值,并在直播结束时发送零。这与特定观众的以下内容分开: liked 事件。
true (布尔值) TikTok 未提供子类型的通用社交/系统广播。 使用 chatmessage 内容来决定展示方式;布尔值 true 表示“系统事件 — 类型未知”。

membership 对应徽章工具提示(订阅者等级)。头像缓存使 chatimg 在事件之间保持有效;如果 DOM 隐藏版主颜色,脚本会清除 nameColor。TikFinity 礼物行还会设置 contentimg 设为可用时的礼物图标。原生 DOM 和 TikFinity 礼物连送更新包含 meta.tiktokGiftStreakId, meta.tiktokGiftCount,以及 meta.tiktokGiftQuietMs 让叠加层可以合并重复更新;旧版连续记录 ID 对每个页面实例唯一。礼物元数据还可能包含 tiktokGiftMessageId (原始 TikTok 消息 ID), tiktokGiftSenderId, groupId, giftId, giftName, streakable,以及 repeatEnd。原生 ID 用于识别不同捕获窗口中的同一礼物;非零组 ID 配合发送者和礼物 ID,用于识别累计连送更新。SSApp WebSocket 捕获在连送结算后提供相同字段,并带有 count 为兼容性而保留。转发每个礼物时都会检查其打赏开关:禁用 TikTok 打赏会移除 hasDonation 和 donoValue 同时保留礼物事件和元数据。TTS 使用这些身份合并更新,并在最长十分钟内抑制已完成的重复项(有界缓存),按发送者、数量和礼物名称朗读 TikTok 礼物。旧版载荷回退到现有连送 ID 和消息文本;不会仅从礼物文本推断身份。TikTok 礼物语音使用所选的 TTS/语音语言,独立于界面语言。播报动词已针对英语、西班牙语、葡萄牙语、法语、德语、意大利语和荷兰语本地化;其他语言使用发送者、数量和礼物名称,不带英语动词。简化 TTS 保留这种中性格式。礼物名称保持平台提供的原样;这不会自动翻译礼物目录或聊天消息,也不会推断直播语言。

对于这些连送更新,计数和打赏标签是累计值:1、2、3 表示三件礼物,而不是六件。总数使用方应只增加超过该连送 ID 已见最大值的部分。Standard 捕获支持旧版礼物类和当前的图片/计数行;两者都保留 event: "gift" 和 hasDonation。价格未知时保留礼物数量/名称用于显示,并以每件礼物一枚金币估算美元值。来源提供的 donoValue 优先;渲染的礼物元数据可能提供 coinsPerGift 或 diamondsPerGift 然后才需要使用礼物表或默认值。标准模式/TikFinity 的金币估算与 SSApp 原生的钻石估算使用各自现有的不同换算方式;两者都不代表有保证的现金收益。

Whatnot

实现: sources/whatnot.js

  • 打开 Whatnot 直播节目页面并让聊天可见;现有 websocket 捕获会提供聊天、拍卖/销售通知、付款失败、突袭、打赏和快速观众更新。商品/赠品抽奖快照仍依赖节目视图中渲染的 DOM 区段。
  • 捕获直播事件 控制 Whatnot 系统事件和拍卖/目录元数据更新;加入行还需要 捕获“joined”直播事件;观众计数仍遵循观众/Hype 开关。
事件 触发时机 载荷说明
viewer_update 来自 websocket 直播更新的观众数量变化,以 DOM 轮询作为回退方式。 meta 是整数型观众数量。
donation Whatnot websocket 打赏和社区 boost 贡献事件。 hasDonation 包含格式化的金额;websocket 专属上下文保留在 meta.
raid Whatnot websocket 突袭事件,包括积压活动回复。 meta.numRaiders Whatnot 提供时会包含。
joined 规范化正文以以下内容开头的聊天行: joined,当 捕获“joined”直播事件 已启用。 加入通知使用字符串事件标签(而非布尔值 true).
auction_update 直播页脚拍卖状态变化时(获胜者/领先文本、标题、出价、价格、计时器、已售状态),通常由 websocket 拍卖生命周期数据包加速。 仅含元数据的事件。没有 chatname/chatmessage;数据位于 meta (例如 meta.title, meta.bids, meta.price, meta.timer, meta.status).
commerce_update 商品目录区段变化时(商品、惊喜套装、即将举行的赠品抽奖),通常由 websocket 赠品抽奖/商品生命周期数据包加速。 仅含元数据的快照,区段计数和项目数组位于 meta.products, meta.surpriseSets,以及 meta.upcomingGiveaways.
auction_started, new_bid, auction_ended, product_sold 收到相应的实时 websocket 通知。这些是独立事件,与现有的显示快照分开。 platform/type: "whatnot",纯文本的 chatname, userid 提供时,商品名称位于 subtitle,以及纯文本的 chatmessage 带有 textonly: true。可用标识符和拍卖详情位于 meta: productId, auctionId, orderId, transactionId, livestreamId, bidId, bids, auctionEndTime,以及 status。可选的 price 使用主要货币单位,带有 priceText 和 currency 提供时。
payment_failed 收到实时支付失败 WebSocket 通知。 相同的可用买家、商品和标识符字段,带有 meta.paymentStatus: "failed"。仅当 product.purchaserUserId 标识买家,并填充 userid 用于销售/付款事件,且买家姓名保持为空。不会根据其他或之前的拍卖推断买家。
payment_succeeded 收到实时支付成功 WebSocket 通知。 meta.paymentStatus: "succeeded",包含该通知提供的买家、商品、订单 ID 和其他允许字段。这仍是独立的支付事件;不会再发出一个 purchase 或打赏。缺失字段保持为空或省略,即使之前的销售提供过这些字段。

拍卖/商业展示更新仍是基于 DOM 的快照。要在 Event Flow 中匹配单个 WebSocket 事件,请使用 事件类型(高级)(Event Type (Advanced)),选择 自定义事件(Custom Event),并输入其准确名称。标签可以使用 **{username}**\n{subtitle} 带有所选文本权重;条件可以比较 meta.paymentStatus 带有 failed。一个 可导入的 Whatnot 标签示例 可用。现有直播事件捕获设置仍然适用。

其他可选字段包括 meta.catalogProductId (数据包的 product.productId), meta.parentProductId (product.parentId), meta.transactionType (Whatnot 的销售类型,保持不变),以及 meta.placeOrderErrorReason (Whatnot 提供的订单/支付错误代码)。这些商品引用描述的是目录或父级商品页面,不能替代订单 ID。库存数量不视为购买数量。

要自动处理支付成功,请设置一个 事件类型(高级)(Event Type (Advanced)) 触发器,以 自定义事件(Custom Event): payment_succeeded,并将来源筛选为 Whatnot。现有条件和模板可以使用该事件的 userid, chatname, subtitle 和 meta.orderId 直接处理。通知包含所需详情时,不需要已记忆的购买记录。

拍卖结束或商品被标记为已售出,并不确认付款成功:这些通知不会作为已付款的 purchase 事件,且不设置打赏金额。只有收到以下内容才会发出成功事件: payment_succeeded 通知;捕获不会轮询付款完成状态,也不会根据销售推断付款完成。其他 paymentStatus 值仅在捕获的数据包明确提供时转发。缺失的标识符会省略;单个商品 ID 可能涵盖多笔销售,因此请使用提供的订单/拍卖 ID 关联通知。捕获不会记忆购买或匹配付款更新;此类工作流必须在 Event Flow 中明确配置。来自两个现有捕获桥接的短时间重复数据包会被抑制。原始订单/付款对象不会转发。

eBay Live

变现功能中的 eBay 卖家连接需要配置 SSN eBay 服务并获得卖家 OAuth 授权;下文的 eBay Live 捕获独立运行。沙盒模式使用沙盒商品 URL,将买家标记为“eBay Sandbox buyer”,并为消息添加“Sandbox test purchase:”前缀。沙盒购买保留相同的购买数据约定,并可在测试期间触发已启用的提醒/聊天操作。其已实现的付款数据约定会发出 event: "purchase",带有 type 和 platform 设为 ebay。需要一笔与所选商品匹配的已付款订单。 id 是稳定、不透明的订单行标识符; chatname 为“eBay buyer”, chatmessage 是纯文本(textonly: true), subtitle 是商品名称和可选的 contentimg 是其图像。 meta.ebayPurchase 包含 itemId, itemName, quantity,以及公开的 url。没有买家身份、配送数据、 hasDonation 或 donoValue 已包含。这不同于抓取的拍卖或库存更新,后者不能证明已付款。

实现: sources/ebay.js

  • 打开其中任意一个 /ebaylive/events/<id>/chat 或 /ebaylive/events/<id>/stream。两者接收同一实时拍卖 feed。
  • 公开的 WebSocket 信息流提供拍卖、出价、获胜者、计时延长和库存变化;只读 GraphQL 查询提供商品详情。当网络数据不可用时,DOM 捕获仍作为回退方式。
  • 捕获直播事件 控制元数据快照(auction_update, commerce_update);观众计数器仍遵守观众/Hype 开关。
事件 触发时机 载荷说明
viewer_update 当前活动观众数量变化时(标题栏计数,或直播活动标记回退值)。 meta 是整数型观众数量。
follower_update 卖家统计端点返回卖家关注者数量时。 meta 是整数型关注者数量。来源每 60 秒轮询一次卖家端点;该端点仍可能返回最长缓存 5 分钟的值。
auction_update 当前拍卖元数据变化时。 仅含元数据的事件。网络捕获会设置 meta.sourceMode 为 network 并提供 title、price、bidder、winner、bids、timer 和 endingAt。 meta.ebay 包含 eventId、listingId、GraphQL 商品记录(listing)、当前的公开 socket 商品信息(eventListing),以及最新的拍卖更新(update)。这些字段保留类别、图片、货币、数量、拆盒详情、拍卖结果和时间字段,不会因扁平化而丢失平台细节。GraphQL 记录是获取到的快照;socket 商品信息和更新携带更新的直播状态。初始/重连历史会合并到当前快照中,而不会作为旧的获胜事件发出。移除所有展示的商品时会发出 status: "idle" 带有 cardCount: 0 以清除拍卖。DOM 回退保留播放器卡片或活动预览字段。
commerce_update 目录/直播事件快照区段变化时。 位于以下字段中的仅元数据快照: meta。网络模式包括 eventId, navigation.viewerCount 和 playerCards 用于当前展示的商品,每项都有相同的详细 ebay 对象作为拍卖快照。空卡片列表会清除已移除的商品。DOM 回退还可能包含 liveEvents, livePreview, currentEvent 和 upcomingEvents.
reaction eBay Live 渲染爱心/回应动画时。 直接发送到专用回应目标。 meta.reactionType 为 heart;eBay 不会为这些 DOM 动画提供逐用户名称。

eBay 元数据事件有意省略 chatname/chatmessage;下游叠加层应从以下字段渲染: data.event + data.meta 仅此。

Kick — 标准 DOM 捕获

实现: sources/kick.js

  • 需要经过身份验证的会话才能解析个人资料图像和订阅者徽章。
  • 通过聊天文本匹配和徽章进行有限的事件检测;启用开关后,观众数量仍然有效。
事件 触发时机 载荷说明
gift 通过贴图图像和可见的 Kick 货币金额检测到的 KICKs 礼物。 hasDonation 携带 N KICKs (1 KICK 表示一个),前提是可见金额可用; contentimg 携带礼物图像。现有消息文本会保留。
reward 奖励兑换(“has redeemed …”)。 chatmessage 包含兑换文本。
true (布尔值) 不匹配礼物或奖励模式的通用系统通知。 使用 chatmessage 内容来决定展示方式;布尔值 true 表示“系统事件 — 类型未知”。
viewer_update 每 30 秒轮询一次 Kick 的频道 API(仅在启用观众统计信息时)。 meta 整数型观众数量;订阅、关注或打赏请使用下方的 Kick 桥接。

Kick — Websocket/桥接

实现: sources/websocket/kick.js 使用位于以下位置的共享辅助程序: providers/kick/core.js

  • 通过 Social Stream Kick 桥接进行 OAuth。当前权限范围为 user:read, channel:read, channel:write, channel:rewards:read, chat:write, events:subscribe, moderation:ban, moderation:chat_message:manage,以及 kicks:read。令牌会自动刷新。
  • Kick webhook 配置可能需要几分钟;界面会按频道列出有效订阅。
事件 触发时机 载荷说明
message 桥接聊天载荷。 meta.plainText 包含纯文本消息(仍可包含表情);徽章合并平台和个人资料缓存。串内回复填充 initial, reply,以及 meta.reply 当回复详情或已缓存的父消息可用时。
reward channel.reward.redemption.updated,以及看起来像兑换事件的桥接聊天/系统载荷。 meta 包含奖励/兑换 ID、标题、费用、状态、用户输入和兑换者。
new_subscriber channel.subscription.new. membership 分配给订阅者角色; meta 包含 { subscriber, plan }。
resub channel.subscription.renewal. meta.duration (月)以及 meta.plan 可用; subtitle 汇总连续记录。
subscription_gift channel.subscription.gifts. meta.totalGifted, meta.gifter;徽章回退到 💝 图标。
donation 通过事件类型启发式规则检测的支持/打赏事件;KICKs 礼物使用 gift 如下。 hasDonation 携带格式化的金额; meta 包含 { amount, currency, supporter, message, giftName }。
gift kicks.gifted (KICKs 礼物),与 DOM 抓取器一致。 hasDonation 携带 N KICKs (1 KICK 表示一个); contentimg 可用时携带礼物图像。结构化礼物详情保留在 meta.
raid 兼容处理旧版 host 形状的 socket 载荷,例如 App\Events\StreamHostEvent. Kick 当前的官方事件目录没有 raid/host 订阅。如果收到兼容的旧版载荷,会将其映射为规范的 raid;不要在当前 Kick 工作流程中依赖此项。
new_follower channel.followed. 关注者图标来自个人资料缓存; follower_update Kick 提供累计总数时触发。
follower_update 桥接在 webhook 载荷中提供关注者计数。 meta 整数型总数;由仪表板用于关注者目标。
stream_online / stream_offline livestream.status.updated. meta 包含来自 Kick 的原始状态正文(is_live、title 等)。
viewer_update livestream.status.updated 当 Kick 包含同时在线观众总数时。 meta 整数型观众数量;发出 0 在离线状态时,用于清除过期计数器。
user_banned moderation.banned 来自桥接/webhook,或 Kick 聊天 socket 封禁事件。 用于管理组件的仅元数据事件。 meta 包含用户名/显示名称、用户 ID、头像/个人资料 URL、版主、原因、封禁/禁言时长和是否永久。

个人资料查询使用 profileCache; mapBadges 可用时将 Kick 的徽章资源与缓存的 SVG 合并。当 Kick 以 KICKs 报告打赏时,桥接将其转换为 hasDonation 加上 meta.amount 带有 currency 回退为“KICKs”。聊天载荷包含 meta.messageId 当桥接提供原生 Kick 消息 ID 时,让删除同步能够定位正确消息。回复载荷包含 meta.reply 带有父级 messageId, author,以及 text 已知时。即使原始消息未缓存,提供的回复详情仍然可用;没有缓存上下文、仅有 ID 的回复仍可能缺少可见引用。

Kick Websocket:事件速查

data.event 场景
new_follower用户关注了频道
new_subscriber新订阅
resub订阅续订
subscription_gift赠送的订阅
reward频道奖励兑换,或奖励样式的聊天/系统消息
donation打赏/支持事件
giftKICKs 礼物事件
raid仅用于兼容的旧版 host/raid 输入;不是当前官方 Kick 订阅
follower_update关注者总数
stream_online直播已开始
stream_offline直播结束
user_banned用户被封禁或禁言

VPZone — WebSocket

实现: sources/websocket/vpzone.js

  • 连接到 wss://chat.vpzone.tv/ws?channel=USERNAME;OAuth 请求 profile:read, chat:read, chat:write, channel:read, channel:write,以及 chat:moderate。也可以手动提供 bearer 令牌。
  • 扁平 VPZone 帧,例如 type: "msg" 被标准化为标准聊天载荷。
  • 平台端 delete_message / clear_chat 帧会从停靠面板中移除匹配行;可选开关会将停靠面板删除和屏蔽同步回 VPZone(仅限频道所有者)。
  • 频道所有者会获得页面内的 Stream Info 面板,用于更新直播标题和类别(与 Twitch 来源页面的模式相同)。
事件 触发时机 载荷说明
message VPZone msg, message, new_message,或 chat_message websocket 帧。 chatname 来自 username; chatmessage 来自 body;subscriber/owner/mod/VIP 标志复制到 chatbadges、顶层角色标志,以及 meta。原生 ID 填入 data.id 和 meta.messageId.
viewer_update VPZone presence 帧,带有 count 或等效的观众字段。 meta 是实时观众整数;计入汇总的 viewer_updates.
new_subscriber VPZone subscribe / subscription 帧。 membership 存在订阅标志时设为 Subscriber。
subscription_gift VPZone gift / gift_subscription 帧。 使用与 Twitch、Kick、Rumble 和 Velora 相同的赠送订阅事件名称。 subtitle 携带礼物数量(x5)或接收者。
message + hasDonation VPZone system 帧,带有 metadata.kind: "pixels_cheer" (Pixels 打赏)。 带有打赏的聊天行; hasDonation 是金额标签(例如 100 Pixels), meta.pixels 该整数。 event 保持为空;通过以下字段检测此打赏: hasDonation。Kick 桥接的支持事件改用 event: "donation".
message 回复 VPZone msg 帧,携带 metadata.reply_to (消息 ID、作者、摘录——在服务器端反规范化)。 与 Kick 回复一样渲染: initial 保存“author: excerpt”标签, reply 原始回复文本, meta.reply 结构化目标。遵循 排除“replying to” 设置。
raid VPZone raid 帧,带有 metadata.kind: "incoming". 跳过传出的突袭帧; meta.viewers 提供时携带突袭人数。
shoutout VPZone shoutout 帧(!so 命令)。 meta.targetUser 给出被推荐的频道名称。
reward VPZone system 帧,带有 metadata.kind: "channel_points_redeem". 频道积分兑换,使用与 Twitch 奖励相同的事件名称。
stream_online / stream_offline VPZone system 帧,带有 metadata.kind: "stream_started" / "stream_ended". 归属为频道名称(帧中不包含行为人)。
new_follower VPZone follow 帧。 映射为标准关注者事件结构。
joined VPZone 加入/在线状态样式的 websocket 事件,在以下情况下: 捕获“joined”直播事件 已启用。 映射为聊天样式的系统事件,VPZone 行为者元数据位于 meta.

Joystick

实现: sources/joystick.js, sources/inject/joystick-ws.js,以及 sources/websocket/joystick.js

  • 普通 Joystick 2.0 网站来源运行于已登录的 /u/<channel>/chat 页面。它读取页面的 ChatChannel, WhisperChatChannel, EventLogChannel,以及 SystemEventChannel Action Cable 帧,并为 Electron 和重连情况提供基于已渲染行的回退。
  • 网站聊天消息使用与 YouTube、Twitch 和 Kick 相同的核心字段:原生 id, chatname, chatmessage, chatimg, chatbadges, nameColor, membership, mod, private, username/userid,以及 timestamp 当 Joystick 提供它们时。当 socket 省略用户名颜色时,渲染的行提供相同的 nameColor 由启用颜色的停靠面板使用的字段。
  • 网站端的消息编辑会替换匹配的停靠面板行;删除、静音和屏蔽会使用原生 ID 或用户名移除匹配行。
  • 单独的 WebSocket 来源使用 Joystick 机器人凭据(client_id + client_secret);网站来源使用已登录的页面会话。
  • 在以下地址授权: https://joystick.tv/api/oauth/authorize,然后在以下地址交换/刷新令牌: https://api.joystick.tv/api/oauth/token.
  • 连接到 wss://api.joystick.tv/cable 并订阅 GatewayChannel.
  • 可选的 OAuth 令牌交换用于辅助端点,例如 https://api.joystick.tv/api/users/stream-settings.
  • 单独的机器人凭据来源不会发出 viewer_update。已登录的网站来源在页面 socket 提供观众数时确实会发出观众数,如下所述。
事件 触发时机 载荷说明
message Joystick ChatMessage, BotMessage, new_message, bot_message, event_bot_message, pvp_message,以及私信。 普通聊天没有 event。原生 ID 放在顶层 id 和 meta.messageId;角色和私有状态使用既有顶层/徽章字段。
new_follower Joystick StreamEvent 类型为 Followed. 使用标准关注者结构,并与 Joystick 匹配的机器人行进行去重。可选的 meta.userId/meta.followedAt 仅在 Joystick 提供时包含。
new_subscriber / subscription_gift Joystick 事件类型 NewSubscription / GiftedSubscription. 使用与 Kick 兼容的订阅元数据键: eventType, subscriber, gifter, totalGifted, duration,以及 plan.
donation Joystick StreamEvent 类型 Tipped / TipMenu. hasDonation 可用时携带代币金额和单位,以供共享美元换算,并对匹配的 Joystick 机器人行去重。 meta 使用现有的 Kick 支持事件键: eventType, supporter, amount, currency, message, giftName, giftType,以及 tier.
stream_online / stream_offline Joystick StreamEvent 类型,例如 Started, StreamResuming, Ended, StreamEnding. 用于能识别传输状态的上线/离线自动化。
user_enter / user_leave Joystick UserPresence 类型 enter_stream / leave_stream. 在线状态通知作为事件消息发出,可通过隐藏事件设置抑制。隐藏事件还会抑制非打赏的直播事件。
viewer_update 已登录的网站来源接收 ViewerCountUpdated 通过 EventLogChannel. 使用纯整数 meta,与 YouTube、Twitch 和 Kick 一致。仅在启用观众计数或 Hype 模式时发出。单独的机器人凭据来源仍不会接收观众数。
follower_update / subscriber_update Joystick 关注者/订阅者数量更新事件。 使用纯整数 meta,与 Twitch 计数器约定一致。
被忽略的内部通知 ChatMessageReceived、设备状态,以及未映射的小组件刷新,例如打赏目标/PvP/subathon 状态。 这些是传输或页面状态通知,并非 Social Stream 事件。它们不会被转换为虚构的 snake_case 事件名称;实际的 ChatChannel/new_message 行仍是唯一的聊天载荷。

XP Sync

实现: sources/xpsync.js

  • 聊天行使用规范载荷字段,并带有 type: "xpsync",包括作者、消息、头像、图片和内联 SVG 徽章、名称颜色、会员状态、管理员/会员/机器人标志,以及作为以下字段的原生消息 UUID: id 可用时。
  • 回复遵循 YouTube、Twitch 和 Kick DOM 来源的约定:除非禁用回复前缀,否则 initial 包含被回复的用户, reply 保留不带前缀的消息,而 chatmessage 接收可见的回复前缀。
  • 即使 XPSync 在渲染 Sparks 高亮行时不使用普通聊天行类名或消息 ID,这些行也会被捕获;可见金额通过以下字段提供: hasDonation 作为 N Sparks.
  • 启用事件捕获时,包含“just followed”或“followed the channel”的行会发出 event: "new_follower".
  • 启用观众数量时,永久聊天停靠面板发出 event: "viewer_update" 来自 XPSync 页面已加载的直播视频计数,并通过 XPSync 的直播页面更新刷新。无需单独的 SSN 凭据。

Instagram — 直播 REST 捕获和新闻收件箱

实现: sources/instagram.js 和 sources/instagramlive.js (完全相同的副本)

  • 在直播页面上(/<user>/live/?broadcast_id=...),直播聊天来自 Instagram 自己的 Web API,使用会话 cookie 在同源进行轮询: GET /api/v1/live/{broadcast_id}/get_comment/?last_comment_ts={ts} 约每 2 秒一次,而 POST /api/v1/live/{broadcast_id}/heartbeat_and_get_viewer_count/ 启用观众数量时约每 5 秒一次。连续失败 3 次后(或没有 broadcast_id 可发现)时,来源会回退为解析渲染的聊天 DOM。
  • 通过以下方式轮询账号自身的活动信息流: POST /api/v1/news/inbox/ 在任何 Instagram 页面上约每 45 秒一次。第一次轮询仅初始化去重集合,因此绝不会重放积压记录;快拍依据以下字段去重: tuuid.
  • 必需的 API 请求头(全部为静态值或可推导值): X-IG-App-ID: 936619743392459, X-CSRFToken (来自 cookie), X-ASBD-ID: 359341, X-Requested-With: XMLHttpRequest, Content-Type: application/x-www-form-urlencoded.
  • 所有活动 feed 事件均使用 type: "instagram";直播聊天保持为 type: "instagramlive"。点赞事件使用正常的后台路径:后台先向专用 Reactions Overlay 发送一份,然后仅在以下情况下将其纳入主聊天/事件 feed: capturelikeevent 已启用,与 TikTok 和 MeetMe 一致。 hideevents 和自定义事件筛选器会在所有位置阻止它们。由于收件箱事件属于已登录的账号,在观看他人直播时会抑制这些事件(两种 /<user>/live/ 页面和快拍查看器中的直播;按个人资料解析所有权,并在查询失败后重试),并在您自己的直播及所有非直播页面上发出。一次仅有一个活动 Instagram 标签页轮询账号收件箱,且仅在已登录时运行轮询。
事件 触发时机 载荷说明
message (直播) 以下位置的新条目: get_comment 响应(comments[]/system_comments[]),或者在 REST 不可用时捕获新的 DOM 聊天行。 标准聊天载荷, type: "instagramlive"。REST 提供准确的 user.username, user.profile_pic_url,以及唯一的 pk 用于去重。
viewer_update heartbeat_and_get_viewer_count 报告变化的 viewer_count,在启用观众数捕获或 Hype 模式时。 meta 整数型观众数量。在以下情况下停止轮询: broadcast_status 不再是 "live".
stream_online / stream_offline stream_online 在 REST 直播会话开始时触发一次; stream_offline 心跳报告非直播的以下内容时触发: broadcast_status (需要观众数捕获或 Hype 模式)。 与 Twitch 和 Joystick 使用的共享直播状态词汇一致的仅元数据事件。
new_follower 带有关注类型的动态收件箱条目 notif_name (或 story_type 12)出现。 chatname 是新关注者, chatimg 其个人资料图像, chatmessage 收件箱文本(例如“x started following you.”)。
follow_request 一个 private_user_follow_request 快拍出现(私有账号收到的是请求,而非直接关注)。 结构与以下内容相同: new_follower,保持区分,以便自动化批准请求或使用不同的问候。
liked 带有点赞类型的动态收件箱条目 notif_name (包括 comment_like)出现。 与 TikTok/MeetMe 共用的点赞词汇。 chatname 是行为者, chatmessage 收件箱文本(例如“x liked your photo.”)。
message (自己帖子上的评论) 带有评论类型的动态收件箱条目 notif_name 出现。 普通聊天行(event: false), type: "instagram"; chatmessage 携带收件箱文本,包括评论摘录。
notification 任何其他动态收件箱条目类型(提及、标签、购物等)。 通用兜底项; meta.notifName 和 meta.storyType 保留原始快拍分类。

Facebook Live

实现: sources/facebook.js (DOM 抓取)以及位于以下地址的可选 Graph API 桥接: sources/websocket/facebook.html

  • DOM 捕获读取已渲染的 Facebook 评论;管理页面的 Graph API 桥接读取视频评论。两者都使用 type: "facebook"、标准聊天字段,并且没有 event 用于普通评论。API 桥接还包含可选的 platform: "facebook".
  • API 桥接使用 userid 用于可用时的作者 ID, timestamp 用于以 Unix 毫秒表示的有效创建时间,以及 contentimg 用于 API 提供的 HTTP(S) 附件图像。仅含图像的评论可能有空的 chatmessage. textonly 仅适用于消息正文:为 true 时使用原始文本,为 false 时使用经过转义的 HTML。
  • API 评论上下文使用 meta.messageId (原生评论 ID), meta.permalink, meta.videoId,以及 meta.pageId。早期 API 版本使用 meta.commentId,重复的作者/时间字段位于 meta,并在那里传递原始附件。新版本改用标准的作者/时间/媒体字段;这不会增加删除同步支持。
  • 观众数量仅在启用后刷新。API 桥接读取同时在线的 live_views;不会用视频累计观看次数代替,也不会为不可用的计数捏造零值。API 捕获不会从普通评论文本推断 Stars、会员、亮点或回复。
  • 当 Facebook 显示可见的以下内容时,会从渲染的 Live Chat DOM 中捕获 Stars: N sent 标记;它们填充 hasDonation 和 donoValue 按 100 Stars = 1 美元计算,不设置 data.event.
  • 测试时,添加 ssnreplay=1 添加到 Facebook Live URL,以处理刷新后已经可见的聊天行。
事件 触发时机 载荷说明
viewer_update DOM 轮询实时观众徽章;API 桥接在启用时轮询同时在线观众数。 meta 整数型观众数量,与其他来源一致。缺失或无法解析的计数会被跳过;实际为零的值有效。
hasDonation 在 Live Chat DOM 中渲染的 Facebook Stars。 标准聊天载荷; hasDonation 携带可见的 Stars 数量,例如 100 Stars,以及 donoValue 携带美元值。Stars 不设置 data.event.
highlightColor Facebook 渲染可见的 HIGHLIGHTED 标签。 使用普通聊天字段和 highlightColor;没有 data.event 已设置。Stars 仍然使用 hasDonation.

Online Church

实现: sources/onlinechurch.js

  • 依赖对公开聊天和媒体标题栏的 DOM 抓取。
  • 观众数量仅在以下情况下刷新: 显示观众数量 或 hype 模式已启用。
事件 触发时机 载荷说明
message 新条目出现在以下位置: #publicchat. 标准聊天载荷,包含发送者姓名、头像、徽章,以及 DOM 中存在时的可选会员标签。
viewer_update 每 10 秒轮询媒体标题栏中的实时在线人数徽章。 meta 整数型观众数量;发送 0 当徽章缺失或不可读时,用于清除过期计数器。

SharePlay.tv

实现: sources/shareplay.js

  • 依赖对 SharePlay 频道页面上直播聊天抽屉的 DOM 抓取。
  • 抓取程序连接后,仅发出新插入的聊天行和卡片;现有积压记录会被有意忽略。
事件 触发时机 载荷说明
message 主聊天信息流内出现新的聊天行。 包含作者、头像、徽章图像和保留 HTML 的表情的标准聊天载荷。串内回复还会填充 initial, reply,以及 meta.reply 当父行仍存在时。
raid SharePlay 将 Blitz 卡片插入直播聊天信息流。 映射为规范的突袭事件。 meta.cardType 为 "blitz",可选地带有 meta.fromLogin 和 meta.viewers 当卡片文本提供它们时。
shoutout SharePlay 将推荐/关注卡片插入聊天信息流。 发出为 data.event = "shoutout"。卡片横幅图片通过以下字段转发: contentimg,而 meta.cardType 和 meta.action 保留卡片标签/按钮文本。
viewer_update 每 10 秒轮询可见标题栏中的观众徽章。 meta 整数型观众数量;仅在以下情况下发出: 显示观众数量 或 hype 模式已启用,并发送 0 如果徽章变得不可读,则清除过期计数器。

Streamplace

实现: sources/streamplace.js

  • 读取 Streamplace 由 React 渲染的直播页面,并在连接时跳过可见的聊天积压记录。
  • 转发样式的消息,例如 Name (Discord): message 被标准化为转发的发送者姓名。
事件 触发时机 载荷说明
message 连接后出现新的 Streamplace 聊天行。 带有以下字段的标准聊天载荷: nameColor, chatbadges、保留 HTML 的链接,以及回复字段 initial, reply,以及 meta.reply 可见时。
viewer_update 启用观众数量捕获或 hype 模式时,标题栏观众徽章发生变化。 meta 整数型观众数量。

WorldsWave

实现: sources/worldswave.js

  • 支持 WorldsWave 直播页面和仅聊天 URL,例如 https://worldswave.com/kn_livecmd.php?cmd=viewStream&streamId=STREAM_ID&chatonly=1.
  • 使用稳定的 data-ww-*/ww-chat-* 标记,在可用时使用,同时为仅聊天页面和旧版布局保留旧版 kontackt 选择器。
  • 捕获连接时会跳过已有聊天历史;请用新消息测试。
  • 观众数量需要 显示观众数量 或 hype 模式。尚未实现专用礼物/打赏事件和回发。渲染的行仍可通过以下字段提供打赏标签: data-ww-donation.
事件 触发时机 载荷说明
message 出现一条新渲染的 WorldsWave 聊天行。 带有以下字段的标准聊天载荷: type: "worldswave"、发送者名称、头像、可选用户 ID、名称颜色、徽章、管理员状态、会员状态、打赏值、附件和频道标识。稳定的 WorldsWave 消息 ID 公开为 meta.messageId 并在同时显示的预览/完整聊天面板之间去重。禁用纯文本模式时,内嵌消息图像仍会经过净化。
viewer_update 启用观众数量捕获或 hype 模式时,可见的实时观众总数发生变化。 meta 是整数型观众数量。稳定的 data-ww-viewer-count 值优先;缩写形式的旧版值,例如 1.2K 作为回退方式进行标准化。

FLEX TV

实现: sources/flextv.js

  • 读取以下位置渲染的聊天面板: https://www.flextv.co.kr/channels/*/live 页面。
  • 聊天面板必须可见。来源连接时会跳过现有聊天历史记录,因此请使用新的聊天行进行测试。
  • 此来源尚未记录观众数量、打赏或回发路径。
事件 触发时机 载荷说明
message 新出现的 FLEX TV .chat-item 行出现在直播聊天信息流中。 带有以下字段的标准聊天载荷: type: "flextv", chatname, chatmessage, nameColor,徽章图片位于 chatbadges,以及位于以下位置的 FLEX 会员详情: meta 当由以下来源提供时: data-member.

Seal Team Sloth

实现: sources/sealteamsloth.js

  • 读取以下位置渲染的弹出聊天: https://sealteamsloth.com/popout-chat/* 页面。
  • 观众数量需要 显示观众数量 或 hype 模式。
事件 触发时机 载荷说明
message 出现一条新渲染的 Seal Team Sloth 聊天行。 带有以下字段的标准聊天载荷: type: "sealteamsloth"、发送者名称、头像和消息内容。
viewer_update 启用观众数量捕获或 hype 模式时,可见的实时观众总数发生变化。 meta 是整数型观众数量;缩写值,例如 1.2K 会进行标准化。

MeetMe — DOM 和 WebSocket 捕获

实现: sources/meetme.js

  • 读取 MeetMe 在以下位置渲染的直播聊天 DOM: app.meetme.com/live/view/... 页面,以及在 api.gateway.meetme-live.com/web-live/... iframe.
  • iframe websocket 可用时, wss://video-live.meetme.com/ 帧会在 DOM 回退之前解析,以捕获更丰富的直播事件。
  • hideevents 抑制非打赏事件;MeetMe 礼物和钻石打赏仍会填充打赏字段。 capturejoinedevent 启用加入/重新加入通知。行为者专属的 liked 事件使用共享后台路由,由以下设置控制: capturelikeevent;汇总的 reaction 效果仍明确以 Reactions Overlay 为目标。
  • 观众数量优先使用可见的 MeetMe 标题栏计数,仅在 DOM 计数不可用时回退到 websocket 总数。计数会在变化时发出,并且在以下条件成立时约每 30 秒重复发出最新计数: showviewercount/hypemode 已启用;关注者总数仅在变化时发出,且频率限制为约 60 秒一次。
事件 触发时机 载荷说明
message 新 SNSChatMessage websocket 帧到达,或新的 ChatMessage_* DOM 行出现在 ChatHistoryContainer_*. 标准聊天载荷,包含发送者姓名、头像、消息 HTML/文本和徽章图像/文本。DOM 行详情采用扁平结构,位于 meta 键,包括 messageId, roomId, level, levelColor, badgeLabels, badgeSrcs, badgeClasses, isBouncer, isTopStreamer, isBestOfTheWeek, rank,以及 rowClassName。WebSocket 载荷设置 meta.source = "websocket".
joined / rejoined / left SNSChatParticipant websocket 创建、更新或删除帧到达,或 MeetMe 渲染 DOM join-cell 行。加入/重新加入通知需要 捕获“joined”直播事件. 当 MeetMe 提供行为人的名称/头像时,会发出带有这些信息的聊天样式系统通知。 meta.isNewViewer, meta.viewerLevelId, meta.isBouncer,以及 meta.isSubscriber 保留参与者状态。
new_follower MeetMe 渲染 DOM 收藏/关注行,例如 Favorited. 使用共享的关注者事件词汇。 chatname 是行为者, chatimg 是可用时检测到的个人资料照片,而扁平的 meta.favoriteText/meta.targetName 保留原始行详情。
gift SNSGiftMessage websocket 帧到达,或 MeetMe 在聊天行中渲染礼物图像。 hasDonation 携带可见的礼物标签或钻石值, contentimg 提供时携带礼物图像,以及如下扁平键: meta.giftName, meta.giftCount, meta.amount,以及 meta.currency 保留结构化详情。 gift 事件保留给实际的礼物帧/行;打赏渲染仍应依据 hasDonation.
donation SNSDiamond websocket 帧提供钻石活动。 专用 diamond 帧被视为打赏事件。 hasDonation 格式化为钻石,以供共享美元换算,而 meta.amount/meta.currency 保持扁平结构,以供自动化使用。
liked / reaction SNSLike websocket 帧到达。 特定用户的点赞使用相同的 liked 词汇以及与 TikTok 相同的集中式后台路由。汇总/匿名点赞总数仅作为以下内容发送到回应目标: reaction,带有扁平的 meta.reactionType, meta.totalLikes,以及 meta.subscriberLikes。区别在于事件含义,而不是是否匿名: capturelikeevent 仅控制单个 liked/like 事件。
follower_update SNSVideo websocket 元数据提供关注者总数。 meta 是关注者整数,与共享计数器事件约定一致。
guest_update SNSVideoGuestBroadcast 创建/更新帧到达。 用于嘉宾/直播联播状态的仅元数据事件。扁平的 meta 键包括 status, position, totalGuests, isMuted, guestBroadcastId, videoViewerId,以及 broadcastId.
viewer_update 可见的标题栏观众徽章发生变化,或者 SNSVideo 徽章不可用时,websocket 元数据提供观众总数;启用期间,未变化的总数约每 30 秒重复一次。 meta 整数型观众数量;仅在启用观众数量捕获或 hype 模式时发出。

Velora

实现: sources/velora.js 和 sources/websocket/velora.js

  • 标准模式读取可见的聊天 DOM;WebSocket 模式通过 OAuth 使用 Velora Events API。
  • 支持的标准模式 URL 包括 https://velora.tv/*, https://velora.tv/dashboard/stream/popout?panels=chat%2Cactivity&channel=CHANNEL&layout=vertical,以及 https://velora.tv/dashboard/stream/popout/CHANNEL/obs-chat.
  • DOM 或 Events API 提供 Volts 和频道点数样式卡片时,会将其作为事件载荷发出。
事件 触发时机 载荷说明
message 出现新的 Velora 聊天行或收到 Events API 聊天消息。 标准聊天载荷,在非纯文本模式下保留徽章、作者颜色、链接和表情。
volts Velora Volts 卡片或 channel.volts 收到 Events API 载荷。 hasDonation 携带显示的 Volts 金额;DOM 捕获包含 meta.source = "dom".
channel_points Velora 频道点数/兑换卡片或 channel.channel_points_redemption 收到 Events API 载荷。 chatmessage 携带兑换消息或奖励标题; meta.rewardTitle 可用时标识奖励。
subscription 可见的 Velora 活动行表明某用户成为了频道会员/订阅者。 membership 携带可见的会员标签。
viewer_update 启用观众数量捕获或 hype 模式时,可见的观众数量发生变化。 meta 整数型观众数量。

Parti — 个人资料 / 弹出聊天捕获

实现: sources/parti.js

  • 支持如下个人资料 URL: https://parti.com/USERNAME 以及如下弹出窗口 URL: https://parti.com/popout-chat?id=USER_ID.
  • 启用观众数量捕获或 hype 模式时,观众数量使用 Parti 的直播心跳端点。
事件 触发时机 载荷说明
message 可见的 Parti 聊天行出现在个人资料或弹出聊天流中。 标准聊天载荷; nameColor 保留 Parti 渲染的作者颜色和 chatmessage 保留内嵌内容,除非启用了纯文本模式。
donation 可见的 Parti 打赏行表明某用户打赏了一笔金额。 hasDonation 携带显示的金额, meta.amount/meta.currency 可解析时会填充, meta.amountText 保留原始金额文本,而 donoValue 针对美元打赏设置。
viewer_update Parti 心跳返回实时观众数量。 meta 是整数型观众数量;页面为每个来源窗口复用一个心跳令牌,以避免虚增计数。

CHZZK - 弹出聊天捕获

实现: sources/chzzk.js

  • 支持 https://chzzk.naver.com/live/*/chat 和 https://chzzk.naver.com/iframe/live/*/chat.
  • 启用观众数量捕获或 hype 模式时,观众数量使用 CHZZK 的直播状态轮询端点。
事件 触发时机 载荷说明
message 可见的 CHZZK 聊天行出现在弹出聊天流中。 带有以下字段的标准聊天载荷: type: "chzzk", nameColor,徽章图片 URL 位于 chatbadges,以及位于以下字段中的已渲染表情: chatmessage 除非启用了纯文本模式。
聊天,带有 hasDonation 可见的 CHZZK 奶酪打赏行出现在聊天中。 hasDonation 携带显示的奶酪数量。这些行不设置 data.event.
viewer_update 直播状态轮询返回观众数量。 meta 是整数型观众数量。

Rumble — 标准 DOM 捕获

实现: sources/rumble.js

  • 需要经过身份验证的会话 Cookie,以便 service.php 观众 API 响应。
  • 渲染的 Rant 行提供 hasDonation;入站 raid 卡片提供 event: "raid"。此 DOM 来源不会发出 API 桥接的订阅者/关注者事件 feed。
事件 触发时机 载荷说明
message 可见的 Rumble 聊天行出现在页面或弹出聊天中。 标准聊天载荷; chatmessage 在页面渲染后保留 Rumble 表情图像 HTML,除非启用了纯文本模式。
viewer_update 调用 Rumble 的 video.watching-now 服务,每 30 秒一次。 meta 整数型观众数量;使用 credentials: 'include' 以复用会话 Cookie。
聊天,带有 hasDonation可见的 Rant 行包含价格。hasDonation 保留渲染的价格;不会添加打赏事件标记。
raid聊天中出现入站 raid 卡片。使用可见的突袭消息和可选卡片图像,位于 contentimg.

Rumble — Websocket/API URL

实现: sources/websocket/rumble.js

  • 需要创作者拥有的 Live Stream API URL,获取位置为 https://rumble.com/account/livestream-api。Rumble 文档说明此 URL 包含直播密钥,无需单独认证,并且只能与受信任的第三方分享。
  • 只读传输。公开的 Rumble Live Stream API 文档没有描述官方聊天发送端点,因此此来源会将消息/事件转发到 Social Stream,但不会将聊天发回 Rumble。
  • livestreams[].chat 仅在所选直播正在进行时填充。使用 ?streamId=... 在 API 提供多个直播时固定某个直播;无效 ID 现在会失败,而不是静默回退到其他直播。
  • 该页面还会解析 https://rumble.com/chat/popup/<livestreams[].id> 这样您可以直接打开普通注入式弹出聊天,而无需先加载主播的 /live 页面。
事件 触发时机 载荷说明
message 官方 API 解析以下内容后,Rumble 的 SSE 聊天流会收到新条目: livestreams[].id;回退到 livestreams[].chat.recent_messages. 标准聊天载荷。 meta.source 为 rumble_sse 当 SSE 聊天流可用并包含来自以下位置的头像 URL 时: users[].image.1;否则回退到 live_stream_api 不带头像。当弹出窗口表情目录可用时, chatmessage 将 Rumble 短代码表情渲染为图像 HTML,并且 meta.plainText 保留原始短代码文本。
donation 新的 rant 条目出现在 livestreams[].chat.recent_rants. hasDonation 携带美元格式的金额; meta 包含 amount_cents, amount_dollars,以及 expiresOn.
new_follower 新条目出现在 followers.recent_followers. 带有以下字段的系统事件: chatname 设为关注者用户名,并将时间戳放在 meta.followedOn.
new_subscriber 新条目出现在 subscribers.recent_subscribers. membership 设为 SUBSCRIBER; subtitle 对应 Rumble 提供时所记录的美元金额。
subscription_gift 新条目出现在 gifted_subs.recent_gifted_subs. chatname 是赠送者, hasDonation 变为 N Gifted,以及 meta 包含 totalGifted, remainingGifts, giftType,以及 videoId.
follower_update 每当所选关注者计数器变化时。 meta 整数型关注者数量。默认为 followers.num_followers;带有 ?followerMode=total,使用 followers.num_followers_total 当 Rumble 提供它时。
subscriber_update 每当 subscribers.num_subscribers 发生变化。 meta 整数型订阅者数量。
stream_online / stream_offline 所选直播在直播中和离线状态之间切换时。 meta 包含经过净化的直播字段子集(id, title, createdOn、类别标签、赞/踩,以及观众总数)。敏感值,例如 stream_key 被有意排除,不会转发。
viewer_update 每当 livestreams[].watching_now 针对所选直播发生变化。 meta 整数型同时在线观众数量;发出 0 当所选直播离线时,用于清除过期计数器。

此传输方式适用于您拥有或管理的频道。由于 API URL 包含直播密钥,请勿将其暴露在叠加层、日志、截图或共享浏览器配置文件中。官方 API 解析直播 ID 后,聊天头像来自 Rumble 的 SSE 聊天流;此传输方式不会抓取 Rumble 页面来获取头像。

YouNow — DOM 捕获

实现: sources/younow.js

  • 读取渲染的直播聊天 DOM,并发出带有以下字段的标准聊天载荷: type: "younow".
  • 观众活动行,例如 is watching, I became a fan!,以及 invited N fans to this broadcast. 会标记为 event: true 以便事件筛选器可以对其进行路由。
事件 触发时机 载荷说明
message 观众直播聊天中出现新的聊天行。 标准聊天载荷;粉丝/观众活动行会设置 event: true.
viewer_update 可见的观众面板计数发生变化,同时 showviewercount/hypemode 已启用。 meta 整数型观众数量;发出 0 当计数器消失时。

Favorited Studio - DOM 捕获

实现: sources/favorited.js

  • 读取渲染的直播聊天 DOM,并发出带有以下字段的标准聊天载荷: type: "favorited".
事件 触发时机 载荷说明
message 出现新的聊天行。 标准聊天载荷。
viewer_update 直播观众标签页计数发生变化,同时 showviewercount/hypemode 已启用。 meta 从以下位置读取的整数型观众数量: content-live-viewers 标签页。

BEAM - DOM 捕获

实现: sources/beamstream.js

  • 读取渲染的直播聊天 DOM,并发出带有以下字段的标准聊天载荷: type: "beamstream".
事件 触发时机 载荷说明
message 出现新的聊天行。 带有纯文本字段的标准聊天载荷: chatname,头像 URL 位于 chatimg,以及位于以下字段中的图片 URL 或 SVG 徽章对象: chatbadges。Beam 捕获页面隐藏的字段保持为空。Beam 原生个人资料链接不被视为外部转发来源。 contentimg 提供时可能携带内嵌 video/webm 附件。
viewer_update 观众计数器元素发生变化,且 showviewercount/hypemode 已启用。 meta 整数型观众数量;仅当聊天页面提供观众计数器时发出。

Castyr - DOM 捕获

实现: sources/castyr.js

  • 从以下位置读取新渲染的聊天行: https://castyr.live/homebeta/popout-chat/* 并发出带有以下字段的标准聊天载荷: type: "castyr".
  • 来源连接时会跳过已有聊天历史。
事件 触发时机 载荷说明
message 一个新的 .chat-message 行出现。 标准聊天载荷,包含发送者姓名、渲染的消息内容,以及来源提供时的姓名颜色。
viewer_update 可见的活跃聊天计数发生变化,同时 showviewercount/hypemode 已启用。 meta 是从 Castyr 带标题的活跃聊天元素中读取的整数计数。

SOOP — 播放器 DOM 捕获

实现: sources/sooplive.js。支持统一的 play.sooplive.com 播放器和旧版 play.sooplive.co.kr URL。提供旧版全局聊天布局时,仍会识别它。

公开聊天发出 type/platform: "sooplive",纯文本的 chatname/userid, nameColor,以及经过清理的 chatmessage。排除现有行、重复消息 ID、翻译副本和私人私信。表情会转换为安全图片,或在纯文本模式下转换为替代文本。

带有 showviewercount 或 hypemode 启用时, viewer_update 携带整数 meta 来自播放器的 #nAllViewer。仅聊天的弹出窗口可能不提供此计数。SSApp 打开独立弹出窗口时会使用完整播放器,因为当前 SOOP 弹出窗口依赖其打开者。

Gosh - 频道聊天捕获

实现: sources/gosh.js。打开 https://gosh.com/USERNAME 并让聊天可见,或将该 URL 粘贴到 SSApp 的 Add other source(添加其他来源)。无需弹出聊天窗口。

新的聊天行发出 type/platform: "gosh",纯文本的 chatname, nameColor,以及经过清理的 chatmessage。内联图片和 GIF 保留安全的 HTTP(S) URL。使用 textonlymode,图片转换为替代文本或 [image] 当没有替代文本时。头像、徽章、打赏和会员在捕获行中缺失时保持为空。

让虚拟化聊天列表保持滚动到最新消息。排除现有历史记录、重新渲染的行和无作者的系统通知。渲染索引仅供内部使用,不会作为原生消息 ID 发出。不会推断关注、打赏、观众数量或管理事件。

Livacha — 聊天室捕获

实现: sources/livacha.js。打开 https://livacha.com/chat/ROOM 并让聊天可见,或将聊天室 URL 粘贴到 SSApp 的 Add other source(添加其他来源)。

新的聊天行发出 type/platform: "livacha",纯文本的 chatname, chatimg, nameColor,以及经过清理的 chatmessage。相对头像和内联图片 URL 会转换为绝对 HTTP(S) URL。段落、换行和列表会展平成一条聊天消息。使用 textonlymode,图片转换为替代文本或 [image].

消息 ID 在内部用于避免重复捕获编辑内容和重新挂载的行。会跳过初始历史记录和前置加载的旧消息;时间戳和回应菜单不属于捕获正文。不会推断打赏、会员、管理或观众数量事件。

Stream.space — 实验性 DOM 捕获

实现: sources/streamspace.js。仅匹配 https://beta.stream.space/chat-popup.php?channel=USERNAME 和等效的 https://stream.space 弹出窗口。

新渲染的聊天行发出 type: "streamspace", platform: "streamspace",纯文本的 chatname/userid, chatmessage,头像 chatimg,以图片呈现的等级 chatbadges,以及 nameColor。内联表情会重建为安全图片,或在以下情况下使用其替代文本: textonlymode 已启用。排除现有历史记录、欢迎通知、回复预览和置顶重复项。

viewer_update 携带整数 meta 读取自 #popupViewersNum 当 showviewercount 或 hypemode 已启用。不会推断打赏、会员或管理事件。

实验性:检查期间 beta 弹出窗口一直停留在 Loading。SSApp 加载了弹出窗口并捕获到观众更新,但实时聊天交付和生产版弹出窗口仍未验证。SSN 无法捕获网站未渲染的消息。

w.tv 和 Prime — DOM 捕获

实现: sources/wtv.js 在 https://w.tv/USERNAME/chat 和 sources/prime.js 在 https://prime.gs/USERNAME?chat_popout=1.

新的聊天行使用 type/platform 的 wtv 或 prime,纯文本的 chatname, nameColor,以及经过清理的 chatmessage。内联表情会转换为安全图片,或在纯文本模式下转换为替代文本。Prime 还包括该行的 userid 并支持已登录的个人资料链接及未登录的用户名标签。当已验证的行结构中不存在头像和徽章时,这些字段保持为空。

不包含初始历史记录、置顶卡片和回复预览。w.tv 使用虚拟化聊天列表:请保持滚动到最新消息,以便捕获。其 DOM 测试 ID 是渲染索引,并非原生消息 ID。Prime 会跳过在初始消息上方加载的旧历史记录和被忽略用户的占位内容。

这两种弹出窗口都不提供经过验证的直播观众数量,因此这些适配器不会发出观众更新,也不会推断打赏、订阅或管理事件。

跨平台事件对齐

使用此表了解类似概念如何在各平台之间映射。在可能的情况下,新来源应与第一列中的通用事件名称保持一致。

概念 YouTube WS Twitch WS Kick WS
新会员/订阅者 sponsorship new_subscriber new_subscriber
续订/重新订阅 resub resub resub
赠送订阅 giftpurchase subscription_gift subscription_gift
收到礼物 giftredemption - -
里程碑 membermilestone - -
捐款/打赏 superchat, supersticker, jeweldonation 带有 hasDonation cheer (bits) donation
新关注者 new_follower (轮询)* new_follower new_follower
观众数量 viewer_update viewer_update viewer_update
关注者计数 - follower_update follower_update
订阅数量 subscriber_update subscriber_update -
直播状态 live_chat_ended stream_online/stream_offline stream_online/stream_offline
突袭 - raid -
奖励兑换 - reward reward

一致性说明

  • YouTube 使用 sponsorship 用于新会员,而 Twitch 和 Kick 使用 new_subscriber。构建跨平台触发器时,可考虑同时检查两者。
  • resub 保持一致 用于全部三个平台的续订。
  • 礼物事件有所不同: YouTube 使用 giftpurchase/giftredemption,而 Twitch 和 Kick 使用 subscription_gift.
  • 打赏因平台而异: YouTube 使用具体的付费事件名称,例如 superchat, supersticker,以及 jeweldonation 带有 hasDonation;Twitch 有 bits(cheer);Kick 有打赏(donation).
  • new_follower 现在保持一致 适用于全部三个平台,但 YouTube 会轮询最近的订阅者,返回的结果可能有延迟或不完整。
  • 点赞和回应使用不同的数据约定: 单个 liked/like 事件会到达 Reactions Overlay,除非被全局筛选,并且仅在以下条件成立时进入主处理管线: capturelikeevent 已启用。可视化或平台原生的 reaction 事件保留生成方定义的路由。汇总的 likes_update 计数器由以下设置单独控制: captureliketotals.

覆盖范围和兼容性限制

本参考描述已实现的载荷,并不保证每个平台都会提供每种事件。空的 hasDonation 在来源中的赋值并不能证明支持打赏。DOM 可见性、账号权限、捕获开关和 API 可用性仍决定收到哪些内容。删除转发因来源而异;不要假定所有来源都支持管理同步。

已跟踪的不一致和空缺

配对/区域 已观察到的不一致 / 空缺 影响
Twitch:标准模式与 Websocket 共享: reward, subscription_gift, viewer_update, hype_train,以及需主动启用的 watch_streak。仅 Standard: giftpurchase, knock, community_highlight。仅 WebSocket: new_subscriber, resub, cheer, powerup, raid, new_follower, follower_update, subscriber_update. channel_points 现在是 Twitch 奖励兑换的已弃用旧版别名;新集成应依据 reward.
Kick:标准模式与 Websocket 标准模式发出轻量标记(gift, reward,布尔值 true, viewer_update)。WebSocket 增加官方关注、订阅、礼物、奖励兑换、KICKs、管理和直播状态事件。它保留对旧版 raid 载荷,但 Kick 目前不提供官方 raid/host 订阅。 Websocket 模式更丰富;切换时,应检查围绕仅标准模式事件名称构建的自动化。不要要求 Kick 突袭事件。
YouTube:标准模式与 Websocket 共享: superchat, supersticker, jeweldonation, sponsorship, resub, giftpurchase, giftredemption, viewer_update。仅 Standard: thankyou, redirect。仅 WebSocket: membermilestone, new_follower, subscriber_update, view_update, likes_update (需主动启用)。 两者的核心会员/事件名称保持一致;Super Chat、Super Sticker 和 Jewels 使用 hasDonation,而会员礼物的购买/兑换不使用。
所有界面 许多来源会填充 hasDonation 不设置 data.event. 这是正确的;打赏渲染应依据 hasDonation,带有 data.event 保留给系统/事件语义。

来源专属别名和旧版名称

这些映射专用于列出的来源/上下文,不是全局替换。使用方对别名的支持因页面而异。当前 TikTok DOM 和 TikFinity 来源仍然发出 followed;Velora 使用 subscription 和 channel_points,Streamlabs 则使用 subscription。接受当前来源约定及其相关旧版别名,而不是重命名每个匹配的事件。

别名 / 旧版名称 规范替代项 上下文
subscriptionnew_subscriberTwitch/Kick 新订阅
subgiftsubscription_giftTwitch 赠送订阅
membershipsponsorshipYouTube 新会员(通用)
new_membersponsorshipYouTube 新会员
new_membershipsponsorshipYouTube 新会员
newmembersponsorshipYouTube 新会员
new-membershipsponsorshipYouTube DOM 抓取程序(连字符变体)
upgraded_membershipresubYouTube 等级升级
upgraded-membershipresubYouTube DOM 抓取程序(连字符变体)
membership_upgraderesubYouTube 等级升级
membership_milestonemembermilestoneYouTube 里程碑聊天
member_milestonemembermilestoneYouTube 里程碑聊天(下划线变体)
gift_membershipgiftpurchaseYouTube 礼物套装
membership_giftgiftpurchaseYouTube 礼物套装
giftmembershipsgiftpurchaseYouTube 礼物套装(复数变体)
gifted_membershipgiftredemption收到 YouTube 礼物
gifted_membershipsgiftpurchaseYouTube 礼物套装(复数变体)
community_giftgiftpurchase社区赠礼包
channel_pointsrewardTwitch websocket 奖励兑换(旧版别名)
followednew_follower当前 TikTok DOM/TikFinity 输出;组合 TikTok 捕获模式时应接受这两个名称。

使用本参考

  • 添加新事件时,复用现有词汇(subscription_gift, viewer_update等)。如确实无法避免差异,请在此记录并说明原因。
  • 保持 data.meta 保持可预测:优先使用扁平键,绝不将混合数据塞入字符串,并始终包含单位(currency, bits, duration).
  • 更改载荷时同步更新本页;仅在共享开发规则变化时更新代理说明。
  • 验证载荷更改时,同时检查发出载荷的来源和使用载荷的叠加层或 Event Flow 触发器。
  • 是否捕获取决于来源支持和设置。要在停靠面板或精选叠加层中隐藏带事件标记的行,请添加 &hideevents 或 &hideallevents。要隐藏所选事件,请使用 &filterevents=subscription_gift,new_follower,gifted.
  • 对于 YouTube、Twitch 和 Kick,启用 WebSocket 模式 以获得最广泛的平台专属事件支持。YouTube 的礼物/打赏捕获(包括礼物和 Super Chat)在标准和 WebSocket 模式下均可用;WebSocket 还增加了额外的事件类型。具体支持仍因平台、账号角色和已授予的权限范围而异。

返回顶部

变现叠加层

NinjaBacker 打赏使用 platform: "ninjabacker", type: "ninjabacker", chatname,纯文本的 chatmessage, textonly: true、带有来源前缀的 id,格式化后的 hasDonation,以及数字形式的 donoValue。它们是普通打赏样式行,没有 event 覆盖值。 meta.ninjabacker 包含 ISO currency 和主货币单位的 amount。匿名打赏使用显示名称 Anonymous。来源使用实时 SSE(不重放),或 SSN API 上需主动启用的已签名 webhook 接收器(队列交付最长七天)。可靠交付使用稳定的 ninjabacker:delivery:DELIVERY_ID ID。两种模式都不会接收退款/争议冲正。接收端凭据和签名密钥绝不会进入事件载荷。由调用方控制的 callbackId 值不是付款身份,也不会被转发。仪表板测试打赏排除在打赏行之外。它们发出 event: "monetization_test" 带有 meta.ninjabackerTest 包含 id 和 at(Unix 毫秒),仅用于专用预览提醒。

event: "monetization_update" 是来自以下位置的仅元数据快照: type/platform: "socialstream". meta.monetization.wishlist 包含 enabled、qr、position、rank、total、公开的 url,以及当前项目(name、amount、currency、image、公开的 url)或 null。 meta.monetization.ninja 包含 enabled、qr、position、username 和公开的打赏 url。绝不包含私有 Tip ID。 meta.monetization.ebay 包含 enabled、qr、position、display(cycle/cheapest/first)、seconds、可选启用的公告设置和公开项目。每个项目有 id、name、amount、currency、image、url、auction、startingBid、endsAt、available、bought 和 updatedAt。时间为 Unix 毫秒。不包含卖家凭据或买家身份。

主播确认的心愿单购买还包括 meta.wishlistPurchase 带有 id、name、可选的 supporter 和 at(Unix 毫秒)。这是主持人确认,并非 Amazon 付款通知,也不计为货币打赏。叠加层应对其 id 去重,并忽略旧的购买通知。

Shopify 已付款订单

可选的带签名 Shopify 接收端发出 platform/type: "shopify" 和 event: "purchase" 仅用于 orders/paid 带有 financial_status: "paid"、正数总额, test: false、未取消,且带有当前的已签名请求体更新时间戳。测试、未付款、过期、取消和退款通知不会发出购买操作。不会推断赠礼意图。

chatname 为 Anonymous;排除客户字段、私有备注和订单 URL。 chatmessage 是纯文本,带有 textonly: true; subtitle 保存最多三个公开商品标题。 meta.commerce 包含 orderTotal 和 currency 以商店货币计,另加 quantity 当已知完整有效的数量时。接收者和实物/数字用途保持未设置。没有 hasDonation 或 donoValue 已设置。 id 是具有 Shopify 前缀、以商店/订单为范围的稳定不透明哈希;它不是原始订单标识符。

购买使用现有的活动、multi-alerts Purchase 类别和 Event Flow 路径。商品推广使用现有的 meta.monetization.commerce 目录。导入商品或将其推广标签设为 Gift 不会生成购买或礼物事件。 Shopify 设置和交付限制.

礼物和商业交易

使用 event: "gift" 用于礼物, giftcontribution 用于为礼物提供付费支持, giftfunded 用于筹款完成,以及 purchase 用于商品销售。这些名称独立于提供商,也不取决于商品是实物还是数字商品。将旧版的 giftpurchase 用于赠送会员的事件;Throne 以前错误地使用该名称,现在发出 gift。现有的会员事件生成方保持不变。自定义 Throne 事件名称筛选器应改用 gift;打赏筛选器无需更改。

hasDonation 仍为付费支持的兼容信号,带有 donoValue 保存所提供或估算的美元值。礼物和贡献保留这些字段。筹款完成会省略两者,避免重复计算贡献。普通商品销售默认省略它们,保持 eBay 的数据约定。不要根据商店、心愿单 URL 或实物商品推断赠礼意图:为买家或其他收件人购买仍然属于销售,除非来源明确标识为向创作者赠礼。

可选的共享 meta.commerce 字段为 recipient (creator、buyer、other), itemType (physical、digital、service), quantity (正数商品数量), currency (ISO 货币), goalAmount (以主要货币单位表示的筹款目标,绝不是新增收入),以及 orderTotal (已知的主要货币单位已付款订单总额;属于商业交易,而非打赏收入)。省略未知详情。商品名称保留在 subtitle,图片位于 contentimg,以及位于以下字段中的支持者文本: chatmessage。现有提供商元数据仍然可用。Throne 提供接收者和货币,并在完成时提供 goalAmount;eBay 提供数量。两者都不会猜测商品类型,也不会公开接收者的私人信息。

即使没有支持者文本,活动信息流也会显示这些事件。Multi-alerts 对礼物和贡献使用打赏展示方式,包括一个不含货币价值的独立 Gift Fully Funded 通知。购买有单独的 Purchase 类别,默认启用,带有 purchasestyle, purchasesound, purchaseaccent,以及 disablepurchases URL 控件。购买提醒不会改变打赏总额。

Event Flow 在 Event Type 和 Other Event 触发器中提供这些事件名称。打赏触发器仍检查 hasDonation;Gift Sub 触发器保留会员语义。Compare Property 接受嵌套路径,例如 meta.commerce.recipient。操作模板接受 {meta.commerce.quantity} 和 {meta.commerce.currency},以及现有的 {donation}, {subtitle},以及 {meta}。嵌套路径区分大小写,缺失值显示为空,并禁止遍历原型。

创作者商业 webhook 和促销叠加层

Ko-fi 公开 Donation 付款保留 hasDonation 并获得美元 donoValue。订阅付款使用 new_subscriber 或 resub,等级位于 membership。Shop Order 和 Commission 使用 purchase 不带打赏值。私有 Ko-fi 事件仍被排除。表单编码的 JSON 只解码一次;姓名和消息为纯文本。

Buy Me a Coffee donation.created 保留货币支持; extra_purchase.created 和 commission_order.created 变为 purchase. wishlist_payment.created 变为 giftcontribution 仅使用该付款金额; meta.commerce.completed 记录提供商的完成标志,不会再发出一条货币金额行。 membership.started 变为 new_subscriber 等级位于 membership,不再误用 hasDonation 用于等级名称。订阅开始金额不会单独被视为一次付费扣款。测试、已退款、失败和不受支持的更新/生命周期事件不会生成付费提醒。隐藏的支持者备注会被省略。

Fourthwall 支持 ORDER_PLACED(purchase)、GIFT_PURCHASE(gift,接收者为其他人)、DONATION(普通打赏行)和 SUBSCRIPTION_PURCHASED(new_subscriber)。现有订单总额保留 hasDonation 以保持向后兼容,标记为 meta.commerce.legacyDonationValue: true;这是对新商品销售默认规则的明确例外。使用礼品卡的订单会发出没有打赏值的购买提醒:无法可靠地从订单总额推断新的扣款,且礼品卡购买已计入。账单姓名和电子邮件地址不用于公开身份。仪表板测试事件和订单更新不会生成付费提醒。

这些适配器保留现有的转发、机器人操作、Event Flow 和目标路由,并带有 meta.webhookId 去重。它们提供公开姓名、纯文本消息,以及以下字段中的已知商品名称: subtitle,以及 ISO meta.commerce.currency 在适用时与数值型打赏值一起提供。它们不会添加退款记账或新的接收端身份验证;请使用提供商现有配置的 webhook 路由。

meta.monetization.commerce 在 monetization_update 包含 enabled、qr、position、display(first/cycle)、seconds 和公开的 items 数组。每个项目有 name、url、image、可选的 amount(未知时为 null)、currency 和 purpose(shop/gift/support/membership)。这些是主持人输入的推广详情,并非付款凭证。添加或编辑项目不会发出打赏或购买事件。通用叠加层使用 mode=commerce; view=both|showcase|card|alerts 将推广与活动分开。可选的 style、scale、cardevery、cardfor 和 onlytype URL 参数控制展示方式。现有提供商模式还接受 view 和计划控件。请参阅 设置指南.

Throne 礼物事件

可选启用的变现集成转发带签名的 Throne 事件,带有 platform 和 type 设为 throne。三者都使用稳定的交付 id,纯文本的 chatname, chatmessage 带有 textonly: true,商品名称位于 subtitle,以及位于以下字段中的可选 HTTPS 缩略图: contentimg.

事件含义打赏金额 / 排名
gift一件已购买的礼物hasDonation 以及美元 donoValue;+1 礼物排名
giftcontribution对礼物的出资仅贡献金额;不增加排名
giftfunded一件众筹礼物已完成否 hasDonation 或 donoValue,避免重复计算之前的贡献;+1 礼物排名

meta.throne 包含 itemName, creator (公开用户名), completed, currency 和主货币单位的 amount。对于 giftfunded,金额描述的是目标,而非新增收入。匿名赠礼者仍保持为 Anonymous;已完成的社区赠礼使用 Community。私人支付和配送字段绝不会被转发。

monetization_update 快照还包含 meta.monetization.throne: enabled, username, url, qr, position, rank,以及 gifts。这些快照不包含 webhook URL 或监听凭据。

主播语音命令(桌面预览)

Event Flow 的 当我说…… 触发器接收来自 SSApp 的可信本地麦克风命令。其内部操作上下文使用 chatname: "Host", type: "hostvoice",识别到的短语位于 chatmessage,以及 textonly: true。这不是平台入站事件,也不是新的聊天传输。通过聊天发送这些字段无法激活语音触发器。

需要更新后的桌面版本、明确启动麦克风,并在测试模式后启用操作。请参阅 预览设置和验证状态.

商品展示控件

现有的 monetization_update 快照可能包含 meta.monetization.commerce.live:null 表示已保存的计划,或 {mode: "show" | "hide", url?: "https://...", until: 0 | epochMilliseconds}。Show 匹配已保存的准确商品 URL;找不到商品则不显示卡片。正数 until 到期后恢复已保存的计划;零表示持续到状态更改或 SSN 重启。Hide 抑制促销展示,不抑制付费活动提醒。

commerce.viewerURL 是已发布的只读商店 URL,或空字符串。存在时,推广二维码会链接到该地址。它绝不包含 SSN 会话或发布密钥。商品保留在 commerce.items。显示控制、导入或发布不会发出打赏/购买事件。请参阅 商品控件 用于 Event Flow 和远程 API。

Event Flow 的 commerceControl 操作等待直接/Chrome 回复(最多八秒)。对于普通事件载荷,它保留事件并添加 meta.commerceControlResult: {success: true, commerce: controlState} 或 {success: false, error: "..."}。对于已有的数字、数组或其他非对象 meta,元数据保持不变,诊断信息返回为 commerceControlResult 改为用于操作结果。失败的控制会停止该链中的后续操作,但不会抑制原始付款事件。超时并不能证明控制未应用;重试 Next 等相对命令之前,请检查状态。成功确认的是本地选择/隐藏/计划状态,绝不表示 OBS 可见或公开页面已同步。

命名的 Stream Deck / API 工作流

此 命名工作流触发器 创建内部 Event Flow 消息,带有 type: "api", event: "workflow_trigger", chatname: "Stream Deck / API",空的 chatmessage,以及 textonly: true。其 meta.workflow 对象包含触发器名称和调用方提供的 JSON data 对象。通过如下模板读取值: {meta.workflow.data.minutes}。只会评估明确匹配该触发器的已保存且已启用流程。这不是来自观众/聊天的入站事件,也不会作为聊天广播;将这些字段复制到聊天中不会激活命名触发器。

NinjaChatter 观众试点

实验性的配对扩展连接器发送仅供显示的行,带有 type: socialstreamchat, platform: ninjachatter,以及 textonly: true. meta.ninjachatter 携带 origin: audience,描述性的 provider,以及公开的 room ID。这些行会跳过平台回复、机器人、Event Flow 触发器和积分处理。显示某个提供商并不代表获得授权。旧版 NinjaChatter 来源捕获包括 meta.ninjachatter.room 用于聊天室专属的重复抑制。

Cheer 使用独立且经过认证的领取与结果路径,绝不使用特殊聊天命令。固定预设发出现有的 Actions 叠加层 show_text 消息,持续三秒。收到它表示传输已接受,并不表示已验证 OBS 显示。任何观众载荷都不能选择任意操作。NinjaChatter 默认禁用此试点;在新的私有配对边界通过验证之前,Electron 保留现有转发方式。

商业名额看板和最近销售

现有的 monetization_update 事件(type/platform: socialstream)还包括 meta.monetization.boards。其 board 包含 title, style (名额/队伍), columns (1–20), visible,以及最多 120 个 spots。每个名额都有一个字符串 id,纯文本的 label, status (available/claimed/revealed)以及 result (纯文本,揭晓前为空)。领取和揭晓是由主播输入的显示状态,并非购买证据或随机分配。

boards.sales 保存最多 100 条最近记录: id, title,可选的 amount (未知时为 null), currency, quantity, source,以及 at (记录时的 Unix 毫秒时间戳)。 automatic 启用收集, salesVisible 控制显示和 revision 在变化时递增。自动收集仅接受 purchase 来自 Shopify、eBay 卖家、Fourthwall、Ko-fi 和 Buy Me a Coffee 的事件;排除私有/测试事件。它不会将拍卖元数据、打赏、礼物或名额认领视为购买。自动记录不会用订单总额、商品刊登价格或打赏金额代替商品单价。手动记录使用 source: "Host confirmed".

状态会持久保存在此安装实例的私有变现存储中;公开快照不包含交付去重 ID、买家身份和密钥。明确显示的销售记录保留其事件 ID,以供移除。退款需要主持人手动移除。重复购买 ID 会单独记忆(最多 2,000 个),包括清除可见历史记录之后。现有的 getCommerceState 响应包含 commerce.boards; commerceControl 接受以下文档中记录的面板/销售命令: 面板指南。手动编辑会广播更新后的状态,但绝不会创建购买事件、打赏总额或付费奖励。主播快照缺失 35 秒后,叠加层会隐藏。

卖家工作流新增内容: commerce.boards.board.id 标识一代面板。手动 saleAdd 可能提供 boardId 和 spotId 以原子方式记录销售并认领该名额;仍在最近历史记录中的重复关联销售会被拒绝。 saleRemove 带有 reopenSpot: true 仅当面板代次仍匹配时释放该名额。公开销售条目省略这些操作员关联字段。可选的 platform 在手动销售记录上保留其来源以供筛选,而 source: "Host confirmed" 标识确认方式。 amount 是该条目的总数,包括其 quantity。eBay 已付款订单适配器的 meta.ebayPurchase.quantity 会保留。

salesSettings.auctionSource 启用 Whatnot 或 eBay Live 商品助手。控制响应中的 commerce.auction 仅包含最近捕获内容中的 source、title、priceText、status 和 at: auction_update,或 null。五分钟后过期,并在来源更改、空闲快照或重启时清除。该辅助工具仅供操作员使用:既不持久保存,也不纳入面向观众的广播;出价者/获胜者身份会被丢弃。来源脚本和拍卖事件载荷保持不变。复制草稿不会确认付款,也不会创建销售。