架构师_程序员_码农网

B Hent adgangskode
Tilmeld dig

QQ登录

Kun ét skridt for at komme i gang

Søg
架构师_程序员_码农网 "架构' 管理专区&Management Area ' Klager og forslag ' 回收站 ' 爱奇艺播放器之去广告分析
Vis:5980|Svar: 3
打印 上一主题 下一主题

Annonceanalysen af Aiki-spilleren!

[kopier link]
L 跳转到指定楼层
ejeren af bygningen
2014-10-23 22:26:53 |只看该作者回帖奖励|ReverseBrowse|Read Mode

For nylig havde han travlt med åbningen af skolen, der er egnet til blindfoldning - i disse to dage har Zero travlt med videoannoncer, sagde, at annoncerne bliver mere og mere oversvømmede, nogle af videoåbningsannoncerne er mere end 60'erne. Han er sluppet af med reklamerne for Sohu, men han har ikke været i stand til at slippe af med reklamerne for Aqiyi. Lad mig hjælpe ham med at lede.

Han gav mig kildekoden, jeg har ikke en swf-dekompiler.

Jeg havde ikke en swf-dekompiler. Jeg kiggede nok på strukturen, og jeg har ikke lært ActionScript. Han sagde, at det ligner Java, så jeg gider ikke se på den grundlæggende syntaks og går direkte til det. Lad os først se på headeren i hovedfilen Player.as og se, hvilke referencer der er.

  1.     import com.iqiyi.components.global.*;
  2.     import com.iqiyi.components.tooltip.*;
  3.     import com.qiyi.player.base.pub.*;
  4.     import com.qiyi.player.base.uuid.*;
  5.     import com.qiyi.player.core.*;
  6.     import com.qiyi.player.core.model.def.*;
  7.     import com.qiyi.player.core.model.utils.*;
  8.     import com.qiyi.player.wonder.*;
  9.     import com.qiyi.player.wonder.body.view.*;
  10.     import com.qiyi.player.wonder.common.config.*;
  11.     import com.qiyi.player.wonder.common.lso.*;
  12.     import com.qiyi.player.wonder.common.pingback.*;
  13.     import com.qiyi.player.wonder.common.sw.*;
  14.     import flash.display.*;
  15.     import flash.events.*;
  16.     import flash.media.*;
  17.     import flash.system.*;
  18.     import flash.utils.*;
Kopier koden

