Pawcast v0.1 · DRAFT

Extras 挂件

4 个独立直播挂件:Profile Border 头像框 / Voting Tool 投票工具 / Lucky Game 幸运转盘 / Lucky Fans 观众抽奖。每个挂件都是一个独立 URL,可同时在 OBS / TikTok LIVE Studio 里加载多个,覆盖直播间任意位置。

v0.1 · spec 4 挂件 12 屏 + 4 OBS 预览
01 · PROFILE BORDER

头像框 · 展示型挂件,不计票

用于展示成员头像 / 榜位 / 称号等身份信息。20+ 装饰皮肤可选,横/竖布局,每个实例独立 URL。点击 Copy URL 后加到 OBS Browser Source 即可。

Pawcast · Extras / Profile Border v0.1.0
Profile Border Voting Tool Lucky Game Lucky Fans

Console · 3 个实例

最大 8 个
#1 Yoochan · TOP1 活动中
布局: 横版 · Skin #07 · 标签 "KING OF TODAY"
#2 Sian · #2
竖版 · Skin #12
#3 Rohan · WIN
竖版 · Skin #03
布局方向

Skin 选择 · 已选 #07

20+ 装饰皮肤
01
基础
02
👑
03
04
05
🔥
06
07
TOP1
08
09
💖
10
11
12
头像选择
文字标签
链接尺寸建议:320×120 (横版) / 200×280 (竖版)
多实例 Console每个直播间可同时存在多个头像框(最多 8 个)。每个实例独立 URL,OBS 中分别加载,可任意叠放在直播画面上。
布局方向横版适合放在直播间下方一字排开(左中右三人 cap 推荐);竖版适合放在两侧栏。
20+ 装饰皮肤第一版预制 20 套,后续版本开放上传 PNG / SVG 自定义。skin_id 直接进 URL 参数。
头像源从团员库选自动拉 TikTok 头像;从历史列表选已用过的;上传支持 PNG/JPG/WebP,自动剪裁圆形。
文字标签支持中英日韩。常用:「TOP1」/「Leader」/「WIN」/「KING OF TODAY」/「冠军」/「초대」。最多 12 字符防止溢出。
实现说明挂件页是独立 HTML,通过 URL query param 接收配置:?skin=7&label=TOP1&avatar=https://...&layout=h。WebSocket 订阅头像变化(用户上传后实时更新)。
性能挂件页面加载后驻留浏览器进程,主进程通过 WS 推送增量配置。改皮肤瞬时生效,OBS 不需重新加载源。
browser source · 320×120 · transparent
TOP1
Yoochan
Sian
Rohan
挂件最终呈现这就是 3 个 Profile Border 实例同时加载到 OBS 后,叠在直播画面上的样子。三人横排,最右边的 Yoochan 用 #07 Skin + TOP1 标签突出显示。
透明背景挂件 HTML 本身是透明 body,OBS Browser Source 默认透明,可直接叠在视频流之上。
位置控制不在挂件里控制位置,由主播在 OBS 里自由拖拽源。挂件只负责把头像 + 边框 + 标签渲染出来。
02 · VOTING TOOL

投票工具 · 评论投票,2-10 个选项

观众通过在评论中输入选项关键词参与投票。结果可实时显示百分比 / 票数 / 二者皆有。常用于二选一、多选一、排序、决定下一首歌曲、决定 PK 对手等。

Pawcast · Extras / Voting Tool v0.1.0
Profile Border Voting Tool Lucky Game Lucky Fans
My Votes · 3
已结束 02:00
BEST OF THE BEST
总票数 247 · Cathy 60%
进行中 01:24
VOTE NEXT DANCER
总票数 89 · Cathy 领先
未开始
主播谁更帅
5 选项 · 待启动
规则设置
投票类型
结果展示
允许重复投票
可冲票数但易刷
结果自动排序
按票数从高到低
投票时长
关键词匹配
投票选项
标题
Option 1 53
Option 2 27
Option 3 9
实时预览
VOTE NEXT DANCER
CATHY
60%
KITTY
30%
MORA
10%
链接尺寸建议:380×280
多投票管理左侧 My Votes 列表可同时管理多个投票,支持「未开始 / 进行中 / 已结束」三状态。每个投票独立 URL。
选项关键词匹配「选项名匹配」=观众输入 CATHY/KITTY 才计票(支持大小写不敏感、模糊匹配)。「数字匹配」=观众输入 1/2/3 即可,更易于操作但会误判。
2-10 个选项选项过多观众难记忆。常用 2-4 个,最多 10 个。每个选项最多 12 字符。
允许重复投票关闭:每用户仅记一票,结果更准但参与感弱。打开:可冲票数提升参与,但易被刷。
实时预览右下角 Live Preview 看挂件最终呈现。改任何参数立即更新。
实现说明挂件页通过 WS 订阅评论事件,本地做关键词匹配 + 计数。每条评论的 user_id 用于"重复投票"判定。投票结束后结果落库。
防刷同一 user_id 在「不允许重复」模式下后续评论被忽略。机器人评论被基础风控过滤(评论速率异常 + 账号注册时间 <30 天)。
browser source · 380×280 · transparent
VOTE NEXT DANCER 01:24
CATHY
60%
KITTY
30%
MORA
10%
发评论 CATHY / KITTY / MORA 参与投票 · 89 票
挂件最终呈现右上角倒计时跳动,进度条带动画推进。结束时自动锁定 + 显示最终结果 5 秒,然后淡出。
底部参与提示告诉观众输入哪些关键词。否则新观众进来不知道怎么投。
动画细节新票进来时对应进度条 0.4s 平滑增长 + 数字变化用 react-spring 做 tween。第一名进度条加 0.5px 紫色描边突出。
03 · LUCKY GAME

