【JS】去NM的视频广告

4,518 阅读12分钟

声明

  • 禁止转载
  • 严禁商用化
  • 若有从事以下(芒果Tv、腾讯视频、爱奇艺)的工作人员,希望您看完本篇文章后,可以聆听下我们心声

因为它注定是侵犯公司利益的,但我选择捍卫群众利益


写在前头

如果觉得啰嗦的可以直接跳到下面

问题: 广告烦不烦?

理由: 烦,从以前的“有线电视”到“数字电视”再到如今的“网络电视”,广告无处不在,但仍有人津津乐道,埋怨广告的同时,也笑谈着人生,兜里没几块钱却强迫着自己看广告,牢牢守在电视机前,等待接下来的动画片,结果怎样?到最后竟成了不少80、90后的回忆,现在几乎人手都能嚷出“你是我的优乐美”、“看前面的帅哥清爽帅气”的台词,爆出台词还能联想到产品,联想到画面,这才是广告最巅峰的地方,那些都是美好、纯真的回忆,无一例外

但如今它的性质却变了,变得不再让人喜欢了

“我喜欢优酷,那儿广告少,而且支付宝整天送我“会员”跟“跳广告”权益,领都领不完,真好啊!”

我媳妇突然跟我说,我沉默了,版权纷争、片源垄断,我好像不知从什么时候起,快忘记它们了,明明以前自己最喜欢土豆、优酷的

这是社会进步而带来的优劣化影响,不懂得变通的产品终将淘汰,电视的收视率低了,产品开发商们挤破了头想推销自己产品,而它们为了自身利益,纵容并且接纳了

15s,30s,45s,60s,120s,屡次中途插15s,30s,等等等等

知道这意味着什么吗?拿动漫举例,一部简短的24分钟动漫本来就少,前后2分钟bgm,2分钟前情提要,核心部分仅有18分钟左右,匆匆一点即可快进,但加上不可跳过的2分钟那就不一样了,什么词?度日如年,有多少小伙伴为了看动漫,点开一集又一集窗口,就为了自己能看的连贯?又有多少小伙伴为了看的舒心放心,忍痛买了会员?—— 谁知“道高一尺魔高一丈”,人家也有骚操作,“会员专享广告”在等你,意不意外?动漫本就很短,若是遇到《海贼王》这类更拖沓的前景提要,这几分钟广告不会让你失去对它的喜爱,只会让你对平台更加失望

这算不算是欺诈消费者呢?嘿,不算!人家霸王条款说了,里面有一条,用户同意我司可对合同进行调整(微笑),那么长的“用户协议”谁又会在意呢

《庆余年》那可真是好看啊,vip点播、vvip超前点播,我把后面的也想好了,应该叫vvvip超越点播,真是vip本v啊,除了会员这码事,盗版风波也重回巅峰,之前《堡垒》上市,我还一度以为盗版要灭亡了,盗版真香,特别是片源方泄漏那就更香了,人家还在剧里苦等更新,殊不知隔壁老王已看到大结局了,还是没广告的那种

穿插在剧情里的广告好吗?生硬,出戏且不说,时不时给产品一个镜头,真是恶心到不行,但《庆余年》就不一样啊,它让主角本身跳出了剧情之外去推销产品,观看产品的同时也不会出戏,最重要的是,他能快进啊!

那不是广告没有出路了?诶?还真不是,我对一种广告完全喜欢并沉浸着欣赏着,那就是综艺里的广告,《明星大侦探》不知小伙伴们有没看过,很奇怪,我完全不反感

说了好多杂七杂八的,来总结一下不惹人嫌的广告类型

  1. 简短的广告
  2. 可快进的剧外广告
  3. 在综艺里加广告
  4. ...(或许还有)

目标: 干掉视频广告

为什么最后再来提这个?我明明可以写个更技术性,更吸引人的标题的,其实是为了劝退某些人,让他们一点进来以为这是沙雕分享文,好了,闲话都说了,准备进教程吧

我们的标题应该是 —— Js脚本注入,视频免广告


教程

操作步骤: 以下所有操作步骤大致仅分两步

  1. 将网站地址(代码)添加进收藏夹
  2. 进视频平台后,点击打开收藏夹对应地址

兼容性: Pc端应该皆可

一、芒果Tv

在这里插入图片描述

官网地址:www.mgtv.com/

1、点击“添加到收藏夹”选择“更多”(以chrome为例)

在这里插入图片描述

2、输入自己定义的“名称”,在网址一栏中,输入以下代码

在这里插入图片描述

芒果Tv - 代码块

