优酷去广告扩展:普利坞视频网站去广告原理及源码

首先,很抱歉现在才发这篇四月份承诺的文章及优酷去广告源码。虫子原本是OpenGG.Clean.Player的用户,只因后来无法稳定使用而萌生自己开发全新扩展的想法。扩展发布至今总计让超百万用户受益,chrome应用商店当前的用户数维持在十八万左右。在虫子公布捐助帐号后有大量网友慷慨解囊给予虫子莫大的支持,在此虫子对各位热心网友表示感谢,谢谢你们!由于受工作和生活影响,虫子没有足够的时间和精力来及时更新扩展以保证扩展的功能正常,因此虫子打算把能够重用的部分发布到Github上以供那些有志于为网友提供便利的网友能够更快捷地进行类似扩展的开发,现有扩展仍将更新维护。本文仅探讨视频广告屏蔽基本原理,不涉及具体细节,具体细节还需各位自己琢磨,本文也不会过多的讨论关于屏蔽视频网站广告在道德层面上的问题,扩展从来不对腾讯视频的广告进行屏蔽,因为Adblock能够进行屏蔽且腾讯视频没有选择在技术上与屏蔽进行对抗。虫子仅仅是为用户提供了一个工具,如果视频网站的用户体验够好,使用屏蔽扩展的用户数量自然会下降,解铃还须系铃人,虫子只希望各视频网站能够更多地为用户考虑,多学学Youtube,固步自封的结果只能是被时代淘汰。 言归正传进入本文的主题:去视频广告的原理。

Flash跨域请求与策略文件授权

进入正题前先提一下flash相关的前置知识。 common workflow between browser and servers. 上图展示的是浏览器在处理包含flash的页页时与不同服务器间的交互流程:

1、浏览器加载服务器(aaa.com)的页面及flash、样式表、图片、JS脚本等相关文件;

2、Flash需要加载另一台服务器(bbb.com)中资源,先请求该服务器中的crossdomain.xml文件获得得资源加载许可;

3、Flash加载该服务器(bbb.com)中的资源;

交互流程中2是flash为保护第三方服务器资源而定立的一条规则,当flash需要加载的资源不属于flash本身所在的 位置/域/服务器 时(即跨域访问),它需先向该资源所在的服务器请求一个策略文件看该服务器是否允许flash加载该服务器上的资源,如果返回的策略文件crossdomain.xml允许flash加载资源则flash正常加载该服务器上的资源,反之,如果返回的策略文件crossdomain.xml仅允许指定的几个域访问本服务器的资源而且flash所在的域不在其中则flash不进行下一步加载动作。这就是flash的跨域策略授权,相关的更详细内容请参见 设置 crossdomain.xml 文件实施 HTTP 流式传输

 Adblock plus与视频广告

adblock-plus 相信大部分看到这篇文章的网友都熟悉功能强大的Adblock plus,通过一些简单的规则文件就能屏蔽大量的广告,它的出现很大程度上让互联网页面变得清爽了,同时也在一定程度上加快了页面的载入速度。 虫子浅显地研究过其去广告的原理,主要是在浏览器层面阻止相关页面元素的显示、在网络层面阻断广告相关资源的的加载。不单单限于屏蔽页面元素广告,Adblock plus 曾经也是视频广告的屏蔽利器(对于Youtube这样的君子站点而言它仍然是最有效的),只因它的杀伤力如此之大且被广泛使用(360浏览器也集成了它的功能),国内各大视频网站在感觉到疼痛之后都纷纷在自己flash视频播放器中加入了广告屏蔽检测功能,一旦发现自家的视频开播前广告被屏蔽,轻则黑屏让网友坐等几十秒黑屏,重则直接禁止后续播放。各大视频网站的反屏蔽措施挽回了广泛屏蔽造成的损失,为增加收入,部分视频网站不顾用户体验开始疯狂增加视频开播前广告的时长,由原来十五秒增加到三十秒、四十五秒、一分钟乃至现在的标配七十五秒。漫长的等待让用户叫苦不迭,对于普通用户而言,除了忍受你还能做神马?买会员吧!糟糕的体验让一部分无法忍受的用户外逃,另一些有创造力的开发者开始寻求技术上的突破抗争,针对视频开播前广告的专业屏蔽工具登场,OpenGG.Clean.Player是最具有代表性的屏蔽工具之一。

