|
Récemment, j’ai été occupé avec la rentrée scolaire et il est approprié de lancer à l’aveugle – ces deux derniers jours, Zero a été occupé avec des vidéos pour faire de la publicité, et on dit que les publicités deviennent de plus en plus fréquentes, et que certaines vidéos sont ouvertes depuis plus de 60 ans. Il a retiré Sohu, mais celle d’iQiyi n’a jamais été faite. Laisse-moi l’aider à regarder. Le code source m’a été donné par lui, je n’ai pas de décompilateur SWF. Probablement en regardant la structure, je n’ai pas appris ActionScript. Il a dit que c’était similaire à Java, donc je n’ai pas pris la peine de regarder la syntaxe de base, alors je suis allé directement au but. Jetons un œil à la tête du fichier principal Player.as voir quelles citations il y a. - import com.iqiyi.components.global.*;
- import com.iqiyi.components.tooltip.*;
- import com.qiyi.player.base.pub.*;
- import com.qiyi.player.base.uuid.*;
- import com.qiyi.player.core.*;
- import com.qiyi.player.core.model.def.*;
- import com.qiyi.player.core.model.utils.*;
- import com.qiyi.player.wonder.*;
- import com.qiyi.player.wonder.body.view.*;
- import com.qiyi.player.wonder.common.config.*;
- import com.qiyi.player.wonder.common.lso.*;
- import com.qiyi.player.wonder.common.pingback.*;
- import com.qiyi.player.wonder.common.sw.*;
- import flash.display.*;
- import flash.events.*;
- import flash.media.*;
- import flash.system.*;
- import flash.utils.*;
Code de copieRegardez le nom pour en connaître la signification, com.qiyi.player.wonder.common.config.* ; Ça attire mon attention – regardez les informations de configuration. Les deux documents FlashVarConfig.as et SystemConfig.as. SystemConfig.as n’ai rien trouvé de visible, mais le fichier de configuration XML référencé dans le FlashVarConfig.as vaut le coup d’œil. - package com.qiyi.player.wonder.common.config
- {
- public class FlashVarConfig extends Object
- {
- public static const OWNER_PAGE:String = "page";
- public static const OWNER_CLIENT:String = "client";
- public static const OS_XP:String = "xp";
- public static const OS_WIN7:String = "win7";
- public static const OS_WIN8:String = "win8";
- public static const PAGE_OPEN_SRC_NONE:String = "0";
- public static const PAGE_OPEN_SRC_DIRECT:String = "1";
- public static const PAGE_OPEN_SRC_OTHER:String = "2";
- private static var _flashVarSource:Object;
- private static var _albumId:String = "";
- private static var _tvid:String = "0";
- private static var _vid:String = "";
- private static var _autoPlay:Boolean = true;
- private static var _isMemberMovie:Boolean = false;
- private static var _cyclePlay:Boolean = false;
- private static var _components:String = "fefff7e6";
- private static var _cupId:String = "";
- private static var _shareStartTime:int = -1;
- private static var _shareEndTime:int = -1;
- private static var _preloaderURL:String = "http://dispatcher.video.qiyi.com/dispn/player/preloader.swf";
- private static var _preloaderVipURL:String = "";
- private static var _exclusivePreloader:String = "";
- private static var _useGPU:Boolean = true;
- private static var _showBrand:Boolean = true;
- private static var _expandState:Boolean = false;
- private static var _tipDataURL:String = "http://static.qiyi.com/ext/tips/tipdata.xml";
- private static var _coop:String = "";
- private static var _owner:String = "page";
- private static var _os:String = "win7";
- private static var _adPlayerURL:String = "";
- private static var _origin:String = "";
- private static var _passportID:String = "";
- private static var _playListID:String = "";
Code de copieÀ la ligne 31, ce fichier de configuration contient ce passage. Et l’adresse publicitaire à la ligne 35 a également attiré mon attention, que j’analyserai plus tard. Regardons d’abord le fichier de configuration. - </item>
- <!-- 正在为您播放片中广告, 可选择是否要跳过, 类别是1, 持续时间是8秒 -->
- <!-- 限制条件是: 不是正在登录中的会员 -->
- <!-- 每天每人次只最多显示两次这个tips -->
- <item id="ToSelectWhetherToSkipPlayingMiddleAD" level="1" duration="-1" type="1">
- <conditions>
- <fields>
- <field name="member" operator="eq" value="false"/>
- </fields>
- <frequency count="2">
- <restrain name="day"/>
- <restrain name="user"/>
- </frequency>
- </conditions>
- <list>
- <message>
- <![CDATA[
- 正在为您播放片中广告, <a href="event:ASEvent(skipAD)"><b><u>跳过广告</u></b></a>
- ]]>
- </message>
- </list>
- </item>
- <!-- 提示即将跳过8秒后会显示的剧中广告, 类别是1, 持续时间是8秒 -->
- <!-- 必须是登录的会员 -->
- <item id="ToCancelSkipNextMiddleAD" level="1" duration="8" type="1">
- <conditions>
- <fields>
- <field name="member" operator="eq" value="true"/>
- </fields>
- <frequency count="1">
- <restrain name="day"/>
- <restrain name="user"/>
- </frequency>
- </conditions>
- <list>
- <message>
- <![CDATA[
- 即将为您跳过片中广告,<a href="event:ASEvent(cancelSkipAD)"><u>不再跳过</u></a>
- ]]>
- </message>
- </list>
- </item>
- <!--
- 提示版权下线, 如果还有小于7天的时间下线, 每天一个专辑一台电脑提醒一次, 类别是1, 从起始60秒开始显示, 持续时间是10秒
- -->
- <!-- 因为优先级很高, 前面的最高优先级是10, 所以这里把level设为11. -->
- <!-- 这个tip是由signal发起的. Shawn.X -->
- <!--
- 《<span>#keyword#</span>》 将于 <span>#expiredTime#</span> 版权到期.
- -->
- <item id="NoticeThisCopyrightWillExpire" level="11" duration="10" type="1">
- <conditions>
Code de copieOn dit que c’est une publicité dans la pièce de jeu, en temps de 8 secondes, c’est-à-dire que je la localise, puis je détourne le navigateur pour obtenir des publicités, mais il est évident que ce n’est pas une publicité avant que la vidéo ne se charge. Continuer à retourner - un processus très ennuyeux. Trouvez qui a appelé, obtenez adPlayerURL() et cherchez le mot. Sous com\qiyi\player\wonder\plugins\ad, on découvre que le lecteur ad existe sous forme de plug-in, c’est-à-dire qu’il y a un appel, cherchez, trouvez CupidAdPlayer à com\qiyi\cupid\adplayer\CupidAdPlayer.as pour initialiser. Et cette classe est confuse, ce qui est très suspect. - public function CupidAdPlayer(param1:CupidParam)
- {
- this.PLAYER_TIMEOUT_LENGTHS = new Array(10000, 15000);
- Log.info("init, version=" + VERSION + ", " + param1.toString());
- this._videoPlayerVersion = param1.videoPlayerVersion;
- this._videoId = param1.videoId;
- this._tvId = param1.tvId;
- this._channelId = param1.channelId;
- this._collectionId = param1.collectionId;
- this._playerId = param1.playerId;
- this._albumId = param1.albumId;
- this._userId = param1.userId;
- this._webEventId = param1.webEventId;
- this._videoEventId = param1.videoEventId;
- this._vipRight = param1.vipRight;
- this._terminal = param1.terminal;
- this._duration = param1.duration;
- this._passportId = param1.passportId;
- this._passportCookie = param1.passportCookie;
- this._passportKey = param1.passportKey;
- this._videoDefinitionId = param1.videoDefinitionId;
- if (this.isQiyiWebEx())
- {
- this._playerUrl = this.IQIYI_WEBEX_AM_URL;
- }
- else if (param1.playerUrl)
- {
- this._playerUrl = param1.playerUrl;
- }
- else
- {
- this._playerUrl = this.IQIYI_WEB_AM_URL;
- }
- if (param1.dispatcher == null)
- {
- this._dispatcher = this;
- }
- else
- {
- this._dispatcher = param1.dispatcher;
- }
- this._volume = param1.volume;
- this._videoIndex = param1.videoIndex;
- this._stageWidth = param1.stageWidth;
- this._stageHeight = param1.stageHeight;
- this._displayContainer = param1.adContainer;
- this._screenStatus = DisplayProperties.isFullScreen(this._displayContainer.stage) ? ("1") : ("0");
- this._baiduMainVideo = param1.baiduMainVideo;
- this._disablePreroll = param1.disablePreroll;
- this._disableSkipAd = param1.disableSkipAd;
- this._enableVideoCore = param1.enableVideoCore;
- this._isUGC = param1.isUGC;
- this._videoPlayerUrl = this._displayContainer.loaderInfo ? (this._displayContainer.loaderInfo.loaderURL) : ("");
- this._env = this.generateEnv();
- this.addAdPlayerEventListeners();
- return;
- }// end function
Code de copieCupidAdPlayer(param1 :CupidParam) < – Regardez ses paramètres d’appel, c’est-à-dire que la couche supérieure appelle toujours, où le paramètre 1, une valeur attire l’œil, vipRight juge s’il est vip, et VIP n’a pas d’annonce, c’est-à-dire que si je modifie l’endroit où je juge si c’est VIP après avoir obtenu les informations utilisateur lors de la session du site dans son lecteur, ce qui fait appeler le niveau inférieur, Pris pour VIP (juste le joueur publicitaire pense que vous êtes VIP et le reste du monde n’est pas affecté). Alors continuons à chercher vers le haut. J’ai cherché et cherché, puis je suis revenu au catalogue des plugins publicitaires. com\qiyi\player\wonder\plugins\ad\view dans le ADView.as, la tête est la première - private var _adPlayer:CupidAdPlayer;
Code de copieJ’ai défini une instance de CupidAdPlayer nommée _adPlayer, regarde en bas pour voir qui a utilisé _adPlayer. J’ai trouvé la fonction de création de lecteur publicitaire. - public function createAdPlayer(param1:CupidParam) : void
- {
- if (this._adPlayer)
- {
- this.unloadAdPlayer();
- }
- this._log.info("loading adplayer...");
- this._adPlayer = new CupidAdPlayer(param1);
- this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_LOADING_SUCCESS, this.onAdLoadSuccess);
- this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_LOADING_FAILURE, this.onAdLoadFailed);
- this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_START, this.onAdStartPlay);
- this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_PAUSE, this.onAdAskVideoPause);
- this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_RESUME, this.onAdAskVideoResume);
- this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_START_LOADING, this.onAdAskVideoStartLoad);
- this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_START, this.onAdAskVideoStartPlay);
- this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_END, this.onAdAskVideoEnd);
- this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_BLOCK, this.onAdBlock);
- this._adPlayer.addEventListener(AdPlayerEvent.CONTROL_VIDEO_DISPLAY_AD_TIP, this.onAskVideoShowBonusTips);
- this._adPlayer.addEventListener(AdPlayerEvent.ADPLAYER_AD_VIDEO, this.onAdFlvADAction);
- this._adPlayer.load();
- return;
- }// end function
Code de copieJ’ai vu qu’il pouvait aussi passer des paramètres, indiquant qu’il était toujours appelé. J’ai finalement trouvé la source dans le ADViewMediator.as sous com\qiyi\player\wonder\plugins\ad\view. Sa fonction est enfin appelée ainsi - private function createADPlayer() : void
- {
- sendNotification(BodyDef.NOTIFIC_PLAYER_STOP_LOAD);
- ProcessesTimeRecord.STime_adInit = getTimer();
- var _loc_1:* = facade.retrieveProxy(PlayerProxy.NAME) as PlayerProxy;
- var _loc_2:* = facade.retrieveProxy(UserProxy.NAME) as UserProxy;
- var _loc_3:* = new CupidParam();
- _loc_3.playerUrl = FlashVarConfig.adPlayerURL;
- _loc_3.videoId = _loc_1.curActor.loadMovieParams.vid;
- _loc_3.tvId = _loc_1.curActor.loadMovieParams.tvid;
- _loc_3.channelId = _loc_1.curActor.movieModel.channelID;
- _loc_3.playerId = FlashVarConfig.cupId;
- _loc_3.albumId = _loc_1.curActor.movieModel.albumId;
- _loc_3.dispatcher = null;
- _loc_3.adContainer = this._ADView;
- _loc_3.stageWidth = GlobalStage.stage.stageWidth;
- _loc_3.stageHeight = GlobalStage.stage.stageHeight;
- _loc_3.userId = _loc_1.curActor.uuid;
- _loc_3.webEventId = UUIDManager.instance.getWebEventID();
- _loc_3.videoEventId = UUIDManager.instance.getVideoEventID();
- _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
- _loc_3.terminal = "iqiyiw";
- _loc_3.duration = _loc_1.curActor.movieModel.duration / 1000;
- _loc_3.passportId = _loc_2.passportID;
- _loc_3.passportCookie = _loc_2.P00001;
- _loc_3.passportKey = KeyUtils.getPassportKey(0);
- _loc_3.enableVideoCore = true;
- _loc_3.disableSkipAd = _loc_1.curActor.movieModel.forceAD;
- _loc_3.volume = Settings.instance.mute ? (0) : (Settings.instance.volumn);
- _loc_3.isUGC = UGCUtils.isUGC(_loc_1.curActor.movieModel.tvid);
- _loc_3.collectionId = FlashVarConfig.collectionID;
- _loc_3.videoDefinitionId = _loc_1.curActor.movieModel.curDefinitionInfo.type.id;
- _loc_3.videoPlayerVersion = WonderVersion.VERSION_WONDER;
- this._ADView.createAdPlayer(_loc_3);
- return;
- }// end function
Code de copieLe point clé est - _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Code de copieCette phrase détermine si l’utilisateur est un VIP ou non, juge d’abord le niveau de l’utilisateur selon la variable locale loc_2 et retourne 1 s’il correspond au niveau VIP défini. Nous lui avons apporté une légère modification, et il est devenu un pseudo-VIP. - _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Code de copieAinsi, il suffit de la modifier en hexadecimal, et la publicité test est supprimée avec succès (en utilisant la fonction plug-in de Chrome, changer l’adresse du lecteur pour qu’elle soit locale, et passer les paramètres de lecture tels qu’ils sont). De plus, sous com\qiyi\cupid\adplayer\model AdBlockedBlackScreen.as il existe une fonction de détection locale qui interdit le blocage des plug-ins sur Chrome. - public static function isInBlacklist(param1:String) : Boolean
- {
- if (!param1)
- {
- return false;
- }
- if (StringUtils.beginsWith(param1, "chrome-extension://"))
- {
- return true;
- }
- var _loc_2:* = new URLParser(param1);
- var _loc_3:* = _loc_2.getHost();
- return HOST_BLACKLIST.indexOf(_loc_3) != -1;
- }// end function
Code de copieIl suffit de changer le retour de la seconde si en faux.
|