YouTubeの広告ブロッカーブロッカーの研究

自由研究 としてYouTubeが広告ブロッカーを検知する仕組みを調べていた。有名な広告ブロッカーを狙い撃ちにしているのかと思いきや、僕が 研究用 に作った簡易的なブロッカーにもちゃんと反応していた。

https://www.youtube.com/s/player/5ae7d525/player_ias.vflset/ja_JP/base.js より抜粋

    g.E.onClick = function(k) {
        k && k.preventDefault();
        var p, t;
        dDL(k, {
            contentCpn: (t = (p = this.api.getVideoData(1)) == null ? void 0 : p.clientPlaybackNonce) != null ? t : ""
        }) === 0 ? this.api.zb("onAbnormalityDetected") : (SA.prototype.onClick.call(this, k),
        this.api.zb("onAdSkip"),
        this.api.onAdUxClicked(this.componentType, this.layoutId))
    }

クリックイベントkをdDLに渡し、その返り値が0ならonAbnormalityDetectedイベントが発行され、その結果広告ブロッカーやめろ画面に遷移する。

    dDL = function(k, p) {
        var t = 1;
        k.isTrusted === !1 && (t = 0);
        a3("ISDSTAT", t);
        qO(t, "i.s_", {
            triggerContext: "sk",
            metadata: p
        });
        return t
    }

dDLの実装を見るとisTrustedがfalseなら0が返る。
https://developer.mozilla.org/ja/docs/Web/API/Event/isTrusted

ユーザーを意図しない操作から守るためにブラウザが提供している機能なので、これを出し抜くのは結構難しい。相当な荒業でやる方法はあるようだが、addEventListenerが実行される前にinjectせねばならずなかなか難易度が高い。
https://qiita.com/i11u/items/0a6d38966c75314bacba

Chrome extensionのdeclarativeNetRequestを利用してbase.jsがダウンロードされるときに該当箇所を書き換えてしまえばいいのではと思ったのだが、preload+service workerが使われている影響かbase.jsのGETを捕捉できなかった。あとはプロキシサーバーを立ててbase.jsだけすり替えるとかできるのかなあ。なんならChromiumをforkしてisTrusted機能を殺してしまうのもありかもしれない。Chrome拡張という配布のしやすい形を諦めるなら選択肢はいろいろある。

あくまで 研究 ですからね。私欲のために実行しませんよ。こういう研究をしていると広告が流れてくれた方が都合がいいのだが、そう思っているときに限って意外なほどに流れない。こんなに頻度低かったかな…?と思ってしまい、それなら別にいいやとなってしまった。逆物欲センサー(だいぶ昔の言葉になってしまったな)。

webサービスをどう設計するかは作り手の自由だが、それと同時に我々が自分の所有する計算機でどのような計算を行うかも自由だ。つまりはそういうことだ。

こういう漠然とやりたいことはあるけどどうやるべきかもどう書くべきかもわからない状況、雑にCline+Claudeに書かせておいてよくわからないところはCopilotに説明させてあーそういう意味ねと納得したりしている。Clineが大きなスコープでの作業を得意とする一方でCopilotはインライン操作が充実していて細かい部分について質問しやすい作りになっている。LLMの特性と言うよりはプロダクトとUIの特性だね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です