OpenGG.Clean.Player与视频广告

opengg.clean.player 正所谓魔高一尺道高一丈(你也可以反过来说 ^_^),太极的黑白两面总能动态地达到平衡。对于flash播放器中加入屏蔽检测功能的做法,直接有效的屏蔽方式是通过某种方式加载修改过的flash播放器以绕过屏蔽检测甚至是直接跳过广告。   下图所示的是opengg.clean.player去广告的基本原理。 opengg.clean.player.prototypeopengg.clean.player扩展通过浏览器提供的接口把视频播放页中的flash播放器地址替换为已修改过的flash播放器地址,使得flash播放器中原有的广告屏蔽检查策略失效,从而达到屏蔽广告的目的。 由于flash播放器不从视频网站官方加载,任何在flash播放器内部所作的防护都难以凑效。为了保护自身利益,视频网站得用了更高明应对措施——flash资源加载前的策略授权。由于视频网站不至于傻到给你提供存储空间供存放修改过的flash播放器,因此修改过的flash播放器所在的域肯定和其需要加载播放相关信息的服务器所在的域不同,这就涉及到跨域的问题。如之前提到过的,flash在进行跨域请求前需先请求crossdomain.xml进行跨域请求授权检查,视频网站很容易就能够通过这一步对修改flash播放器的屏蔽方式进行屏蔽。 opengg.clean.player.failed 虽然通过开放的api仍能够对部分视频网站有限制地屏蔽广告,但除了跨域的之外还有一个性能相关的问题。由于加载flash播放器的方式会受到flash播放器所在的服务器的网络带宽、网络延时、性能及稳定性的影响,随着用户数量的增加,服务器的带宽颇受考验,一旦承载服务器出现任何导致扩展无法顺利加载flash播放器,所有采用该扩展的用户都将无法正常播放。

普利坞视频网站去广告

pullywood, antiADs对于上一节中提到的opengg.clean.player中可能出现的问题,按照原有的工作方式,跨域及flash播放器载体的问题都可以用一台/数台专有服务器来解决,但对于一款非盈利的浏览器扩展而言,要让开者自己去承担专有服务器产生的费用是不现实的。 为此,虫子制作了一款全新的去广告扩展,并使用一些”旁门左道”的技术来规避上述问题。对于扩展依懒第三方服务器进行flash播放器加载可能出现的稳定性问题,可以把flash播放器移至chrome扩展的内部,利用chrome提供的接口直接加载。对于跨域的问题则要使用不常见的方法来解决。 熟悉代理软件的网友应该都知道,代理软件里有一项代理验证的功能。为了验证代理地址的有效性,用户可以事先在代理软件中指定数个用于代理有效性验证的URL(如雅虎、intel等权威网站的主页等)并附上相关的关键词,代理软件进行验证时先通过代理服务器地址请求用户指定的URL,如果返回的内容中包含指定的关键词则表明代理服务器地址有效,反之,如果请求失败或返回的内容中不包含指定的关键词则表明该代理服务器地址无效。这里我们关心的是如果返回的内容中不包含指定的关键词时返回的是什么内容?不妨先来试验一下。

proxy_lab_0

proxy_lab_1

proxy_lab_2从上述试验中可以看到,向不存在的URL发送的请求以代理方式指向实际为web服务器也能成功访问该web服务器上页面,但请注意,该方法仅对那些没有进行域名绑定的web服务器有效,对于像百度、网易等这样的站点是行不通的,因为这些站点都进行了域名绑定,未经授权的域名是无法正常访问的。这里挖坟一个关于PR劫持的事件,09年的某一天,cnBeta上出现了一篇质疑某站点的PR值为10的文章:惊!这网站的PR也为10?,经分析发现该站是前期通过把域名解析到www.gov.cn这样的权威站点上来获取超高的PR值,该方法的成功实施是由于当时www.gov.cn的服务器没有对域名进行绑定导致的,目前的大部分站点都会对域名进行绑定,非授权域名即使解析到服务器IP上通常也无法进行正常访问。

对于去广告扩展而言,无需特定的web服务器来充当代理,只要设定的代理能够返回需要的crossdomain.xml进行授权就没有问题,经测试表明,api.youku.com就是一台能很方便地以代理方式进行跨域授权的web服务器,它就像”Mr. Yes”,以代理方式请求任何URL的crossdomain.xml它都会告诉你Yes,这就满足了扩展正常工作的必要条件。

pullywood.antiADs.youku.letv.tudou.sohu.ku6.iqiyi

上图简单地展示了扩展的工作机制,核心点是流程2及流程3,当浏览器访问包含特定视频播放器的页面时(流程2),播放器加载时会以事件驱动的方式触发播放器替换操作,从而使播放页(无论是站内页还是外链页)加载扩展内播放器(该播放器地址也可以是网络地址)。在进行跨域授权请求(流程3)时,请求被以代理方式劫持到了api.youku.com下(此地址也可以是任意一能提供crossdomain.xml授权的服务器)进跨域授权。依上述流程,扩展就能在不依懒专有服务器的情况下较稳定的进行广告屏蔽。

问题与局限性

与其他之前出现过的去广告扩展相比,本地加载加授权劫持的方式虽能提供稳定的去广告效果(事实上播放器的加载速度比官方还快),但相应的也会带来一些问题。由于需要代理控制权限,与代理扩展一起使用需要手动配置,对于很多网友来说可能会带来麻烦。另外一点是适用范围,由于扩展主要使用本地加载播放器的方式,这就导致它无法在360浏览器等默认不内置ppapi类型flash插件的浏览器上工作(使用在线播放器还是可以的,但这又涉及了稳定性的问题)。此外,由于播放器的加载方式采用的是地址替换,对于像吡哩吡哩这样使用flash内嵌加载视频播放器的外链页面无法进行正常屏蔽,除非把该内嵌播放器的flash也一并修改,但这样的工作量将大到难以接受,扩展的尺寸也将最终超出应用商店的限制。

扩展源码及相关脚本

最后附上去广告开源项目地址:com.pullywood.chrome.antiADs

(注:项目中不包含任何flash播放器文件,请自行下载修改。)

 

 

优酷去广告扩展:普利坞视频网站去广告原理及源码》上有54条评论

  1. 五档起步

    安装该插件后,会和proxy switchy冲突,导致goagent+proxy switchy不能用

    回复
  2. 澈。。waiting

    非常感谢。找了很久,终于找到一个有效的扩展。

    回复
  3. 菲比的老公

    你的支付宝账户是多少 通过手机支付宝转账可以不 先说了来 我可能只捐赠10多块钱,因为我才毕业呢。。。希望别嫌少

    回复
  4. 51flyafly

    挺好的,谢谢作者。本来想打5分的,后来发现乐视无法播放,提示:网络连接异常。我是:macos 10.9版本

    回复
  5. 优酷黑屏了,要么广告错误提示,要么就黑屏!

    优酷黑屏了,要么广告错误提示,要么就黑屏!

    回复
  6. XtCel

    今后不更新了吗,,,,,,,,好多都不能用了呢,,,,,,,,,源代码为什么要公开啊

    回复
  7. feiyu

    怎么解决Proxy SwitchyOmega兼容问题,会起冲突怎么解决,配置中是老版的截图设置,新版的解决不了

    回复
  8. 小学生看电视

    现在只有土豆可以用,其他的都不可以了。~~~

    回复
  9. 优酷的视频广告没法屏蔽 就是这样,希望尽快解决。最后说声谢谢,辛苦了。

    回复
  10. moon

    恩,失效了,楼主又时间和精力就更新一下吧,么么哒

    回复
  11. 混蛋优酷广告投放狂魔

    感谢作者 另外希望作者更新一下吧 优酷这个广告投放变态狂已经挡不住了 呜呜

    回复
  12. 电气火灾监控系统

    不错,以前只会用工具,现在能了解一下原理不错啊

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注