Se på navnet, com.qiyi.player.wonder.common.config.*; det fangede min opmærksomhed - se på konfigurationsoplysningerne. Der er to filer, FlashVarConfig.as og SystemConfig.as. SystemConfig.as viser ikke noget interessant, men xml-konfigurationsfilen, der refereres til i FlashVarConfig.as, er værd at undersøge.

  1. package com.qiyi.player.wonder.common.config
  2. {

  3.     public class FlashVarConfig extends Object
  4.     {
  5.         public static const OWNER_PAGE:String = "page";
  6.         public static const OWNER_CLIENT:String = "client";
  7.         public static const OS_XP:String = "xp";
  8.         public static const OS_WIN7:String = "win7";
  9.         public static const OS_WIN8:String = "win8";
  10.         public static const PAGE_OPEN_SRC_NONE:String = "0";
  11.         public static const PAGE_OPEN_SRC_DIRECT:String = "1";
  12.         public static const PAGE_OPEN_SRC_OTHER:String = "2";
  13.         private static var _flashVarSource:Object;
  14.         private static var _albumId:String = "";
  15.         private static var _tvid:String = "0";
  16.         private static var _vid:String = "";
  17.         private static var _autoPlay:Boolean = true;
  18.         private static var _isMemberMovie:Boolean = false;
  19.         private static var _cyclePlay:Boolean = false;
  20.         private static var _components:String = "fefff7e6";
  21.         private static var _cupId:String = "";
  22.         private static var _shareStartTime:int = -1;
  23.         private static var _shareEndTime:int = -1;
  24.         private static var _preloaderURL:String = "http://dispatcher.video.qiyi.com/dispn/player/preloader.swf";
  25.         private static var _preloaderVipURL:String = "";
  26.         private static var _exclusivePreloader:String = "";
  27.         private static var _useGPU:Boolean = true;
  28.         private static var _showBrand:Boolean = true;
  29.         private static var _expandState:Boolean = false;
  30.         private static var _tipDataURL:String = "http://static.qiyi.com/ext/tips/tipdata.xml";
  31.         private static var _coop:String = "";
  32.         private static var _owner:String = "page";
  33.         private static var _os:String = "win7";
  34.         private static var _adPlayerURL:String = "";
  35.         private static var _origin:String = "";
  36.         private static var _passportID:String = "";
  37.         private static var _playListID:String = "";
Kopiering af koden

I linje 31 har denne konfigurationsfil dette afsnit. Og i linje 35 i reklameadressen fangede også min opmærksomhed, senere i analysen. Se først på konfigurationsfilen.

  1. </item>
  2. <!-- 正在为您播放片中广告, 可选择是否要跳过, 类别是1, 持续时间是8秒 -->
  3. <!-- 限制条件是:  不是正在登录中的会员 -->
  4. <!-- 每天每人次只最多显示两次这个tips -->
  5. <item id="ToSelectWhetherToSkipPlayingMiddleAD" level="1" duration="-1" type="1">
  6. <conditions>
  7. <fields>
  8. <field name="member" operator="eq" value="false"/>
  9. </fields>
  10. <frequency count="2">
  11. <restrain name="day"/>
  12. <restrain name="user"/>
  13. </frequency>
  14. </conditions>
  15. <list>
  16. <message>
  17. <![CDATA[
  18. 正在为您播放片中广告, <a href="event:ASEvent(skipAD)"><b><u>跳过广告</u></b></a>
  19. ]]>
  20. </message>
  21. </list>
  22. </item>
  23. <!-- 提示即将跳过8秒后会显示的剧中广告, 类别是1, 持续时间是8秒 -->
  24. <!-- 必须是登录的会员 -->
  25. <item id="ToCancelSkipNextMiddleAD" level="1" duration="8" type="1">
  26. <conditions>
  27. <fields>
  28. <field name="member" operator="eq" value="true"/>
  29. </fields>
  30. <frequency count="1">
  31. <restrain name="day"/>
  32. <restrain name="user"/>
  33. </frequency>
  34. </conditions>
  35. <list>
  36. <message>
  37. <![CDATA[
  38. 即将为您跳过片中广告,<a href="event:ASEvent(cancelSkipAD)"><u>不再跳过</u></a>
  39. ]]>
  40. </message>
  41. </list>
  42. </item>
  43. <!--
  44. 提示版权下线, 如果还有小于7天的时间下线, 每天一个专辑一台电脑提醒一次, 类别是1, 从起始60秒开始显示, 持续时间是10秒
  45. -->
  46. <!-- 因为优先级很高, 前面的最高优先级是10, 所以这里把level设为11. -->
  47. <!-- 这个tip是由signal发起的. Shawn.X  -->
  48. <!--
  49. 《<span>#keyword#</span>》 将于  <span>#expiredTime#</span> 版权到期.
  50. -->
  51. <item id="NoticeThisCopyrightWillExpire" level="11" duration="10" type="1">
  52. <conditions>
Kopier koden

Der står, at det er en in-show-reklame med en varighed på 8 sekunder, hvilket betyder, at jeg lokaliserede den og kaprede browseren for at fjerne reklamerne, men det er tydeligt, at dette ikke er en reklame, før videoen indlæses. Bliv ved med at bladre - meget kedelig proces.

Find ud af, hvem der kalder get adPlayerURL(), og kig opad. Under com\qiyi\player\wonder\plugins\ad fandt jeg ud af, at annonceafspilleren findes i form af et plugin, det vil sige, at der stadig er et kald, og når jeg kigger opad, fandt jeg ud af, at på com\qiyi\cupid\adplayer\CupidAdPlayer.as er CupidAdPlayer initialiseret. Og klassen er obfuskeret, hvilket er mistænkeligt.

  1. public function CupidAdPlayer(param1:CupidParam)
  2.         {
  3.             this.PLAYER_TIMEOUT_LENGTHS = new Array(10000, 15000);
  4.             Log.info("init, version=" + VERSION + ", " + param1.toString());
  5.             this._videoPlayerVersion = param1.videoPlayerVersion;
  6.             this._videoId = param1.videoId;
  7.             this._tvId = param1.tvId;
  8.             this._channelId = param1.channelId;
  9.             this._collectionId = param1.collectionId;
  10.             this._playerId = param1.playerId;
  11.             this._albumId = param1.albumId;
  12.             this._userId = param1.userId;
  13.             this._webEventId = param1.webEventId;
  14.             this._videoEventId = param1.videoEventId;
  15.             this._vipRight = param1.vipRight;
  16.             this._terminal = param1.terminal;
  17.             this._duration = param1.duration;
  18.             this._passportId = param1.passportId;
  19.             this._passportCookie = param1.passportCookie;
  20.             this._passportKey = param1.passportKey;
  21.             this._videoDefinitionId = param1.videoDefinitionId;
  22.             if (this.isQiyiWebEx())
  23.             {
  24.                 this._playerUrl = this.IQIYI_WEBEX_AM_URL;
  25.             }
  26.             else if (param1.playerUrl)
  27.             {
  28.                 this._playerUrl = param1.playerUrl;
  29.             }
  30.             else
  31.             {
  32.                 this._playerUrl = this.IQIYI_WEB_AM_URL;
  33.             }
  34.             if (param1.dispatcher == null)
  35.             {
  36.                 this._dispatcher = this;
  37.             }
  38.             else
  39.             {
  40.                 this._dispatcher = param1.dispatcher;
  41.             }
  42.             this._volume = param1.volume;
  43.             this._videoIndex = param1.videoIndex;
  44.             this._stageWidth = param1.stageWidth;
  45.             this._stageHeight = param1.stageHeight;
  46.             this._displayContainer = param1.adContainer;
  47.             this._screenStatus = DisplayProperties.isFullScreen(this._displayContainer.stage) ? ("1") : ("0");
  48.             this._baiduMainVideo = param1.baiduMainVideo;
  49.             this._disablePreroll = param1.disablePreroll;
  50.             this._disableSkipAd = param1.disableSkipAd;
  51.             this._enableVideoCore = param1.enableVideoCore;
  52.             this._isUGC = param1.isUGC;
  53.             this._videoPlayerUrl = this._displayContainer.loaderInfo ? (this._displayContainer.loaderInfo.loaderURL) : ("");
  54.             this._env = this.generateEnv();
  55.             this.addAdPlayerEventListeners();
  56.             return;
  57.         }// end function
Kopier koden

CupidAdPlayer(param1:CupidParam) <- se på dens opkaldsparametre, det vil sige, det øverste lag kalder stadig, hvilken parameter en, en værdi er meget mærkbar, vipRight Døm om det er vip, og vip findes ikke annoncer, det vil sige, hvis jeg får brugeroplysningerne i sessionen i afspilleren, vil jeg bruge den til at få brugeroplysningerne på hjemmesiden, det vil sige, hvis jeg får brugeroplysningerne i sessionen i afspilleren, vil jeg bruge den til at få brugeroplysningerne på hjemmesiden. Det vil sige, at hvis jeg foretager en ændring i brugeroplysningerne i sessionen på webstedet, efter at afspilleren har fået brugeroplysningerne på webstedet, og foretager en ændring i stedet for at bedømme, om det er en vip eller ej, hvilket får det lavere lag til at blive kaldt, vil det fejlagtigt blive troet, at det er en vip (kun reklameafspilleren tror, at du er en vip, og de andre steder vil ikke blive påvirket). Så lad os blive ved med at kigge opad. For at lede efter det gik vi tilbage til mappen med reklameplugin. com\qiyi\player\wonder\plugins\ad\view i ADView.as, headeren er først

  1. private var _adPlayer:CupidAdPlayer;
Kopier kode

Definerede en forekomst af CupidAdPlayer ved navn _adPlayer en gang, rullede ned for at finde ud af, hvem der bruger _adPlayer. fandt overraskende funktionen til oprettelse af annonceafspiller.

  1. public function createAdPlayer(param1:CupidParam) : void
  2.         {
  3.             if (this._adPlayer)
  4.             {
  5.                 this.unloadAdPlayer();
  6.             }
  7.             this._log.info("loading adplayer...");
  8.             this._adPlayer = new CupidAdPlayer(param1);
  9.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_LOADING_SUCCESS, this.onAdLoadSuccess);
  10.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_LOADING_FAILURE, this.onAdLoadFailed);
  11.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_START, this.onAdStartPlay);
  12.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_PAUSE, this.onAdAskVideoPause);
  13.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_RESUME, this.onAdAskVideoResume);
  14.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_START_LOADING, this.onAdAskVideoStartLoad);
  15.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_START, this.onAdAskVideoStartPlay);
  16.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_END, this.onAdAskVideoEnd);
  17.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_BLOCK, this.onAdBlock);
  18.             this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_DISPLAY_AD_TIP, this.onAskVideoShowBonusTips);
  19.             this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_VIDEO, this.onAdFlvADAction);
  20.             this._adPlayer.load();
  21.             return;
  22.         }// end function