javascript:if(typeof _r==="undefined"){window._r=Array.prototype.reduce;Array.prototype.reduce=function(){var _f=arguments[0];if(typeof _f==="function"){arguments[0]=function(){if(arguments[3]&&arguments[3][0]&&arguments[3][0].hasOwnProperty("hideADLogo")){arguments=[]}return _f.apply(this,Array.from(arguments))}}return _r.apply(this,Array.from(arguments))};alert("OK")}else{alert("OK")};

3、打开网站,随意点播一个视频,进视频页面,打开收藏夹,点击刚收藏的网址(代码)

注意

在掘金复制代码可能会有以下后缀跟在代码后面,请删除后,方可使用

“ 作者:清一色天空 链接:juejin.cn/post/684490… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。”

然后?

接下来你会弹出一个“OK”的弹窗,此时你当前视频仍然是有广告的,请你随意点击右边任意一集,你会发现该视频没广告了,此时你再点回刚才那集就行

什么情况下不行?

  • 页面刷新后,该代码需重新注入
  • 页面退出后,再进入需重新注入
  • 开发者重写了

为什么我需要点其他视频再点回来才生效?

不是点回来才生效,而是注入后,点该页面中任何一个视频都已经生效了,为什么当前还在播广告?因为它在注入之前就已经在播了...

怎么实现的?

具体可进下一章节“思路”里查看


二、腾讯视频

在这里插入图片描述

官网地址:v.qq.com/

步骤与“芒果Tv”一致,脚本直接塞上,复制进收藏夹

腾讯视频 - 代码块


javascript:if(typeof _f==="undefined"){window._f=Array.prototype.forEach;Array.prototype.forEach=function(){if(this[0]&&this[0].el&&this[0].el.localName==="video"){this.splice(0,this.length)}return _f.apply(this,Array.from(arguments))};alert("OK")}else{alert("OK")};

接下来的使用方案跟呈现效果也是与“芒果Tv”相同的


三、爱奇艺

在这里插入图片描述

官网地址:www.iqiyi.com/

前面相同,将以下脚本复制进收藏夹,但呈现效果略微不同

爱奇艺 - 代码块


javascript:if(!Function._apply){Function.prototype._apply=Function.prototype.apply;Function.prototype.apply=function(){var a=Array.from(arguments);if(a[0]&&a[0].currentCount){a[0].currentCount=a[0].repeatCount}return this._apply(a[0],a[1])};alert("OK")}else{alert("OK")};

注意: 该效果将在你点击收藏夹网站时,直接生效,实现效果为视频广告一顿一卡,间接结束

为什么一卡一卡,好像广告在快进?

其实并不是广告在快进,而是广告在跳进下一个广告,简单来说,就是广告不是单独的,它是由多个广告拼接而成,我所做到的,就是让他跳到下个广告,直到跳没为止


最终,你的收藏夹应该是这样的(举例)

在这里插入图片描述


思路

这里我是不放平台代码的,以防万一

一、引子

或许这一章节,才是大家关心的,毕竟这是技术社区

那么在这之前,我再简单抛个引子

大家是否有过这样的经历——痛苦的大学选修课,大学里的选修课真是苦不堪言啊,看不完的头疼视频,没营养听不进且不说,最令人头疼的是,它竟然还有种种限制,什么鼠标移出暂停,什么中途插验证码,什么不能拖动滚动条,烦的要死,然后解决方案也是牛鬼神蛇,多开啦,虚拟机啦,而其中有一种,叫做——JS脚本注入

二、思考

干掉广告,首先要搞清楚这个广告是怎么播放的,哪些能肯定,哪些是不能肯定,得先理理,因为接下来看的,是一整片杂乱无章的代码,是被编译混淆过的代码,这一想法将贯穿整个过程,无时无刻都要思考

思考结论:

这个结论其实画设计图会更好,但我懒得弄了,直接码字

  1. 若是断点修改数据能屏蔽广告,那就有成功的希望
  2. 若是有希望,那怎么能从芸芸代码中找到那个地方,那个文件?
  3. 定时器一定是前端控制的,是否能尝试下修改定时器相关的地方,追踪到目标页面,做到修改时间跟广告?
  4. 只要有一点能成功,那就开始找上下文,是否有控制播放函数,控制遍历广告函数的地方等
  5. 若有,则断点再进入那里,回到第一点,修改相关数据是否能屏蔽广告
  6. 若成功,再开始找上下文中能注入JS的地方,成功就End,失败则再找下一处,毕竟断点修改数据能跳广告了不是吗?
  7. End

直接删广告的Video dom能否去掉广告呢?

这种简单粗暴的方式,我没尝试过,或许你可以试试,有意外之喜也不一定

三、找入口

先找切入口,找到目标js文件,上文所述是从定时器开始,从dom节点找,再全局搜索相关类名,id,setInterval,setTimeout,这样固然慢,但也是没办法中的办法,我先把他叫做节点方案

