DTM GAME HowTo ガジェット DTM GAME HowTo ガジェット 趣味と日常、備忘録を気ままに 趣味と日常、備忘録を気ままに
traylog 趣味と日常、備忘録を気ままに
Youtube用のChrome拡張機能を作ってストアに配信してみた。

Youtube用のChrome拡張機能を作ってストアに配信してみた。

私はずっとYoutubeに欲しい機能があったのです。
それはライブチャットのデフォルトを「すべてのチャット」にするという機能。

というのもチャット欄はデフォルトで「トップチャット」になっているのですが私は不適切なコメントでさえも見たいタイプなのでいつも「すべてのチャットに」切り替えていました。

Tray
Tray
だけど毎度毎度切り替えがめんどくさい!!

設定にありそうなのにどれだけ探しても無い…拡張機能にもない…
しょうがない。。以前から興味はあったので結局拡張機能を自作することにしました。

準備

まずは拡張機能の作り方を調べてみると最低限以下のファイルが必要とのこと。

ファイル構造
├── content.js(実際に動かすファイル)
├── manifest.json(設定ファイル) 
├── icon.png(拡張機能のアイコン画像)
ヒント
他にも設定画面や、UIが必要な場合はHTMLやCSSが必要ですが今回は使用しませんでした。

JSはほぼ初心者ですが実際に手を動かしてみることにします。
テキストエディタはVisual Studio Codeを使いました。

実装

manifest.json(設定ファイル)

拡張機能の設定ファイルです。備忘録として今回設定した各項目についてまとめておきます。

JSON
{
  "name": "Show All YouTube Chats by Default",
  "version": "1.0.0",
  "manifest_version": 3,
  "description": "YouTubeのデフォルトチャット表示をトップチャットからすべてのチャットに変更します。",
  "icons": {
    "96": "icon48.png"
  },
  "content_scripts": [
    {
      "matches": ["*://www.youtube.com/*"],
      "js": ["content.js"]
    }
  ]
}

manifest.jsonの内容

フィールド名内容
name拡張機能の名前。今回は「Show All YouTube Chats by Default」にしました。
version拡張機能のバージョン。初回リリースなので「1.0.0」にしています。
manifest_version拡張機能の仕様バージョン。最新のV3を使っています。V2のサポートが終わったみたいなのでV3が必須みたいです。
description拡張機能の説明。
icons拡張機能のアイコン設定。今回は「icon48.png」にしました。
content_scriptsWebページにスクリプトを埋め込む設定。”js” に実行するスクリプト、”matches” に適用するページを指定します。今回はすべてのYouTubeページに適用するようにしています。

content.js(実際に動かすファイル)

実際に動かすプログラムです。JSはほぼ知識がないので1週間以上かかってしまいました。
多分無駄な記述や間違いもあると思いますがなんとか動くものができました。

Tray
Tray
動いたときは少し感動しましたね…

content.jsの内容をざっくり

1
チャット欄の変化を監視してボタンを探す
チャット欄(#chat)をMutationObserverで監視し、変化があるたびに「すべてのチャット」ボタンの候補が生成されているかをチェックします。
見つかったら一番最後のボタンをクリックします。見つからない場合は1秒ごとに最大15回まで再チェックします。
2
お知らせバナーも自動で非表示
「チャットへようこそ」等のお知らせ要素も、チャット欄の変化に合わせて都度非表示にしています。
ポップアップの設定でON/OFFを切り替え可能です。
3
ページ遷移・シアターモードの変化に対応
URLの変化を1秒ごとにチェックしてページ遷移(SPA)を検知するほか、シアターモードの切り替えも別途監視しています。
変化を検知したら、それまでの監視をいったん止めてから、あらためてボタンを探しにいく処理を実行します。
content.jsの処理イメージ(疑似コード)
// チャット欄の変化を監視して、都度ボタンを探しにいく
observeChatContainer(() => {
  scheduleButtonClick();
});

function scheduleButtonClick() {
  poll(() => {
    if (「すべてのチャット」ボタンが見つかった) {
      ONなら クリック;
      お知らせバナーが有効なら 非表示にする;
      return 完了;
    }
    1秒後にもう一度試す(最大15回);
  });
}

// ページ遷移・シアターモードの変化を検知したら
onPageOrTheaterChange(() => {
  それまでの監視を止めて再設定;
  scheduleButtonClick();
});
悩んだポイント
最初、チャット内の要素がまったく取得できず苦戦しました。
実は iframe の中に要素があったため、通常の document.querySelector では取得できませんでした。
contentWindow.document を使うことで iframe 内の要素を取得できます。

完成したのでストアに公開

完成した拡張機能はYouTubeライブやアーカイブを開くと以下のように自動ですべてのチャットに切り替わります。

実装後、結局 Chrome ウェブストアにも公開しちゃいました。

公開当初は25人のインストールで驚いていたのですが、2026年9月時点では593人まで増えていました。
評価も5点満点中5.0(5件)をいただいていて、素直に嬉しいです。

Chrome ウェブストアへの公開方法(ざっくり)

Chrome 拡張機能は500円の登録費を払えば誰でもウェブストアに公開できます。
一度登録すれば次からの公開は無料です。公開までの流れはこんな感じ。

1
拡張機能を準備
2
デベロッパー登録(500円)
3
拡張機能をZIP化してアップロード
4
ストア情報を入力
5
審査を待つ(1~3日)

その後のアップデート

公開してからも「あったら便利かも」と思った機能を少しずつ追加してきました。
YouTube側の仕様変更で出てきた不具合も、その都度直しています。

バージョン更新内容
v1.1.1(2025年2月)YouTubeの仕様変更で「トップチャット」に戻ってしまう不具合を修正(全画面・シアターモード時)。軽微なバグ修正
v1.2(2026年2月)拡張機能アイコンのポップアップから、自動切り替えのON/OFFを切り替えられるように
v1.3 / v1.3.1(2026年9月)自動切り替えの不具合を修正(まれに切り替わらない・長時間視聴で重くなる問題など)。「チャットへようこそ」等のお知らせバナーを自動非表示にする機能を追加(個別にON/OFF可)。日本語・英語表示に対応

特にv1.2で追加したポップアップのON/OFF切り替えは我ながら便利です。
「配信を録画で見返すときだけ一時的に切りたい」といった場面で役立っています。

Tray
Tray
JSの知識ほぼゼロから始めた拡張機能が、ここまで長く使ってもらえるのは素直に嬉しいです。

まとめ

とにかく途中で投げ出さず最後まで完成させられて良かったです。
ボタン1つクリックさせるだけなのに思った以上に苦戦しました。プログラマーは大変ですね…
今後は、例えば固定コメントや登録者限定メッセージなど、個人的にあまり必要ない機能を非表示にできる設定などを追加できたらいいなぁとふんわり思ってます。
同じ悩みを持っている方の参考になれば嬉しいです!

Tray
Tray
実際にアップデートを重ねてきたので、この記事にも追記しました!