Kopiering af koden

Når man stadig kan sende parametre, betyder det, at den stadig bliver kaldt. Jeg fandt endelig kilden i ADViewMediator.as under com\qiyi\player\wonder\plugins\ad\view. Det endelige kald til hans funktion ser sådan ud

  1. private function createADPlayer() : void
  2.         {
  3.             sendNotification(BodyDef.NOTIFIC_PLAYER_STOP_LOAD);
  4.             ProcessesTimeRecord.STime_adInit = getTimer();
  5.             var _loc_1:* = facade.retrieveProxy(PlayerProxy.NAME) as PlayerProxy;
  6.             var _loc_2:* = facade.retrieveProxy(UserProxy.NAME) as UserProxy;
  7.             var _loc_3:* = new CupidParam();
  8.             _loc_3.playerUrl = FlashVarConfig.adPlayerURL;
  9.             _loc_3.videoId = _loc_1.curActor.loadMovieParams.vid;
  10.             _loc_3.tvId = _loc_1.curActor.loadMovieParams.tvid;
  11.             _loc_3.channelId = _loc_1.curActor.movieModel.channelID;
  12.             _loc_3.playerId = FlashVarConfig.cupId;
  13.             _loc_3.albumId = _loc_1.curActor.movieModel.albumId;
  14.             _loc_3.dispatcher = null;
  15.             _loc_3.adContainer = this._ADView;
  16.             _loc_3.stageWidth = GlobalStage.stage.stageWidth;
  17.             _loc_3.stageHeight = GlobalStage.stage.stageHeight;
  18.             _loc_3.userId = _loc_1.curActor.uuid;
  19.             _loc_3.webEventId = UUIDManager.instance.getWebEventID();
  20.             _loc_3.videoEventId = UUIDManager.instance.getVideoEventID();
  21.             _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
  22.             _loc_3.terminal = "iqiyiw";
  23.             _loc_3.duration = _loc_1.curActor.movieModel.duration / 1000;
  24.             _loc_3.passportId = _loc_2.passportID;
  25.             _loc_3.passportCookie = _loc_2.P00001;
  26.             _loc_3.passportKey = KeyUtils.getPassportKey(0);
  27.             _loc_3.enableVideoCore = true;
  28.             _loc_3.disableSkipAd = _loc_1.curActor.movieModel.forceAD;
  29.             _loc_3.volume = Settings.instance.mute ? (0) : (Settings.instance.volumn);
  30.             _loc_3.isUGC = UGCUtils.isUGC(_loc_1.curActor.movieModel.tvid);
  31.             _loc_3.collectionId = FlashVarConfig.collectionID;
  32.             _loc_3.videoDefinitionId = _loc_1.curActor.movieModel.curDefinitionInfo.type.id;
  33.             _loc_3.videoPlayerVersion = WonderVersion.VERSION_WONDER;
  34.             this._ADView.createAdPlayer(_loc_3);
  35.             return;
  36.         }// end function
