はじめに
YouTubeに対策されているのか気になったので作った拡張機能を紹介します。
一応、ここで紹介する拡張機能を実行しても、広告を再生してはいるので、収益的な問題はないと思います...
実行環境
Windows 10
Microsoft Edge
(Chromeでも動くと思います...)
仕組み
非常に単純です。
広告が流れた!
↓
動画のID、再生場所を指定したリンクでリロード
↓
広告が消えて動画を再生
コード
setIntervalは、適当に300msに設定しています。
background.js
let time = 0;
let url;
let params;
let before_url;
function CheckAd(){
//youtube以外のタブを開いてるときは実行しない.
if(url.hostname != "m.youtube.com" && url.hostname != "www.youtube.com") return;
//URLに変化があったら変数を更新.
if(before_url != window.location.href) Update_URL();
//広告特有の要素があったらリロード.
if(document.getElementsByClassName("ad-simple-attributed-string ytp-ad-badge__text--clean-player").length > 0){
//URLと基本的なパラメーター(動画ID、再生時間)を繋げる
let url_str = url.protocol + "//" + url.hostname + url.pathname + "?v=" + params.get('v') + "&t=" + time;
//(再生リストなら)リストIDを入れる.
if(params.get("list") !== undefined) url_str += "&list=" + params.get("list");
//(再生リストの途中なら)再生している番号を入れる.
if(params.get("index") !== undefined) url_str += "&index=" + params.get("index");
//不明なパラメーター たまに付いているのでとりあえず入れてみる.
if(params.get("pp") !== undefined) url_str += "&pp=" + params.get("pp");
//作ったURLに飛ぶ.
location.href = url_str;
}else{
//videoがあれば、時間を取得する(広告表示まで)
let videos = document.getElementsByTagName("video");
if(videos.length > 0){
time = Math.round(videos[0].currentTime);
}
}
}
function Update_URL(){
//URLに変化があった場合に、変数を更新.
url = new URL(window.location.href);
params = new URLSearchParams(url.search);
before_url = window.location.href;
time = 0;
}
window.addEventListener('load', () => {
//拡張機能が動作したときの下準備.
Update_URL();
CheckAd();
setInterval(() => {
CheckAd();
}, 300);
}
);
説明文とかは、適当な文章を入れてください。
manifest.json
{
"name": "AdBlock",
"author": "...",
"version": "0.1",
"manifest_version": 3,
"content_scripts": [{
"matches": [
"https://m.youtube.com/*",
"https://www.youtube.com/*"
],
"js": [
"background.js"
]
}],
"description": "テスト"
}
弱点
たまに不安定なときがあり、画面をスクロールするとリロードしてしまう時があります。
(その後、正常に戻る)
YouTubeの仕様の変更により、広告が表示されて5秒経過しないと広告を飛ばせない場合があります。
その場合は、リンクに飛ぶ部分を5000ms以上のsetIntervalで囲んでください。
(広告は再生されるが、最小限で済む)
[追記]たまに出てくる途中の広告に当たった時に、うまく動作しないことがあるみたいなので、空いた時間に修正します...