幸运转盘 · 抽题、抽任务、抽惩罚

2-18 个选项的可视化转盘,4 种皮肤可选,指针四向可调。10 套 Config 可一键切换,应对不同场景(暖场题库、惩罚题库、福利题库)。

Pawcast · Extras / Lucky Game v0.1.0
Profile Border Voting Tool Lucky Game Lucky Fans

Spin Operation

100 200 100 500
上次结果:500 · 21:24
Spin Settings
Spin Style
Pointer Position
Title
音效
旋转音 + 中奖鼓
Content Settings
Config Switch
选项内容(每行一个,2-18 项)
提示:选项名尽量短(≤6 字),让观众不需要侧着头读
链接尺寸建议:360×360
转盘操作Start = 完整旋转 3-4 秒(戏剧效果)。Quick = 快速旋转 0.8 秒(场上节奏紧凑时用)。两者结果都是均等概率,可信赖。
4 种 Spin Style1 = 简洁圆 / 2 = 金色边框(默认)/ 3 = 霓虹边框 / 4 = 节日限定(圣诞 / 新年)。
Pointer Position4 个方向。在 OBS 里挂件位置变了要相应调整指针,否则视觉错乱。
10 套 Config每套独立保存一组选项内容。常见用法:暖场题库 / 表情挑战 / 惩罚 / 福利金额 / 任务等。1 秒切换无需重新输入。
选项 2-18 个2 = 二选一抽奖;4-8 = 标准抽题;12-18 = 抽奖盘(金额)。超过 18 个视觉太挤难辨识。
实现说明转盘用 SVG + CSS transform: rotate 实现。旋转角度用伪随机:先选目标选项,再算需要转多少度让指针落在该扇区。包含 5+ 圈基础旋转 + 缓出。
音效旋转音用 1 个 1.5s 滴答 loop,中奖鼓在停止瞬间播放(DING + 鼓震)。音频文件本地包含,不依赖 CDN。
04 · LUCKY FANS

观众抽奖 · 福利发放、中奖名单

从观众名单(关注者 / 送过礼者 / 评论过的) 中随机抽 1-5 位中奖。中奖记录可保留 + 导出。可设优先名单(VIP)/ 黑名单(已中奖过的)。

Pawcast · Extras / Lucky Fans v0.1.0
Profile Border Voting Tool Lucky Game Lucky Fans

Lucky Draw Operation

已抽 03 / 05
LUCKY DRAW · 03/05 @s0nna_a @ju_ki_ki · @karen.j
中奖记录
03 · @s0nna_a21:30:14
02 · @ju_ki_ki21:28:42
01 · @karen.j21:26:18
Lucky Draw Settings
每次抽几人
背景样式
字号
List Settings
参与名单 186 人
✓ 关注者(112)
✓ 评论过的(68)
✓ 送过礼的(34)
✗ 已中奖过的(黑名单)
⚠ 提醒:抽完后请在直播间口播确认中奖人,避免争议
链接尺寸建议:320×240
抽奖操作Start = 启动抽奖动画 + 滚动名字 2-3 秒 + 锁定中奖人。Pause = 暂停(可手动选)。Reset = 清空本场所有中奖记录重新开始。
1-5 人/次1 = 重磅大奖;3-5 = 福利场常用。超过 5 个动画拥挤,建议拆多次抽。
名单来源勾选哪些类型的观众可参与。每类相互独立累加。可叠加:"关注 + 送过礼" = AND。
黑名单 / 已中奖已抽中的自动加入黑名单避免重复。手动可解除(重新参与)。
导出 xlsx每场抽奖结束可一键导出 .xlsx,含中奖人 @username + 时间 + 奖品类型 + 备注。便于事后发奖记录。
实现说明名单数据来自直播间事件流:FollowEvent / ChatEvent / GiftEvent 实时聚合。抽奖时本地随机数生成(crypto.randomUUID 风格,而不是 Math.random,更公平)。
动画名字滚动用 CSS keyframes vertical scroll,每 100ms 切换一次显示名字(造成"快速滚动"视觉),最后一次 ease-out 慢下来停在中奖人。
05 · 共通操作

挂件 URL · Backup · 错误恢复

所有 Extras 挂件都有相同的 URL 复制 / 备用 URL / Backup 导出 / 错误恢复机制。

URL 结构本地 17777 端口 + 挂件类型 + query 参数。所有配置 stateless 编码到 URL,主进程死了挂件也能继续工作(直到下次配置变化)。
OBS XML 导出v0.3 计划支持,可一键生成完整 OBS Scene XML,导入即用,省去手动配置。
本地端口17777 是默认端口,可在设置中改。冲突时自动 +1 试 17778、17779。改后所有已复制的 URL 失效,需重新复制。
JSON 格式开放格式,可手动编辑批量改配置。也可作为团队协作的"配置 commit",PR 风格管理。
覆盖策略导入默认全覆盖。后续可加 merge 模式(仅添加不冲突的)。
实现JSON schema 含 version 字段,跨大版本可能需要 migrator。文件加 .pawcast 后缀关联,双击直接导入。