Kopier koden

Det vigtigste punkt er i

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Kopier kode

Denne linje bestemmer, om brugeren er en vip eller ej, først i henhold til den lokale variabel loc_2 for at bestemme brugerens niveau, hvis den med definitionen af vip-niveauet returnerer 1. Vi giver ham en lille ændring, det bliver en pseudo-vip.

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Kopier koden

På denne måde i Hex for at ændre linjen, testannoncer med succes fjernet (ved hjælp af Chromes plug-in-funktion, ændre afspilleradressen til den lokale, afspil de samme parametre for at passere).

Derudover er der i AdBlockedBlackScreen.as under com\qiyi\cupid\adplayer\model en lokal detekteringsfunktion for at forbyde Chromes plug-in-blokering.

  1. public static function isInBlacklist(param1:String) : Boolean
  2.         {
  3.             if (!param1)
  4.             {
  5.                 return false;
  6.             }
  7.             if (StringUtils.beginsWith(param1, "chrome-extension://"))
  8.             {
  9.                 return true;
  10.             }
  11.             var _loc_2:* = new URLParser(param1);
  12.             var _loc_3:* = _loc_2.getHost();
  13.             return HOST_BLACKLIST.indexOf(_loc_3) != -1;
  14.         }// end function
Kopier koden

Du skal bare ændre return i det andet if til false.






