架构师_程序员_码农网

Ім'я користувача Отримати пароль
Зареєструватися

QQ登录

Лише один крок, щоб почати

Пошук
架构师_程序员_码农网 " 架构师 ' 管理专区 & Область управління ' Скарги та пропозиції ' 回收站 ' 爱奇艺播放器之去广告分析
Перегляд:5980|Відповідь: 3
打印 上一主题 下一主题

Аналіз реклами плеєра Aiki!

[скопіювати посилання]
Підніміться прямо до 跳转到指定楼层
до власника будинку
发表于 2014-10-23 22:26:53|只看该作者回帖奖励 | Зворотнийперегляд|Режим читання

Нещодавно зайнятий відкриттям школи, придатної для сліпого складання - ці два дні нульова зайнятість відеореклами, сказав, що реклама стає все більш і більш затопленою, деякі відеореклами, що відкриваються, перевищують 60-ті роки. Він позбувся реклами Соху, але не зміг позбутися реклами Акії. Дозвольте мені допомогти йому шукати.

Вихідний код - це те, що він мені дав, у мене немає декомпілятора swf.

У мене не було декомпілятора swf, я, мабуть, подивився на структуру, а ActionScript я не вивчав. Він сказав, що вона схожа на Java, тому я не став розглядати базовий синтаксис, а перейшов одразу до неї. Давайте спочатку подивимося на заголовок головного файлу Player.as і подивимося, які там є посилання.

  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.*;
Скопіюйте код

Подивіться на назву, com.qiyi.player.wonder.common.config.*; привернуло мою увагу - подивіться на інформацію про конфігурацію. Є два файли, FlashVarConfig.as і SystemConfig.as. SystemConfig.as не показує нічого цікавого, але xml-файл конфігурації, на який посилається FlashVarConfig.as, варто дослідити.

  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 = "";
Копіювання коду

У рядку 31 цього конфігураційного файлу є такий абзац. І в рядку 35 адреса реклами також привернула мою увагу, пізніше в аналізі. Спочатку подивимося на конфігураційний файл.

  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>
Скопіюйте код

Тут сказано, що це реклама під час показу тривалістю 8 секунд, тобто я локалізував її і перехопив браузер, щоб видалити рекламу, але ясно, що це не реклама перед завантаженням відео. Продовжуйте гортати - дуже нудний процес.

З'ясуйте, хто викликає get adPlayerURL() і подивіться вгору. За адресою com\qiyi\player\wonder\plugins\ad я знайшов, що плеєр реклами існує у вигляді плагіна, тобто виклик ще є, дивлячись вгору, я знайшов, що за адресою com\qiyi\cupid\adplayer\CupidAdPlayer.as ініціалізується CupidAdPlayer. І клас завуальований, що є підозрілим.

  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
Скопіюйте код

CupidAdPlayer(param1:CupidParam) <- подивіться на його параметри виклику, тобто верхній рівень все ще викликається, який параметр один, значення дуже помітне, vipRight Судіть самі, чи це vip, а vip не існує реклами, тобто якщо я отримаю інформацію про користувача в сесії в плеєрі, я буду використовувати її для отримання інформації про користувача на сайті, тобто якщо я отримаю інформацію про користувача в сесії в плеєрі, я буду використовувати її для отримання інформації про користувача на сайті. Тобто, якщо я внесу зміни в інформацію про користувача в сеансі веб-сайту після того, як його плеєр отримає інформацію про користувача на веб-сайті, і внесу зміни в місце визначення того, чи є він віп-користувачем чи ні, що призведе до виклику нижнього рівня, то буде помилково вважатися, що він є віп-користувачем (тільки рекламний плеєр буде вважати вас віп-користувачем, а на інші місця це не вплине). Тож продовжуємо дивитися вгору. У пошуках ми повернулися до каталогу рекламного плагіна. com\qiyi\player\wonder\plugins\ad\view у файлі ADView.as, заголовок перший

  1. private var _adPlayer:CupidAdPlayer;
Копіювати код

