如何通过Chrome扩展内容脚本可靠触发YouTube的“Skip Ad”按钮点击?
我之前也踩过这个一模一样的坑!YouTube现在对用户交互的校验越来越严格,单纯模拟鼠标事件和调用click()经常会因为事件的isTrusted属性为false(浏览器会把模拟事件标记为非真实用户触发)而被悄悄拦截。下面是我亲测有效的几个解决思路:
1. 先确认你定位到了真正绑定事件的按钮元素
YouTube的Skip Ad按钮结构偶尔会更新,有时候你找到的元素只是个视觉容器,实际的事件绑定在它的子元素或者父元素上。建议用更精准的选择器组合,并且在定位后做有效性校验:
function findSkipButton() { // 优先找现代版的跳过按钮 const modernButton = document.querySelector('.ytp-ad-skip-button-modern'); if (modernButton && modernButton.offsetParent !== null && !modernButton.disabled) { return modernButton; } // 兼容旧版按钮结构 const classicButton = document.querySelector('.ytp-ad-skip-button-container .ytp-ad-skip-button'); if (classicButton && classicButton.offsetParent !== null && !classicButton.disabled) { return classicButton; } return null; }
这里的offsetParent !== null是确保按钮处于可见状态,!modernButton.disabled则保证按钮已经处于可点击的状态,避免提前点击无效。
2. 绕过isTrusted校验的实用技巧
既然模拟事件的isTrusted是只读的false,那我们可以换个思路:直接调用按钮的原生点击逻辑,而不是触发表面的鼠标事件。很多时候,直接调用元素的click()方法反而比模拟一系列鼠标事件更有效,配合聚焦操作还能更贴近真实用户行为:
function tryClickSkip() { const skipButton = findSkipButton(); if (!skipButton) return; // 先聚焦按钮,模拟用户把鼠标移到按钮上的操作 skipButton.focus({ preventScroll: true }); // 直接调用click(),这在很多情况下能绕过isTrusted的校验 const clickResult = skipButton.click(); if (clickResult) { console.log('成功触发跳过广告!'); } else { // 备用方案:如果click()无效,尝试直接调用按钮的onclick回调 if (typeof skipButton.onclick === 'function') { skipButton.onclick.call(skipButton); console.log('通过onclick回调触发跳过操作!'); } } }
3. 优化你的MutationObserver监听逻辑
有时候按钮已经在DOM里了,但还没完全绑定事件或者还没解除禁用状态,这时候点击自然无效。建议在MutationObserver的回调里,增加短延迟再尝试点击,或者专门监听按钮的disabled属性变化:
const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { // 监听按钮从不可点击变为可点击的状态变化 if (mutation.type === 'attributes' && mutation.attributeName === 'disabled') { setTimeout(tryClickSkip, 50); } // 监听播放器区域的新节点添加,比如跳过按钮刚出现的时候 else if (mutation.addedNodes.length > 0) { setTimeout(tryClickSkip, 100); } }); }); // 绑定到YouTube的播放器容器上 const player = document.getElementById('movie_player'); if (player) { observer.observe(player, { childList: true, subtree: true, attributes: true, attributeFilter: ['disabled'] }); }
4. 避免过度触发点击
如果你的定时器或者Observer触发太频繁,可能会被YouTube的反自动化逻辑盯上。建议在成功点击一次后,暂时停止监听一段时间,或者标记当前广告已处理,避免重复触发无效操作。
另外还有个小细节:YouTube有时候会在广告到点后,先显示跳过按钮但保持禁用状态,过几百毫秒才会解除禁用。所以一定要等按钮真正可点击后再动手,提前点击只会做无用功。
内容来源于stack exchange