Forrige artikelFreeze Restore Wizard 7.5 Alternative Crack i Win7
Næste: Installation af virtuel VMware-maskine MAC OSX Mountain Lion
Kode Farmer-netværk, kun offentliggjort i praksisprocessen, stødte på tekniske vanskeligheder, ikke vildlede andre.
Jeg er ikke sikker på, om du er fan af dette.
Jeg er ikke sikker på, om jeg vil være i stand til at gøre det.
2014-10-23 23:25:57|只看该作者
Xiao Ningzi er så fantastisk
Koden landmand netværk, kun offentliggjort i færd med praksis, stødt på tekniske vanskeligheder, ikke vildlede andre.
Bænk
2014-10-24 21:57:25|只看该作者
Dette plugin til blokering af annoncer er ikke dårligt

Bedømmelse

Deltagere 1 MB +1 Bidrag +1 Læggrundenvæk
administrator + 1 + 1 Meget kraftfuld!

Se alle bedømmelser

Koden landmand netværk, kun offentliggjort i processen med praksis, stødt på tekniske vanskeligheder, ikke vildlede andre.
gulvbrædder
owner| 发表于 2014-10-24 22:01:44|只看该作者
Indsendt af skywriter den 2014-10-24 21:57
Dette plugin til at blokere annoncer er ikke dårligt

Adblock Plus er den mest populære software til filtrering af reklamer, som findes til browserne Firefox, Chrome, Opera, Safari, Android og Internet Explorer. Filtrer alle irriterende online-reklamer: fjern video-reklamer på Youtube, filtrer Facebook-reklamer, slip af med pop-up-reklamer og meget mere. I Google Chrome er Adblock Plus et af de hurtigst voksende plugins.
CodeFarmer.com, kun offentliggjort i løbet af praksis, stødte på tekniske vanskeligheder, vildled ikke andre.
Du skal logge ind, før du kan skrive igen Log ind | Registrer dig

D enne version af de integrerede regler


ANSVARSFRASKRIVELSE: Al software, programmeringsmateriale eller artikler, der frigives af kodefarmernetværket, er begrænset til studie- og forskningsformål; ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers er alle konsekvenser venligst brugeransvarlige. Denne webstedsinformation fra netværket, copyright-tvist har intet at gøre med dette websted. Du skal fjerne ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, bedes du støtte den ægte software, købe registreringen og få bedre ægte service. Hvis der sker en krænkelse, bedes du kontakte os via e-mail for at håndtere det.

Mail To:help@itsvse.com

QQ | ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-17 14:05

Hurtigt svarTilbage til toppenTilbage til listen