事实上也有其他快速方法,节点方案我们把它做下下策也未尝不可

我们可以查看Network,也许广告xhr被明文看到了呢?然后全局搜索相关接口,快速追踪到目标文件(但我没找到)

我们可以查看控制台,也许哪家公司的开发人员,就把广告信息console.log打印了呢?我们可以直接追踪到目标文件,查看上下作用域(事实上某平台真出现这种情况了)

我们可以查看播放暂停键,一切能干预到广告的按钮,都会绑有事件,我们可以从Event Listener Breakpoints去触发,再把jq之类的库关小黑屋,来由上往下定位,找到目标文件(因为一般这类函数是跟视频等其他函数放一起的)(某平台太可恶了,广告连暂停都不给)

Other...

四、找上下文

从结果来看,是找到那个js文件了,但过程很痛苦

找上下文是个辛苦活,它是与从哪儿注入是并列最难的两种,两种都非常考验Js功底与阅码的能力

哪儿打断点并改一处数据,就能跳广告呢?结论是疯狂打断点

不存在一招命中,至少我找的时候没去洗脸,可以选择console.trace去打印栈,也可以ctrl+F搜索关键字眼,配合Deactivate breakpoints去调试,无其他办法,非常耗时

五、Js注入

从结果来看,我又找到了,但过程异常痛苦

js注入的方法有很多,但从input框进入且直接命中当前断点文件并修改数据,我压根没去想这种可能性

我选择是修改全局

全局能命中吗?现在哪儿还有暴露window让你去改的?都2020年了,人手闭包一个,webpack、rollup,除非你直接window.xx=xx暴露出去,否则根本不可能

但事实上真的如此?

es6以来,指令式代码盛起,函数越来越规整,结构也愈发的规范,大家一边嚷着find、map高阶函数的好用,一边唾弃for关键字的low,却不知

罪犯也会训着规范来找你

高阶函数不就是window暴露的吗?Array.prototype.map难道就不是全局吗?

我放一下芒果Tv的注入代码


if (typeof _r === "undefined") {
  window._r = Array.prototype.reduce;
  Array.prototype.reduce = function() {
    var _f = arguments[0];
    if (typeof _f === "function") {
      arguments[0] = function() {
        if (arguments[3] && arguments[3][0] && arguments[3][0].hasOwnProperty("hideADLogo")) {
          arguments = []
        }
        return _f.apply(this, Array.from(arguments))
      }
    }
    return _r.apply(this, Array.from(arguments))
  };
  alert("OK")
} else {
  alert("OK")
};

很短是不是?但就是这么短的代码,它其实命中的只有茫茫代码中的一小段,甚至是一行,就是这一行精准干掉了广告

1、首先是存储方法,将reduce储存,reduce怎么来的?为什么要储存这个?

当我确定了断点修改数据能成功的时候,就开始找函数注入点了,因为es6以来,大伙都纷纷使用高阶函数,我就开始在上下文中搜索高阶函数点,当我ctrl+F搜索map时,茫茫大片的使用率,险些让我笑出了猪脚,人人唾弃for,若是用它,我还真不知道该怎么办才好,我最终找到了能干扰数据且离debugger最近的reduce函数

2、注入脚本,return原始方法

我要改的数据很不巧,它是在函数里的函数,于是我又储存了方法,再重写注入,干扰到入参,return返回再返回

成功

六、遇到的问题

读码的时候一定会遇到各种奇奇怪怪的问题,但最头疼的似乎只有一个

  • 爱奇艺: 打开控制台后,播放页面刷新,然后页面崩了,我连断点都还没打喂!运气差些,浏览器都崩了,我真不知道这是防注入、防ban,还是代码自身问题,但从结果来看,确实令我挺火大的,干得不错

关于

make:o︻そ╆OVE▅▅▅▆▇◤(清一色天空)

blog:blog.csdn.net/mcky_love

掘金:juejin.cn/user/199636…

lofter:zcxy-gs.lofter.com/

sf:segmentfault.com/u/mybestang…

git:github.com/gs3170981


结束语

事实上,下定决心读码的,还是我媳妇,整天抱剧看,频多的广告也让我头脑发热,或许这段代码在什么时间点,就不生效了,程序员更新了,后端字段更变了,平台人员看到并且上报了,到那时,请别再来找我更新,也许我收到律师函唱跳rap去了...

最近没时间写文章,实在是太忙,作为摸鱼大队长,摸会鱼还给我2分钟广告,大大降低了摸鱼效率,如果大伙有用的话,希望能点个赞,掘金独此一份,其余博客不再刊登

谢谢!