独自のソーシャル ストリーム オーバーレイをデザインする

各オーバーレイ ファミリのガイドを使用して、OBS でローカル オーバーレイ デザインをダウンロード、カスタマイズ、接続、テストします。

5手順で独自のオーバーレイを作る

ファイルをダウンロードするデザインを変更するOBSでオープン
  1. 対象のオーバーレイを選ぶ のうち変更したいもの。
  2. ソースZIPをダウンロードするをダウンロードして展開し、対象オーバーレイのHTMLファイルをコピーします。
  3. コピーを編集する は自分で行うか、AIツールに依頼します。
  4. コピーをOBSで開く のアドレスにSSNのセッション設定を追加します。
  5. 試す を、そのオーバーレイの実際のトリガーで確認します。
色やフォントだけを変えたい場合 ダウンロードせず、通常の公開リンクを使い、OBSブラウザーソースの次の欄にCSSを貼り付けます: カスタムCSS 欄。

変更するオーバーレイを選ぶ

オーバーレイの色、フォント、配置、画像、動きを変えられます。 HTMLファイル がページです。 OBS URL はそのファイルを指し、セッションと表示設定を追加します。

外観を変更する前に、作業用オーバーレイを選択します。
既に動いているオーバーレイから始めます。

オーバーレイの種類によって受け取る入力は異なります。チャット、選択メッセージ、投票のページは同じ入力を使いません。使う種類のデザインガイドを開いてください:

デザインガイド起動ファイル何がそれを動かすのか
チャットとドック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. ベータ版のソース 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.
展開したフォルダー全体を残してください。 1つの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/...。ブラウザーからコピーすれば、空白やスラッシュも適切に扱われます。

知っておくと便利なこと詳細
この設定は1回だけですOBSはアドレスを保存します。フォルダーを移動せず、SSNとチャットソースを動かし続けてください。
変更を保存したらクリックする項目: 現在のページのキャッシュを更新(Refresh cache of current page) 。
ローカル ファイルのチェックを外したままにするのはなぜですか?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とクラスを維持します。更新のたびに要素を作り直す場合は、固定の装飾をその外に置くか、描画処理に追加します。
共有スタイルシートやスクリプトを編集するファイルをコピーしてページの参照先を変え、自分のデザインだけに変更が適用されるようにします。

ロゴ、フォントファイル、ブランドカラー、キャンバスサイズ、参考画像を用意します。通常、Webページは別のコンピューターのディスクからフォントや画像を読み込めません。

AIプロンプト

各デザインガイドの種類別プロンプトを使うか、これを出発点にしてください。コピーしたファイルと、そのCSS・スクリプトを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、リンクHTMLではなくURLです。既存のメディア・リンク用ルールで検証してから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>
  • 既にサニタイザーがある場合は維持し、2つ目を追加しないでください。
  • サブフォルダー内のファイルでは、スクリプトのパスを調整します。
  • 生の名前を属性文字列に、生の色をスタイルのHTMLに挿入しないでください。スタイル値を検証し、プロパティごとに設定します。
  • 無害化したHTMLでも、JavaScriptとして実行したりAIへの指示として使ったりしてはいけません。

詳しい説明: OWASPの安全な出力先とHTML無害化のガイド.

描画処理を安全にテストする方法

公開チャットではなく、非公開のローカルプレビューで実行してください。

  • 次のような名前を使います: Guest <b>One</b>。山括弧は文字として表示される必要があります。
  • 送信 chatmessage: "<b>Hello</b>" 付随する値: textonly: trueにしてからfalseにします。一方ではタグが文字として、もう一方では太字として表示されることを確認します。
  • 対応しているエモートと画像だけのメッセージが引き続き表示されることを確認します。
  • AIに次のような無害な確認用入力を試させます: <img src=x onerror="window.__ssnInjectionProbe=1">。実行されたり、マーカーが設定されたり、イベント属性が残ったりしてはいけません。スクリプトスキームのリンクもテストしてください。

テストで確認できるのは試した経路だけです。デザイン変更で触れた描画処理とフィールドを中心に確認します。

1つずつテストする

テスト方法
レイアウトページにプレビュー・デモモードがあれば使い、なければ架空のローカルデータを用意します。長い名前やメッセージ、アバターなし、空データ、想定する行数を試してください。
SSNからの配信SSNを起動したまま、次を使います: テストメッセージを作成(Create Test Message) を同じセッションで使います。通常のExtension APIモードには次が必要です: 拡張機能のリモートAPI制御(remote API control of extension) を有効にします。テストメッセージで自動処理が動くことがあるため、テスト用の環境を使ってください。
実際のトリガー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 を表示用に使い、USDの有効な数値を次に指定します: donoValue、ゼロを含む。
Event Flow および コマンドとAPIデザインに操作のきっかけが必要なら、既存の操作機能を再利用します。

問題を解決する

問題試すこと
ファイルが見つかりませんHTMLを再びブラウザーにドラッグし、アドレスをコピーします。ファイル名が.html.txtではなく.htmlで終わっていることを確認してください。
スクリプト、フォント、または画像がありません展開したフォルダー構成を保ち、元のファイルの隣にコピーを置きます。追加した画像やフォントが、ページから参照できる場所にあることを確認します。
空白または「待機中」の表示セッション、パスワード、完全な ? および # の部分、SSNの起動状態、機能がオンかどうか、正しい入力が届いているかを確認し、元のSSNリンクと比較します。
OBSとブラウザーで見た目が違う幅と高さ、古いカスタムCSS、フォント、キャッシュ、ブラウザーの保存データを確認します。保存後は再読み込みしてください。
更新するとロゴが消えるスクリプトがコンテナーを作り直している可能性があります。固定の装飾を外に置くか、描画テンプレートを変更します。
データがリセットされる/操作が2回実行される再読み込み・終了設定、オーバーレイや操作ページの重複、ページ自体の重複処理と状態管理を確認します。
特殊なケース: 個別のデータ ファイルを読み取るページ

地図はローカルのJSONファイルを次の方法で読み込みます: fetch()を使っており、ディスクから開くとブラウザーにブロックされる場合があります。地図の見た目だけを変えるなら、公開リンクとOBSのカスタムCSSを使います。ファイルを編集する場合は、ディスクから開けるよう地図データをページ内に組み込むようAIに依頼してください。ホスティングは必要なページ向けの上級オプションであり、通常の手順ではありません。

確認できた最小の問題から直します。見た目を変えるためにキャプチャースクリプトやイベント項目を変更する必要はありません。公開フォークを共有する場合は素材を含め、非公開のランチャーは含めないでください。