|
Πρόσφατα απασχολημένος με το άνοιγμα του σχολείου κατάλληλο για τυφλή αναδίπλωση - αυτές τις δύο ημέρες Μηδέν απασχολημένος διαφημίσεις βίντεο, είπε ότι οι διαφημίσεις παίρνουν όλο και περισσότερο πλημμυρίσει, μερικές από τις διαφημίσεις βίντεο άνοιγμα είναι περισσότερο από 60s. Ξεφορτώθηκε τις διαφημίσεις για το Sohu, αλλά δεν μπόρεσε να ξεφορτωθεί τις διαφημίσεις για το Aqiyi. Επιτρέψτε μου να τον βοηθήσω να κοιτάξει. Ο πηγαίος κώδικας είναι αυτό που μου έδωσε, δεν έχω αποσυμπιεστή swf. Δεν είχα αποσυμπιεστή swf. Μάλλον κοίταξα τη δομή και δεν έχω μάθει ActionScript. Είπε ότι είναι παρόμοια με τη Java, οπότε δεν μπαίνω στον κόπο να κοιτάξω τη βασική σύνταξη και πάω κατευθείαν σε αυτήν. Ας δούμε πρώτα την επικεφαλίδα του κύριου αρχείου Player.as, και ας δούμε τι αναφορές υπάρχουν εκεί. - 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.*;
Αντιγράψτε τον κώδικα Κοιτάξτε το όνομα, com.qiyi.player.wonder.common.config.*; τράβηξε την προσοχή μου - κοιτάξτε τις πληροφορίες διαμόρφωσης. Υπάρχουν δύο αρχεία, το FlashVarConfig.as και το SystemConfig.as. Το SystemConfig.as δεν δείχνει τίποτα ενδιαφέρον, αλλά το αρχείο διαμόρφωσης xml που αναφέρεται στο FlashVarConfig.as αξίζει να το ερευνήσετε. - 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 = "";
Αντιγράφοντας τον κώδικα Στη γραμμή 31, αυτό το αρχείο ρυθμίσεων έχει αυτή την παράγραφο. Και στη γραμμή 35 της διεύθυνσης διαφήμισης τράβηξε επίσης την προσοχή μου, αργότερα στην ανάλυση. Ρίξτε πρώτα μια ματιά στο αρχείο ρυθμίσεων. - </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>
Αντιγράψτε τον κώδικα Λέει ότι πρόκειται για μια διαφήμιση εντός της προβολής με διάρκεια 8 δευτερολέπτων, πράγμα που σημαίνει ότι την εντόπισα και έκανα αεροπειρατεία στο πρόγραμμα περιήγησης για να αφαιρέσω τις διαφημίσεις, αλλά είναι σαφές ότι δεν πρόκειται για διαφήμιση πριν από τη φόρτωση του βίντεο. Συνεχίστε να γυρνάτε - πολύ βαρετή διαδικασία. Βρείτε ποιος καλεί την get adPlayerURL() και κοιτάξτε προς τα πάνω. Κάτω από το com\qiyi\player\wonder\plugins\ad, βρήκα ότι το ad player υπάρχει με τη μορφή ενός plugin, δηλαδή υπάρχει ακόμα μια κλήση, κοιτάζοντας προς τα πάνω, βρήκα ότι στο com\qiyi\cupid\adplayer\CupidAdPlayer.as αρχικοποιείται το CupidAdPlayer. Και η κλάση είναι συσκοτισμένη, κάτι που είναι ύποπτο. - 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
Αντιγράψτε τον κώδικα CupidAdPlayer(param1:CupidParam) <- κοιτάξτε τις παραμέτρους κλήσης του, δηλαδή το ανώτερο στρώμα εξακολουθεί να καλεί, η οποία παράμετρος μία, μια τιμή είναι πολύ αξιοσημείωτη, vipRight Κρίνει αν είναι vip, και vip δεν υπάρχουν διαφημίσεις, δηλαδή, αν πάρω τις πληροφορίες χρήστη στη σύνοδο στον παίκτη, θα τις χρησιμοποιήσω για να πάρω τις πληροφορίες χρήστη στον ιστότοπο, δηλαδή, αν πάρω τις πληροφορίες χρήστη στη σύνοδο στον παίκτη, θα τις χρησιμοποιήσω για να πάρω τις πληροφορίες χρήστη στον ιστότοπο. Δηλαδή, αν κάνω μια αλλαγή στις πληροφορίες χρήστη στη σύνοδο του ιστότοπου αφού ο παίκτης του πάρει τις πληροφορίες χρήστη στον ιστότοπο, και κάνω μια αλλαγή στη θέση που κρίνει αν είναι vip ή όχι, η οποία θα προκαλέσει την κλήση του κατώτερου στρώματος, θα θεωρηθεί λανθασμένα ότι είναι vip (μόνο ο παίκτης της διαφήμισης νομίζει ότι είστε vip, και τα άλλα μέρη δεν θα επηρεαστούν). Ας συνεχίσουμε λοιπόν να κοιτάμε προς τα πάνω. Ψάχνοντας για αυτό, επιστρέψαμε στον κατάλογο του διαφημιστικού plugin. com\qiyi\player\wonder\plugins\ad\view στο ADView.as, η επικεφαλίδα πρώτα είναι - private var _adPlayer:CupidAdPlayer;
Αντιγραφή κώδικα Ορίσαμε μια φορά μια περίπτωση του CupidAdPlayer με το όνομα _adPlayer, κάναμε κύλιση προς τα κάτω για να βρούμε ποιος χρησιμοποιεί το _adPlayer. βρήκαμε εκπληκτικά τη λειτουργία δημιουργίας του παίκτη διαφημίσεων. - 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
Αντιγράφοντας τον κώδικα Βλέποντας ότι μπορείτε ακόμα να περάσετε παραμέτρους σημαίνει ότι εξακολουθεί να καλείται. Τελικά βρήκα την πηγή στο ADViewMediator.as κάτω από το com\qiyi\player\wonder\plugins\ad\ad\view. Η τελική κλήση της συνάρτησης του μοιάζει ως εξής - 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
Αντιγραφή κώδικα Το σημείο κλειδί βρίσκεται στο - _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Αντιγραφή κώδικα Αυτή η γραμμή, για να καθορίσει αν ο χρήστης είναι vip ή όχι, πρώτα σύμφωνα με την τοπική μεταβλητή loc_2 για να καθορίσει το επίπεδο του χρήστη, αν με τον ορισμό του επιπέδου vip, επιστρέφει 1. Του δίνουμε μια μικρή τροποποίηση, γίνεται ψευδο-vip. - _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Αντιγράψτε τον κώδικα Με αυτόν τον τρόπο στο Hex για να τροποποιήσετε τη γραμμή, οι διαφημίσεις δοκιμής αφαιρούνται με επιτυχία (χρησιμοποιώντας τη λειτουργία plug-in του Chrome, τροποποιήστε τη διεύθυνση του παίκτη για το τοπικό, παίζουν τις ίδιες παραμέτρους για να περάσει). Επιπλέον, στο AdBlockedBlackScreen.as κάτω από το com\qiyi\cupid\adplayer\model, υπάρχει μια τοπική λειτουργία ανίχνευσης για την απαγόρευση του αποκλεισμού του plug-in του 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
Αντιγράψτε τον κώδικα Απλά αλλάξτε την επιστροφή της δεύτερης if σε false.
|