Визначив екземпляр CupidAdPlayer з ім'ям _adPlayer один раз, прокрутив вниз, щоб дізнатися, хто використовує _adPlayer. несподівано знайшов функцію створення рекламного плеєра.

  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
Копіювання коду

Те, що ви все ще можете передавати параметри, означає, що її все ще викликають. Я нарешті знайшов вихідний код в ADViewMediator.as під com\qiyi\player\wonder\plugins\ad\view. Останній виклик його функції виглядає так

  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
Копіювати код

Ключовим моментом є те, що

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Копіювати код

Цей рядок, щоб визначити чи є користувач vip чи ні, спочатку по локальній змінній loc_2 визначає рівень користувача, якщо з визначенням рівня vip, то повертає 1. Даємо йому невелику модифікацію, він стає псевдо-vip.

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Скопіюйте код

Таким чином в Hex модифікуємо рядок, тестова реклама успішно видаляється (використовуючи функцію плагіна Chrome, змінюємо адресу плеєра на локальну, передаємо ті ж самі параметри).

Крім того, у файлі AdBlockedBlackScreen.as за адресою com\qiyi\cupid\adplayer\model є функція локального визначення для заборони блокування плагіном Chrome.

  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
Скопіюйте код

Просто змініть повернення другого if на false.






Попередня статтяАльтернативний злом Freeze Restore Wizard 7.5 в Win7
Наступна: Встановлення віртуальної машини VMware MAC OSX Mountain Lion
Code Farmer network, опублікований тільки в процесі практики, виникли технічні труднощі, не вводьте в оману інших.
Я не впевнений, що вам це сподобається.
Я не впевнений, що зможу це зробити.
发表于 2014-10-23 23:25:57|只看该作者
Сяо Нінці такий чудовий
Мережа кодових фермерів, опублікована лише в процесі практики, зіткнулася з технічними труднощами, не вводьте в оману інших.
Лавка
发表于 2014-10-24 21:57:25|只看该作者
Цей плагін для блокування реклами непоганий

Рейтинг

Учасники 1 МБ +1 Внесок +1 Прибрати Причину
адміністратор + 1 + 1 Дуже потужний!

Переглянути всі рейтинги

Код фермерської мережі, опублікований тільки в процесі практики, зіткнувся з технічними труднощами, не вводьте в оману інших.
дошки для підлоги
власник| 发表于 2014-10-24 22:01:44|只看该作者
Опубліковано автором skywriter в 2014-10-24 21:57
Цей плагін для блокування реклами непоганий

Adblock Plus - найпопулярніше програмне забезпечення для фільтрації реклами, доступне для браузерів Firefox, Chrome, Opera, Safari, Android та Internet Explorer. Фільтруйте всю набридливу рекламу в Інтернеті: видаляйте відеорекламу на Youtube, фільтруйте рекламу на Facebook, позбудьтеся спливаючих вікон і багато іншого. У Google Chrome Adblock Plus є одним з найбільш швидкозростаючих плагінів.
CodeFarmer.com, публікується тільки в процесі практики, стикався з технічними труднощами, не вводьте в оману інших.
Ви повинні увійти перед тим, як відповісти Увійдіть | Зареєструйтеся

Ця версія інтегральних правил Відповісти


ВІДМОВА ВІД ВІДПОВІДАЛЬНОСТІ: Все програмне забезпечення, програмні матеріали або статті, випущені мережею CodeFarmer, призначені для навчальних і дослідницьких цілей; вищевказаний контент не повинен використовуватися в комерційних або незаконних цілях, в іншому випадку, всі наслідки покладаються на користувача, який несе відповідальність. На цьому сайті розміщена інформація з мережі, суперечка про авторські права не має ніякого відношення до цього сайту. Ви повинні повністю видалити вищевказаний контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримайте справжнє програмне забезпечення, придбайте реєстрацію та отримайте кращий справжній сервіс. Якщо є якесь порушення, будь ласка, зв'яжіться з нами електронною поштою, щоб розібратися з ним.

Пошта To:help@itsvse.com

QQ | ( 鲁ICP备14021824号-2)|Мапа сайту

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

Швидка відповідьПовернутися до початкуПовернутися до списку