You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript检测YouTube广告是否正在播放

YouTube广告播放检测问题修复方案

原代码的核心问题

  • 仅依赖DOM类名检测,YouTube会频繁更新页面结构,导致选择器失效
  • 只在PLAYING状态触发检测,广告加载初期(比如缓冲阶段)可能错过检测时机
  • 未处理视频播放中途插播广告的场景

更可靠的API检测方案

利用YouTube IFrame Player API自带的getAdState()方法,这比DOM选择器稳定得多:

function onPlayerStateChange(event) {
  const player = event.target;
  // 覆盖广告可能出现的所有状态:播放、缓冲、暂停
  const relevantStates = [YT.PlayerState.PLAYING, YT.PlayerState.BUFFERING, YT.PlayerState.PAUSED];
  
  if (relevantStates.includes(event.data)) {
    const adState = player.getAdState();
    // 广告状态码:1=播放中,2=缓冲中,3=暂停
    if ([1, 2, 3].includes(adState)) {
      YouTubeAdChannel.postMessage('ad_playing');
    }
  }
}

DOM备选方案(API失效时用)

如果getAdState()不可用,改用覆盖更多场景的DOM选择器(注意后续可能需随YouTube页面更新调整):

function isAdPlaying() {
  // 检测当前常见的广告容器类名
  return !!document.querySelector(
    '.ytp-ad-module, .ytp-ad-player-overlay-instream-info, .video-ads .ytp-ad-progress-list'
  );
}

function onPlayerStateChange(event) {
  if ([YT.PlayerState.PLAYING, YT.PlayerState.BUFFERING].includes(event.data)) {
    // 延迟检测,确保广告DOM已生成
    setTimeout(() => {
      if (isAdPlaying()) {
        YouTubeAdChannel.postMessage('ad_playing');
      }
    }, 500);
  }
}

注意事项

  • 确保代码在YouTube IFrame Player API完全加载后执行
  • 单页项目中要持续监听播放器的所有状态变化,不要只检测初始播放
  • YouTube的API和页面结构可能随时变更,需定期验证检测逻辑

内容的提问来源于stack exchange,提问作者DL Studio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:10