架构师_程序员_码农网

N Recuperar palavra-passe
Registar

QQ登录

Apenas um passo para começar

Pesquisar
Visualizações:5980|Repostas: 3
打印 上一主题 下一主题

A análise dos anúncios do jogador de Aiki!

[copy link]
E 跳转到指定楼层
o proprietário do edifício
发表于 2014-10-23 22:26:53|只看该作者回帖奖励|ReverseBrowse|Read Mode

Recentemente ocupado com a abertura da escola adequada para dobrar cegos - estes dois dias Zero anúncios de vídeo ocupados, disse que os anúncios estão a ficar cada vez mais inundados, alguns dos anúncios de abertura de vídeo são mais de 60s. Ele livrou-se dos anúncios do Sohu, mas ainda não conseguiu livrar-se dos anúncios do Aqiyi. Eu ajudo-o a procurar.

O código fonte foi o que ele me deu, não tenho um descompilador de swf.

Eu não tinha um descompilador de swf, provavelmente olhei para a estrutura e não aprendi ActionScript. Ele disse que é semelhante ao Java, por isso não me dou ao trabalho de ver a sintaxe básica e vou direto ao assunto. Vamos ver primeiro o cabeçalho do ficheiro principal Player.as e ver que referências existem.

  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.*;
Copie o código

Olha para o nome, com.qiyi.player.wonder.common.config.*; chamou-me a atenção - olha para a informação de configuração. Existem dois ficheiros, FlashVarConfig.as e SystemConfig.as. SystemConfig.as não mostra nada de interessante, mas vale a pena investigar o ficheiro de configuração xml referenciado em 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 = "";
Copiando o código

Na linha 31, este ficheiro de configuração tem este parágrafo. E na linha 35 do endereço do anúncio também me chamou a atenção, mais adiante na análise. Primeiro, veja o ficheiro de configuração.

  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>
Copiar o código

Diz que é um anúncio in-show com 8s de duração, o que significa que o localizei e sequestrei o browser para remover os anúncios, mas é evidente que não se trata de um anúncio antes do vídeo carregar. Continue a folhear - processo muito aborrecido.

Descobre quem chama get adPlayerURL() e olha para cima. Em com\qiyi\player\wonder\plugins\ad, descobri que o ad player existe na forma de um plugin, ou seja, ainda há uma chamada, olhando para cima, descobri que em com\qiyi\cupid\adplayer\CupidAdPlayer.as CupidAdPlayer é inicializado. E a classe está ofuscada, o que é suspeito.

  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
Copie o código

CupidAdPlayer(param1:CupidParam) <- olha os parâmetros de chamada dele, ou seja, a camada superior ainda está chamando, qual o parâmetro um, um valor é bem percetível, vipDireito Julgar se é vip, e vip não existe ads, ou seja, se eu pegar as informações do usuário na sessão no player, eu vou usar para pegar as informações do usuário no site, ou seja, se eu pegar as informações do usuário na sessão no player, eu vou usar para pegar as informações do usuário no site. Ou seja, se eu fizer uma alteração na informação do utilizador na sessão do sítio Web depois de o seu leitor obter a informação do utilizador no sítio Web, e fizer uma alteração no local de julgamento se é um vip ou não, o que fará com que a camada inferior seja chamada, pensar-se-á erradamente que é um vip (apenas o leitor de anúncios pensa que é um vip, e os outros locais não serão afectados). Por isso, vamos continuar a olhar para cima. Procurando por ele, voltamos ao diretório do plugin de propaganda. com\qiyi\player\wonder\plugins\ad\view no ADView.as, o cabeçalho primeiro é

  1. private var _adPlayer:CupidAdPlayer;
Código de cópia

Definiu uma instância de CupidAdPlayer chamada _adPlayer uma vez, rolou para baixo para descobrir quem usa _adPlayer. surpreendentemente encontrou a função de criação do jogador de anúncios.

  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
Copiar o código

Ver que ainda é possível passar parâmetros significa que a função ainda está a ser chamada. Finalmente encontrei o código fonte no ADViewMediator.as em com\qiyi\player\wonder\plugins\ad\view. A chamada final para a função dele é assim

  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
Código de cópia

O ponto chave está no

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("0");
Copiar código

Esta linha, para determinar se o utilizador é um vip ou não, primeiro de acordo com a variável local loc_2 para determinar o nível do utilizador, se com a definição do nível vip, retorna 1. Damos-lhe uma ligeira modificação, torna-se um pseudo-vip.

  1. _loc_3.vipRight = _loc_2.userLevel != UserDef.USER_LEVEL_NORMAL ? ("1") : ("1");
Copiar o código

Desta forma, no Hex para modificar a linha, testar os anúncios removidos com sucesso (utilizando a função de plug-in do Chrome, modificar o endereço do leitor para o local, reproduzir os mesmos parâmetros para passar).

Além disso, no AdBlockedBlackScreen.as em com\qiyi\cupid\adplayer\model, existe uma função de deteção local para proibir o bloqueio de plug-in do 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
Copie o código

Basta alterar o retorno do segundo if para false.






Artigo anteriorFreeze Restore Wizard 7.5 Alternative Crack in Win7
Próximo: Instalação da máquina virtual VMware MAC OSX Mountain Lion
Código da rede Farmer, só publicado no processo de prática, encontrou dificuldades técnicas, não induzir outros em erro.
Não sei se és fã disto.
Não tenho a certeza se vou ser capaz de o fazer.
发表于 2014-10-23 23:25:57|只看该作者
Xiao Ningzi é tão bom
A rede de agricultores de código, publicada apenas no processo de prática, encontrou dificuldades técnicas, não engane os outros.
Banco
发表于 2014-10-24 21:57:25|只看该作者
Este plugin para bloquear anúncios não é mau

Classificação

Participantes 1 MB +1 Contribuição +1 GuardarRazão
administrador + 1 + 1 Muito poderoso!

Ver todas as classificações

O código da rede de agricultores, só publicado no processo de prática, encontrou dificuldades técnicas, não enganar os outros.
tábuas de chão
owner|发表于 2014-10-24 22:01:44|只看该作者
Postado por skywriter em 2014-10-24 21:57
Este plugin para bloquear anúncios não é mau

O Adblock Plus é o software de filtragem de anúncios mais popular disponível para os navegadores Firefox, Chrome, Opera, Safari, Android e Internet Explorer. Filtre todos os anúncios online irritantes: remova anúncios de vídeo no Youtube, filtre anúncios do Facebook, livre-se de anúncios pop-up e muito mais. No Google Chrome, o Adblock Plus é um dos plug-ins de crescimento mais rápido.
CodeFarmer.com, publicado apenas no processo de prática, encontrou dificuldades técnicas, não enganar os outros.
Tem de iniciar sessão antes de poder voltar a publicar Iniciar sessão | Registar

E sta versão das regras integrais


DISCLAIMER: Todo o software, materiais de programação ou artigos divulgados pela rede code farmer estão limitados a fins de estudo e investigação; o conteúdo acima não deve ser utilizado para fins comerciais ou ilegais, caso contrário, todas as consequências serão da responsabilidade do utilizador. A informação deste sítio da rede, a disputa de direitos de autor não tem nada a ver com este sítio. O utilizador deve remover completamente o conteúdo acima do seu computador no prazo de 24 horas após a transferência. Se gosta do programa, por favor apoie o software genuíno, compre o registo e obtenha um melhor serviço genuíno. Se houver alguma infração, contacte-nos por correio eletrónico para tratarmos do assunto.

Correio eletrónico To:help@itsvse.com

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

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

Resposta rápidaVoltar ao topoVoltar à lista