Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

自動クリックによる検知 #1

Open
Yuki2718 opened this issue Feb 20, 2024 · 1 comment
Open

自動クリックによる検知 #1

Yuki2718 opened this issue Feb 20, 2024 · 1 comment

Comments

@Yuki2718
Copy link

Yuki2718 commented Feb 20, 2024

コードを拝見したところ、本家Ad Speedupのプロモーション非表示による検知はないものの、自動クリックによる検知はこちらも影響を受けます。

問題1:積極的検知

A/Bテストab_fk_sk_clが有効な場合のみ機能するもので、https://www.youtube.com/s/desktop/87423d78/jsbin/desktop_polymer.vflset/desktop_polymer.jsのこのあたりです:

検知コード1
    function kqb() {
       var a, b, c;
       return t(function(d) {
          a = new Yi;
          b = document.createElement("button");
          b.classList.add("ytp-ad-skip-button");
          b.style.opacity = "0";
          b.style.height = "0px";
          b.style.width = "0px";
          b.style.padding = "0px";
          b.style.border = "none";
          c = function() {
             b.parentElement && b.parentElement.removeChild(b)
          };
          b.onclick = function() {
             a.resolve(0);
             c()
          };
          document.body.appendChild(b);
          setTimeout(function() {
             c();
             a.resolve(1)
          }, 50);
          return d.return(a.promise)
       })
    }

罠のスキップボタンで自動クリックを検知しています。テスト対象者でなくても、安定して警告が送られるブラウザプロファイルがあればyt.config_.EXPERIMENT_FLAGS.ab_fk_sk_cltrueに設定することで再現可能です。

問題2:受動的検知

A/Bテストによらず、自動クリックが実際に発動すると検知されます。https://www.youtube.com/s/player/5683fc5e/player_ias.vflset/ja_JP/base.jsのこのあたりです:

検知コード2
   SG = function(a, b) {
      var c = 1,
         d = [];
      try {
         var e = document.querySelector(".ytp-ad-skip-button-slot");
         e ? "none" === getComputedStyle(e).display ? d.push("BISCOTTI_BASED_DETECTION_STATE_IS_BUTTON_INVISIBLE") : d.push("BISCOTTI_BASED_DETECTION_STATE_IS_BUTTON_VISIBLE") : d.push("BISCOTTI_BASED_DETECTION_STATE_IS_BUTTON_NOT_FOUND")
      } catch (f) {
         d.push("BISCOTTI_BASED_DETECTION_STATE_IS_FINDING_BUTTON_FAILURE")
      }!0 === a.isTrusted ? d.push("BISCOTTI_BASED_DETECTION_STATE_IS_CLICK_EVENT_TRUSTED") : !1 === a.isTrusted ? d.push("BISCOTTI_BASED_DETECTION_STATE_IS_CLICK_EVENT_NOT_TRUSTED") :
         d.push("BISCOTTI_BASED_DETECTION_STATE_IS_CLICK_EVENT_TRUSTED_UNDEFINED");
      d.includes("BISCOTTI_BASED_DETECTION_STATE_IS_CLICK_EVENT_NOT_TRUSTED") && (c = 0);
      EB("ISDSTAT", c);
      ixa(c, "i.s_", {
         Uca: "sk",
         metadata: b,
         states: d
      });
      return c
   };

対策案1:自動クリックをやめる

私が以前本家をテストしたときの記憶では、倍速スキップだけでも大半の広告は対応できていたと思います。

対策案2:警告が送られていないときだけ自動クリックする

そもそも、3ストライクアウトに到達したアカウントでログインしていて、かつ、警告無視を繰り返してYoutubeによるロックオンが有効になっている場合(持続期間は数日~1週間ほど)を除けば警告が送られること自体まれです。警告が送られていなければ何をしても警告は出ません。ただこれにはytInitialPlayerResponse.auxiliaryUi.messageRenderers.bkaEnforcementMessageViewModelが定義されていないのみならず、fetch/xhrを通してplayerResponse.auxiliaryUi.messageRenderers.bkaEnforcementMessageViewModelが送られていないことのチェックが必要と思われるため、コードの大幅な加筆と権限追加が必要になると思います。
[追記] JSON.parse()Response.json()をフックして確認するだけなら権限はいらないかもです。

対策案3:積極的検知だけ対応する

検知コードをみてわかるように、.ytp-ad-skip-buttonの親を指定(.ytp-ad-skip-button-container > .ytp-ad-skip-button)するだけで回避できるため、変更が最小で済みます。警告が送られ、かつ、倍速再生ではスキップできない状況というのは非常にまれだと思います。倍速再生が機能しなかったときだけクリックするようにすればより安全かと。

@AkibaSensei
Copy link
Owner

@Yuki2718 有益な情報いただきありがとうございます。大変助かります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants