﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-人生半路, 杀出个程序</title><link>http://www.cppblog.com/legendlee/</link><description>什么时候才能学会编程啊?</description><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 18:52:48 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 18:52:48 GMT</pubDate><ttl>60</ttl><item><title>视频网站广告屏蔽插件，支持升级后的优酷防屏蔽（一）</title><link>http://www.cppblog.com/legendlee/archive/2011/09/28/157040.html</link><dc:creator>欲三更</dc:creator><author>欲三更</author><pubDate>Wed, 28 Sep 2011 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/legendlee/archive/2011/09/28/157040.html</guid><wfw:comment>http://www.cppblog.com/legendlee/comments/157040.html</wfw:comment><comments>http://www.cppblog.com/legendlee/archive/2011/09/28/157040.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/legendlee/comments/commentRss/157040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/legendlee/services/trackbacks/157040.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt; ">需求：优酷最近搞了一个广告防屏蔽，导致修改host的方法不能用了。我们需要一个新方法来绕过这个防屏蔽机制。</span><br /><br /><span style="font-size: 12pt; ">基本思想：新版的优酷flv player下载不到广告会罢工30秒，既然不能屏蔽广告，那我们就替换广告文件，用一个假广告文件让flv player播放。</span><br /><br /><span style="font-size: 12pt; ">实现：</span><br /><span style="font-size: 12pt; ">首先抓一下包，或者用Fiddle2拦截请求，会发现优酷的广告是个flv文件，而土豆和新浪的广告是f4v文件或者swf文件（不常用的就先不关心了）。我们找到广告url的特点，就可以实现替换。</span><br /><font class="Apple-style-span" size="3"><span style="font-size: 12pt; ">具体替换方式，有两种选择（驱动之类的bt方法我就不说了）：</span></font><br /><ul><li style="font-size: 12pt; "><span class="Apple-style-span" style="font-size: 14px; "><span style="font-size: 12pt; ">第一种是写一个伪代理服务注册进系统，同时用</span><a href="http://www.yici.net/content/text_all/text_0/279_1.html"><span style="font-size: 12pt; ">PAC脚本</span></a><span style="font-size: 12pt; ">根据url自动切换代理，发现是广告url就切换到我们写的伪代理，而伪代理的工作就是提供假广告文件。</span></span></li></ul><ul><li><span style="font-size: 12pt; ">第二种方式是利用浏览器插件拦截和替换请求。这个要针对不同浏览器开发，比如chrome扩展是基于js的，其拦截请求的接口叫</span><div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; background-color: #ffffff; font-size: small; "><a href="http://code.google.com/chrome/extensions/experimental.webRequest.html" style="color: #0000cc; "><span style="font-size: 12pt; ">experimental.webRequest</span></a></span><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; background-color: #ffffff; font-size: 12pt; ">，</span><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; background-color: #ffffff; font-size: 12pt; ">是个实验API，google不建议使用；同时chrome和firefox都支持NPAPI，而IE的插件机制是基于COM的。网上有个叫FireBreath的开源项目，是一个跨浏览器和操作系统的浏览器插件框架，是个好东西，但是我之前还没有用过。</span></li></ul><span class="Apple-style-span" style="background-color: #ffffff; "><font class="Apple-style-span" size="3"><font class="Apple-style-span" face="Helvetica, Arial, sans-serif"><span class="Apple-style-span" style="line-height: 16px; font-size: 12pt; ">我们先针对以后总浏览器实验一下功能能不能实现，笔者针对的是IE。</span></font><br /><font class="Apple-style-span" face="Helvetica, Arial, sans-serif"><span class="Apple-style-span" style="line-height: 16px; font-size: 12pt; ">IE的插件是个臭名昭著的东西，但是对开发者而言还是比较方便的，因为它比较&#8220;自由&#8221;，可以无所顾忌的使用C++干任何事儿。IE插件有三种：</span></font><br /><br /><ul><li style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; "><span style="font-size: 12pt; ">第一种是古老的ActiveX，这个大家肯定都很熟悉。PS：讲个笑话，我之前公司做过一个项目，要求提供CS和BS客户端。我们的CS客户端是现成的，而BS客户端就是CS客户端封装进一个巨大的ActiveX放进网页里，而且CS客户端是Qt4开发的，你可以想象ActiveX有多大。。。</span><br /><br /></li><li><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; font-size: 12pt; ">第二种叫BHO（<a href="http://msdn.microsoft.com/en-us/library/bb250436(v=vs.85).aspx"><span style="font-size: 12pt; ">Browser Helper Object</span></a></span><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; font-size: 12pt; ">），同样古老的技术，很多流氓插件和恶心工具栏就是这个东西，但是google的chrome frame也是基于这个东西，可见技术如刀，区别在人。BHO可以让你把dll嵌入IE进程，拦截一些IE操作，比如前进后退，但是太底层的不行，比如抓包肯定不行。</span></li></ul></font></span><span class="Apple-style-span" style="background-color: #ffffff; "><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; background-color: #ffffff; "><font class="Apple-style-span" size="3"><ul><li><span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; "><span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 16px; background-color: #ffffff; "><font class="Apple-style-span" size="3"><span style="font-size: 12pt; ">第三种比较特殊，叫</span></font></span><a href="http://msdn.microsoft.com/en-us/library/aa767743(v=vs.85).aspx"><span style="font-size: 12pt; ">Asynchronous Pluggable Protocols</span></a></span><span class="Apple-style-span" style="font-family: verdana, 'courier new'; line-height: 21px; font-size: 12pt; ">，这个东西也很常用，它可以让你拦截某个协议下的请求，比如http://，迅雷拦截thrunder://就是用的这个技术。Asynchronous Pluggable Protocols可以永久拦截，需要写注册表，也可以进程内临时拦截，调用一个API就可以，但是只针对本进程有效。很多电子书软件和使用WebBrowser控件制作华丽GUI的软件使用这种临时拦截。</span></li></ul></font></span></span><span class="Apple-style-span" style="background-color: #ffffff; font-size: 12pt; ">我用的方法就是写一个BHO嵌入IE进程，拦截IE的Navigate事件，如果是感兴趣的视频网站就开启</span><span style="font-size: 12pt; ">Asynchronous Pluggable Protocols拦截所有http请求，找到广告文件的请求，用假广告文件替换。假广告文件是个很短的flv或者swf，这样就绕过了防屏蔽机制。</span><br /><br /><span style="font-size: 12pt; ">结果：</span><br /><span style="font-size: 12pt; ">目前只是实现了基本功能，可以拦截优酷，土豆，新浪和奇艺的视频广告（其他的我不怎么用），并且暂时不针对外链的视频。暂时只支持IE，下一步用FireBreath做一个通用版。</span><br /><br /><span style="font-size: 12pt; ">截图（假广告时长两秒）：</span><br /><img src="http://www.cppblog.com/images/cppblog_com/legendlee/效果图.JPG" border="0" alt="" width="952" height="549" /><br /><br /><span style="font-size: 12pt; ">存在的问题：</span><br /><span style="font-size: 12pt; ">优酷的播放器可以正常播放假广告，但是土豆和新浪的都不可以，接受到文件之后他们会播放失败，之后开始正常播放视频。我专门下载了他们自己的广告文件作为假广告，还是不行。可能他们使用了某种签名机制，这个有待研究，好在他们没有像优酷一样防屏蔽，我暂时直接拦截掉了他们的广告，现在可以正常使用。</span><br /><br /><span style="font-size: 12pt; ">下载：</span><a href="http://www.cppblog.com/Files/legendlee/FlvAdBlock.zip"><span style="font-size: 12pt; ">http://www.cppblog.com/Files/legendlee/FlvAdBlock.zip</span></a><img src ="http://www.cppblog.com/legendlee/aggbug/157040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/legendlee/" target="_blank">欲三更</a> 2011-09-28 09:27 <a href="http://www.cppblog.com/legendlee/archive/2011/09/28/157040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>