架构师_程序员_码农网

사용자 이름 비밀번호 검색
등록하기

QQ登录

시작하기 위한 한 단계

검색
架构师_程序员_码农网 " 架构师 ' 管理专区&管理 영역 ' 불만 및 제안 ' 回收站 ' 爱奇艺广播器之去广告分析
조회수:5980|댓글: 3
打印 上一主题 下一主题

아이키 플레이어의 광고 분석!

[링크 복사]
직접 리프트 跳转到指定楼层
건물 소유주
게시됨 : 2014-10-23 22:26:53|작성자만 보기回帖奖励| 역방향찾아보기| 읽기 모드

최근 블라인드 폴딩에 적합한 학교의 개교로 바쁜 -이 이틀 동안 바쁜 비디오 광고 제로, 광고가 점점 더 홍수를 겪고 있다고 말하면서 일부 비디오 오프닝 광고는 60 대 이상입니다. 그는 소후 광고를 없앴지만 아치이 광고를 없앨 수 없었습니다. 제가 찾아볼게요.

소스 코드는 그가 준 것인데 저는 swf 디컴파일러가 없어요.

swf 디컴파일러가 없어서 구조만 봤을 뿐 액션스크립트를 배우지 않았어요. 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.*라는 이름이 눈에 띄는데, 구성 정보를 살펴보세요. 두 개의 파일, 즉 플래시변수설정.as와 시스템설정.as가 있습니다. 시스템설정.as에는 흥미로운 내용이 표시되지 않지만 플래시변수설정.as에 참조된 xml 설정 파일은 조사해 볼 가치가 있습니다.

  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가 존재하지 않는 광고, 즉 플레이어의 세션에서 사용자 정보를 얻으면 웹 사이트에서 사용자 정보를 얻는 데 사용하고, 즉 플레이어의 세션에서 사용자 정보를 얻으면 웹 사이트에서 사용자 정보를 얻는 데 사용할 것입니다. 즉, 플레이어가 웹 사이트에서 사용자 정보를 가져온 후 웹 사이트의 세션에서 사용자 정보를 변경하고 VIP인지 여부를 판단하는 곳에서 변경하여 하위 계층을 호출하게하면 VIP라고 잘못 생각하게됩니다 (광고 플레이어 만 VIP라고 생각하고 다른 곳은 영향을받지 않음). 그러니 계속 위쪽을 살펴 보겠습니다. 광고 플러그인의 디렉토리로 돌아가서 광고 플러그인을 찾았습니다. com\qiyi\player\wonder\plugins\ad\view의 ADView.as에서 헤더는 먼저 다음과 같습니다.

  1. private var _adPlayer:CupidAdPlayer;
코드 복사

adPlayer라는 이름의 CupidAdPlayer 인스턴스를 한 번 정의하고 아래로 스크롤하여 _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
코드 복사하기

여전히 매개변수를 전달할 수 있다는 것은 여전히 호출되고 있다는 뜻입니다. 마침내 com\qiyi\player\wonder\plugins\ad\view 아래의 ADViewMediator.as에서 소스를 찾았습니다. 함수에 대한 최종 호출은 다음과 같습니다.

  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");
코드 복사

이러한 방식으로 16 진수에서 라인을 수정하여 테스트 광고가 성공적으로 제거되었습니다 (Chrome의 플러그인 기능을 사용하여 로컬의 플레이어 주소를 수정하고 전달할 동일한 매개 변수를 재생하십시오).

또한 com\qiyi\cupid\adplayer\model 아래의 AdBlockedBlackScreen.as에는 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로 변경하기만 하면 됩니다.






이전 기사Win7의 동결 복원 마법사 7.5 대체 균열
다음 : VMware 가상 머신 설치 MAC OSX 마운틴 라이온
실습 과정에서만 게시된 코드 파머 네트워크는 다른 사람들을 오도하는 것이 아니라 기술적 어려움을 겪었습니다.
팬이신지 잘 모르겠습니다.
내가 할 수 있을지 잘 모르겠습니다.
2014-10-23 23:25:57에 게시됨|작성자만 보기
샤오 닝지는 너무 위대하다
코드 파머 네트워크는 연습 과정에서만 게시되었으며 기술적 인 어려움이 발생했으며 다른 사람들을 오도하지 마십시오.
Bench
게시일 : 2014-10-24 21:57:25|작성자만 보기
이 광고 차단용 플러그인은 나쁘지 않습니다.

평가

참가자 1 MB +1 기여 +1 이유버리기
관리자 + 1 + 1 매우 강력합니다!

모든 평가 보기

연습 과정에서만 게시 된 코드 파머 네트워크는 기술적 인 어려움에 직면했으며 다른 사람들을 오도하지 마십시오.
마루판
소유자| 发表于 2014-10-24 22:01:44|只看该作者
에 의해 게시 됨 스카이 라이터 2014-10-24 21:57
광고를 차단하는이 플러그인은 나쁘지 않습니다

애드블록 플러스는 파이어폭스, 크롬, 오페라, 사파리, 안드로이드, 인터넷 익스플로러 브라우저에서 사용할 수 있는 가장 인기 있는 광고 필터링 소프트웨어입니다. 성가신 온라인 광고를 모두 필터링하세요: 유튜브에서 동영상 광고 제거, 페이스북 광고 필터링, 팝업 광고 제거 등 다양한 기능을 제공합니다. 구글 크롬에서 애드블록 플러스는 가장 빠르게 성장하는 플러그인 중 하나입니다.
연습 과정에서만 게시 된 CodeFarmer.com은 기술적 인 어려움에 직면했으며 다른 사람들을 오도하지 마십시오.
로그인해야 다시 게시할 수 있습니다 로그인하기 | 등록하기

이 버전의 통합 규칙 댓글 달기


면책 조항: 코드 파머 네트워크에서 제공하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 연구 및 조사 목적으로만 제한되며, 위의 내용을 상업적 또는 불법적인 목적으로 사용해서는 안 되며, 그렇지 않을 경우 모든 결과는 사용자의 책임입니다. 코드파머 네트워크의 사이트 정보, 저작권 분쟁은 본 사이트와 무관합니다. 다운로드 후 24시간 이내에 컴퓨터에서 위의 콘텐츠를 완전히 삭제해야 합니다. 프로그램이 마음에 들면 정품 소프트웨어를 지원하고 등록을 구매하여 더 나은 정품 서비스를 받으십시오. 침해가 있는 경우 이메일로 연락하여 처리해 주시기 바랍니다.

메일 To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|사이트맵

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

빠른 답글맨 위로 돌아가기목록으로 돌아가기