Javascript 如何防止反adblock脚本更改';src&x27;iframe元素的属性是否异步?
我访问的站点具有以下脚本:Javascript 如何防止反adblock脚本更改';src&x27;iframe元素的属性是否异步?,javascript,jquery,adblock,Javascript,Jquery,Adblock,我访问的站点具有以下脚本: <script type="text/javascript"> (function () { var ca = document.createElement('script'); ca.type = 'text/javascript'; ca.async = true; var s = document.getElementsByTagName(
<script type="text/javascript">
(function () {
var ca = document.createElement('script');
ca.type = 'text/javascript';
ca.async = true;
var s = document.getElementsByTagName('script')[0];
ca.src = 'http://serve.popads.net/checkInventory.php';
ca.onerror = function () {
setTimeout(function () {
$('.embed-player').attr('src', "/adblock.html")
}, 8000);
}
s.parentNode.insertBefore(ca, s);
})();
</script>
我试图查看iframe中的内容:
<iframe src="https://example.com" frameborder="0" class="embed-player" scrolling="no" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true" rel="nofollow"></iframe>
这很有效。但是强>
问题是我必须设置一个非常高的16000毫秒的超时值来抵消页面上使用的8000毫秒的超时值,因为有时候页面自己的异步调用比预期的要晚
这导致了在查看页面内容之前必须等待两个异步调用完成的麻烦
有没有比我使用的方法更有效的方法?
顺便说一句:我已经安装了Reek的反Adblock Killer Tampermonkey脚本和UBlock源代码过滤器——但由于某种原因,该站点上的脚本绕过了该代码(我已经检查过,它在大多数其他站点上都能工作)。它抛出一个控制台错误:
执行脚本“Anti-Adblock Killer | Reek”失败!无法分配给对象“#”的只读属性“adblock2”
有几种方法可以在代码运行之前劫持该代码
例如,可以防止在脚本元素上设置onerror
属性:
Object.defineProperty(HTMLScriptElement.prototype, 'onerror', {
setter: function() {}
});
如果您不想影响其他脚本
var onerror = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'onerror');
Object.defineProperty(HTMLScriptElement.prototype, 'onerror', {
get: onerror.get,
setter: function() {
if(this.src !== 'http://serve.popads.net/checkInventory.php') {
return onerror.set.apply(this, arguments);
}
}
});
或者,您可以添加一个捕获事件侦听器,以防止事件到达脚本
document.addEventListener('error', function(e) {
if(e.target.tagName.toLowerCase() === 'script' &&
e.target.src === 'http://serve.popads.net/checkInventory.php'
) {
e.stopPropagation();
}
}, true);
您还可以劫持$.fn.attr
,以防止它将src
更改为“/adblock.html”
:
如果您的代码在您想要劫持的代码之后运行,正如Bergi所说,删除事件处理程序可能更简单:
iframe.onerror = null;
我建议修复导致其改变属性的原因,而不是解决症状
在本例中,“checkInventory.php”的请求似乎只是用作诱饵。因此,您可以简单地将异常规则
@|service.popads.net/checkInventory.php^
添加到您的广告拦截器中,这样就不会出现错误。您可以尝试在您要阻止其src的iframe上使用iframe.onerror=null
。对响应进行硬编码:$('script[src>)="http://serve.popads.net/checkInventory.php“]”).attr(“src”,“数据:text/javascript,parseResponse({'result':0})”)
谢谢,但这两个都不起作用。如何更改iframe的类以便脚本不再找到它呢?谢谢!我将所有这些scriptlet添加到我的TamperMonkey脚本中,iframe仍然被覆盖。也没有控制台错误:(
document.addEventListener('error', function(e) {
if(e.target.tagName.toLowerCase() === 'script' &&
e.target.src === 'http://serve.popads.net/checkInventory.php'
) {
e.stopPropagation();
}
}, true);
var $attr = $.fn.attr;
$.fn.attr = function(attr, value) {
if(attr === "src" && value === "/adblock.html") {
return this;
}
return $attr.apply(this, arguments);
}
iframe.onerror = null;