2026/5/27
Chrome拡張でアニメを強制的に見るツールを作ってみた
こんにちは、虎の穴ラボのMです。
皆さん、最近アニメ見ていますか?昔は今期放送中のアニメを全て見ていたのですが最近はどんどん見る数が減ってきてしまっている自分がいます。
その理由として、YouTube などの配信を見る時間が増え、相対的にアニメを見る時間が減ってしまったことが挙げられます。
『今日はアニメを見るぞ!』と決意しても、ついついゲーム実況やYouTuberの動画を見てしまう……。
そんな日が続いていたので、強制的にアニメ視聴ページへ遷移させるツールを(簡単ではありますが)作ってみました。
1. 要件
毎週水曜日は、YouTube と Twitch へアクセスしようとしたらAmazon Prime Videoを強制的に開くようにする!
というようなニーズに応えたツールを作ります。
特定の曜日・時間帯のみ制限する
複数のサイトを一括で制限する
制限に一致した場合、指定されたURLへリダイレクトする
2. 技術仕様の概要
システム構成
Claude Code に作成してもらいます。
Chrome Extension Manifest V3に準拠した実装にするため、Claude Codeへのプロンプト(指示文)を以下のように構成しました。
あなたはChrome拡張機能の熟練の開発者です。
以下の要件を満たすChrome拡張機能(Manifest V3)を、現在の空ディレクトリにゼロから作成してください。
# 目的
ユーザーが指定した曜日・時間帯に、特定のウェブサイト(YouTubeなど)を開こうとした際、強制的に別のウェブサイト(Amazon Prime Videoなど)にリダイレクトする「時間泥棒防止ツール」を作成してください。
# コア機能の要件
1. オプション画面(設定ページ)
ユーザーが以下の設定を入力・保存できるUI(options.html / options.js)を作成してください。
* リダイレクト元のURLリスト(複数行入力できるテキストエリア。例: youtube.com, twitch.tv)
* リダイレクト先のURL(テキスト入力。例: https://www.amazon.co.jp/primevideo/)
* 制限を有効にする曜日(チェックボックス。月〜日)
* 制限を有効にする時間帯(開始時間と終了時間。例: 19:00 〜 24:00)
* 日付を跨ぐ指定にも対応してください。(例: 20:00 〜 03:00)
2. バックグラウンド処理(Service Worker)
* background.js でユーザーのブラウジングを監視してください。
* ユーザーがアクセスしようとしたURLが「リダイレクト元URL」に部分一致またはドメイン一致するか判定してください。
* 現在の日時が、設定された「曜日・時間帯」の範囲内であるか判定してください。
* 上記2つの条件を両方満たした場合のみ、「リダイレクト先URL」へタブを強制遷移(リダイレクト)させてください。
* 条件を満たさない場合は、何もせず通常通りアクセスできるようにしてください。
# 技術的な指定
* Manifest V3の仕様に完全に準拠してください。
* データの保存には `chrome.storage.sync` または `chrome.storage.local` を使用してください。
* 時間帯による動的な条件分岐が必要なため、リダイレクトの仕組みは `chrome.tabs.onUpdated` または `chrome.webNavigation.onBeforeNavigate` APIを使用するなど、Manifest V3で最適なアプローチを採用してください。
* ビルドツールやフレームワークは使わず、ピュアなHTML / CSS / JavaScriptで実装してください。
* UIはシンプルで見やすいモダンなデザインにしてください。
* 後日ブログ記事の解説としてコードを引用したいため、各関数の役割やAPIの使い方について、丁寧な日本語コメントを記述してください。
必要なファイル(manifest.json、各JS・HTMLファイル、必要であればアイコンのプレースホルダー)をすべて生成し、拡張機能としてすぐに読み込める状態にしてください。
技術スタック
Manifest Version: V3
Service Worker: background.js(バックグラウンド処理)
Options Page: options.html / options.js(設定画面)
使用API:
chrome.storage.sync - 設定データの同期保存
chrome.webNavigation.onBeforeNavigate - ページ遷移の監視
chrome.tabs.onUpdated - タブ更新の補助的監視
chrome.tabs.update - タブのリダイレクト処理
developer.chrome.com
ファイル構成
.
├── manifest.json # 拡張機能の設定ファイル
├── background.js # Service Worker(リダイレクト処理)
├── options.html # 設定画面のUI
└── options.js # 設定画面のロジック
3. 実装のポイント
3-1. リダイレクト判定ロジック
URLが制限対象のサイトに一致するか
現在の曜日が有効な曜日に含まれるか
現在の時刻が設定された時間範囲内であるか
/**
* リダイレクトが必要かどうかを判定する
* @param {string} url - チェックするURL
* @param {Object} settings - 設定データ
* @returns {boolean} リダイレクトが必要な場合はtrue
*/
function shouldRedirect(url, settings) {
// 設定が不完全な場合はリダイレクトしない
if (!settings.sourceUrls || !settings.targetUrl || settings.enabledDays.length === 0) {
return false;
}
// リダイレクト先URLへのアクセスはリダイレクトしない(無限ループ防止)
if (url.includes(settings.targetUrl)) {
return false;
}
// URLが制限対象かチェック
if (!isBlockedUrl(url, settings.sourceUrls)) {
return false;
}
// 曜日が制限対象かチェック
if (!isEnabledDay(settings.enabledDays)) {
return false;
}
// 時間帯が制限対象かチェック
if (!isWithinTimeRange(settings.startTime, settings.endTime)) {
return false;
}
// すべての条件を満たした場合、リダイレクトが必要
return true;
}
3-2. 日をまたぐ時間範囲への対応
深夜の夜更かし対策に、時間帯の判定において「22:00 〜 02:00」のような日をまたぐ設定にも対応しました。
/**
* 現在の時刻が指定された時間範囲内かどうかを判定する
* @param {string} startTime - 開始時刻(例: '19:00')
* @param {string} endTime - 終了時刻(例: '23:59')
* @returns {boolean} 時間範囲内の場合はtrue
*/
function isWithinTimeRange(startTime, endTime) {
const now = new Date();
const currentMinutes = now.getHours() * 60 + now.getMinutes();
// 開始時刻と終了時刻を分に変換
const [startHour, startMin] = startTime.split(':').map(Number);
const [endHour, endMin] = endTime.split(':').map(Number);
const startMinutes = startHour * 60 + startMin;
const endMinutes = endHour * 60 + endMin;
// 時間範囲をまたぐ場合(例: 22:00 〜 02:00)
if (startMinutes > endMinutes) {
// 現在時刻が開始時刻以降、または終了時刻以前
return currentMinutes >= startMinutes || currentMinutes <= endMinutes;
} else {
// 通常の場合(例: 19:00 〜 23:59)
return currentMinutes >= startMinutes && currentMinutes <= endMinutes;
}
}
時刻を「分」に変換して比較することで、日をまたぐ判定を正確に実行できます。
3-3. ナビゲーション監視
/**
* ナビゲーション開始時のイベントハンドラ
* chrome.webNavigation.onBeforeNavigate を使用してページ遷移を監視
*/
chrome.webNavigation.onBeforeNavigate.addListener(async (details) => {
// メインフレームのナビゲーションのみ処理(iframe等は除外)
if (details.frameId !== 0) {
return;
}
// 設定を読み込む(キャッシュがない場合)
if (!cachedSettings) {
await loadSettings();
}
const url = details.url;
// リダイレクトが必要かチェック
if (shouldRedirect(url, cachedSettings)) {
console.log(`ブロック対象のURLを検出: ${url}`);
redirectTab(details.tabId, cachedSettings.targetUrl);
}
});
3-4. 設定画面のUI設計
設定画面では、以下の項目を直感的に設定できるように設計しました。
リダイレクト元URL(テキストエリア): 1行に1つずつ入力
リダイレクト先URL(テキスト入力): 完全なURLを入力
有効な曜日(チェックボックス): 月曜〜日曜を選択
有効な時間帯(時刻入力): 開始時刻と終了時刻
曜日選択にはチェックボックスを使用し、視覚的にわかりやすいUIを実現しました。また、選択された曜日はハイライト表示されるため、現在の設定を一目で確認できます。
入力内容は chrome.storage.sync に保存されるため、Chromeの同期機能を有効にしていれば、複数デバイス間で設定が自動共有されます。
4. 良かった点・課題
良かった点
無意識にアクセスしてしまうサイトを抑制できた
『この日は配信、この日はアニメ』と視聴対象を分けることで生活にメリハリが生まれ、両方をより楽しめるようになった!
作りたい要件と、試したい技術を混ぜて検証ができた
実現したい内容に、気になっている技術などを使ってアプリ作成をして理解を深めるという使い方ができた!
課題
「どうしても見たい!」時の例外設定がない
「今日は推しの記念配信があるからYouTubeを見たい!」という時に、一時停止や例外設定(ホワイトリスト)機能がないため、わざわざ設定画面から拡張機能自体をオフにする必要があります。一時的な「スヌーズ機能」があると便利かもしれません。
複数ルールの設定ができない
現状は「1つの時間帯・曜日ルール」しか登録できません。「平日は夜だけ制限、休日は1日中制限」といった、ライフスタイルに合わせた柔軟な複数ルールの登録ができるとさらに実用的になりそうです。
まとめ
ふと思い立って30分ほどで作成、活用ができたのでよかったです。こういった日常の簡単な改善はAI活用が便利そうです。
Manifest V3 を触ったこともなかったので、学ぶ良い機会となりました。
ありがとうございました!
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp