flash 与分解 分解百度MP3图片墙

               

 打开这个百度MP3网站 http://mp3.baidu.com/ 下面可以看到一个flash相关的图片墙,这个图片墙能够显示歌手或者其他活动的信息,是一个实用的flash。flash显示了歌手的信息,当鼠标滚动的时候能够显示出相应的图片信息。

 

 

 我们采用捕捉swf的软件,可以轻松下载这个flash,然后使用一下flash分解软件就能够看到内部相应的情况,但是一般来讲flash分解后能够正常显示是一个很不错的结果,不过大部分flash分解后的flash 源文件都很多错误,编译之后,依旧需要进行排错和纠正。

 接下来就是进行排错了,破解出来的源码,变量名的显示都不是原本的含义,尽管有时候能够编译通,不过看起来十分吃力,违背了原来的含义。(变量名变化,颜色值会变化,参数会变化等等)

   经过一些简单处理工作后,得到了下面的源码。这个源码值得学习的是数据的交互。本身的swf只是一个数据的容器,为了能够获取到数据,那么swf需要到浏览器里面进行获取数据。

 

  关于这个flash 是如何获取数据? 其实这个分解后的flash是采用js结合方式返回一个xml数据的,不需要额外建一个xml的数据文件,大大方便了数据读取。

 

       flash----->js  ,flash获取js返回的xml数据。

 

 破解后的flash 主要有两个类,一个是PhotoItem.as(用于显示图片) ,另外一个是PhotoWall.as 文件(主文件),其他的是缓冲的类,借助两个类就实现这种图片墙的效果。

 

 好,现在粘贴经过改过后的flash类库可以运行。有兴趣可以尝试这种分解玩意,过程非常有趣。可以学习一下数据交互。

当中import laan.smart.tween.* 这个类库可以采用Tweener类来替代。

 

 

package { import flash.events.*; import flash.display.*; import flash.text.*; import laan.smart.tween.*; import flash.external.*; import flash.geom.*; import flash.filters.*; import flash.net.*; public class PhotoItem extends Sprite {  private var border:Sprite;  private var _imageURL:String;  private var detail:Sprite;  private var _index:uint;  private var _link:String;  private var image:Loader;  private var detailText:TextField;  public function PhotoItem(index:uint)  {   var matrix:Matrix;   var array:Array;   super();   this._index=index;   this.image=new Loader();   this.image.mouseEnabled=false;   this.image.mouseChildren=false;   this.image.contentLoaderInfo.addEventListener(Event.COMPLETE,this.loaderEventsHandler);   this.image.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,this.loaderEventsHandler);   this.image.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,this.loaderEventsHandler);   this.image.alpha=0.8;   addChild(this.image);   this.border=new Sprite  ;   this.border.mouseEnabled=false;   matrix=new Matrix();   matrix.createGradientBox(100,100,Math.PI / 2);   array=index < 9?[5996250,2837153]:[10116316,7744417];   this.border.graphics.beginGradientFill(GradientType.LINEAR, array, [1, 1], [0, 0xFF], matrix);   this.border.graphics.drawRect(0,0,100,100);   this.border.graphics.drawRect(4,4,92,92);   this.border.graphics.endFill();   this.border.visible=false;   this.border.alpha=1;   addChild(this.border);   this.detail=new Sprite();   this.detail.mouseEnabled=false;   this.detail.mouseChildren=false;   matrix=new Matrix();   matrix.createGradientBox(160,100,Math.PI / 2);   array=index < 9?[5996250,2837153]:[10116316,7744417];   this.detail.graphics.beginGradientFill(GradientType.LINEAR, array, [1, 1], [0, 0xFF], matrix);   this.detail.graphics.drawRect(0,0,160,100);   this.detail.graphics.endFill();   this.detail.visible=false;   addChild(this.detail);   this.detailText=new TextField();   this.detailText.textColor=0xFFFFFF;   this.detailText.x=this.detailText.y=5;   this.detailText.width=this.detail.width - 10;   this.detailText.height=this.detail.height - 10;   this.detailText.multiline=true;   this.detailText.wordWrap=true;   this.detailText.filters=[new DropShadowFilter(0,0,0,0)];   this.detail.addChild(this.detailText);      var rect:Sprite=new Sprite();   rect.graphics.beginFill(0xFF0000,0);   rect.graphics.drawRect(0,0,100,100);   rect.buttonMode=true;   addChild(rect);   rect.addEventListener(MouseEvent.MOUSE_OVER,this.mouseEventsHandler);   rect.addEventListener(MouseEvent.MOUSE_OUT,this.mouseEventsHandler);   rect.addEventListener(MouseEvent.CLICK,this.mouseEventsHandler);  }    //设置文本框提示信息  public function setDetailText(title:String,content:String):void  {   this.detailText.htmlText="" + title + "
" + content;  }  private function loaderEventsHandler(event:Event):void  {   if (event.type == Event.COMPLETE)   {    this.image.width=this.image.height=100;   }  }    //加载图片的链接  public function set imageURL(url:String):void  {   if (this._imageURL != url)   {    this._imageURL=url;    this.image.load(new URLRequest(this._imageURL));   }  }    //鼠标事件处理  private function mouseEventsHandler(event:MouseEvent):void  {   //var event:* =event;   switch (event.type)   {    case MouseEvent.MOUSE_OVER :     this.image.alpha=1;     if (this.detailText.text)     {      this.border.visible=true;      parent.setChildIndex(this,parent.numChildren - 1);      this.detail.x=this.image.x + 100;      if (stage.stageWidth < x + this.detail.x + this.detail.width)      {       this.detail.x=this.image.x - this.detail.width;      }      this.detail.visible=true;      this.detail.alpha=0;      Tweener.addTween(this.detail,0.2,{alpha:1,delay:0.5});     }     break;    case MouseEvent.MOUSE_OUT :     this.image.alpha=0.8;     this.border.visible=false;     Tweener.removeAllTween(false);     this.detail.visible=false;     break;    case MouseEvent.CLICK :     try     {      ExternalInterface.call("onItemClick",this._index);      if (ExternalInterface.objectID)      {       ExternalInterface.call("window.open",this._link);       return;      }     }     catch (e:Error)     {     }     navigateToURL(new URLRequest(this._link),"_blank");     break;   }  }    //链接  public function set link(link:String):void  {   this._link=link;  } }}//package

 

 

package { import flash.events.*; import flash.display.*; import flash.external.*; public class PhotoWall extends Sprite {  public function PhotoWall()  {   stage.scaleMode=StageScaleMode.EXACT_FIT;   addEventListener(Event.ENTER_FRAME,this.enterFrameHandler);  }    //分析数据  private function analyseData(data:String):void  {   var xml:XML =null;   var index:int =0;   var list:* =null;   var item:PhotoItem =null;   var value:* =data;   try   {    xml=new XML(value);    index=0;    for each (list in xml.list)    {     //图片进行矩阵分布     item=new PhotoItem(index);     item.x=index % 9 * 100 + 2;     item.y=uint(index / 9) * 100 + 2;     item.link=String(list.@u);//点击图片超链接     item.imageURL=String(list.@p);//图片图片墙     if (index % 9 != 8)     {      item.setDetailText(String(list.id),String(list.c));//对图片描述     }     addChild(item);     index=index + 1;    }   }   catch (e:Error)   {   }  }  private function enterFrameHandler(event:Event):void  {   var data:String;   if (ExternalInterface.available)   {    data=ExternalInterface.call("getPhotoWallData");    if (data)    {     this.analyseData(data);     removeEventListener(Event.ENTER_FRAME,this.enterFrameHandler);    }   }   else   {    removeEventListener(Event.ENTER_FRAME,this.enterFrameHandler);   }  } }}//package

 

 

 

使用这个类 还不行的,因为要获取到网页当中的js 返回的xml 数据,所以我们通过查看网页的js文件可以发现到数据的来源。

 

data=ExternalInterface.call("getPhotoWallData"); 通过这个函数返回字符串信息内容,这样经过分析后,内容就能够正常显示了。

不妨试试玩一下。

 

最后,把编译出来的swf 和html放在一起,为了能够显示信息,顺便查看百度网页的里面的js文件,把js文件添加到生成的html文件当中,这样就能够显示图片的信息了 。

 

"+  */ }; function GenFlash(idad, swfurl, wad, had, vs){var str = "";str += "";str += "";str += "";str += "";str += "";str += "";str += "";return str;}function onItemClick(e){ClickMonkey.log('wall_'+(e+1));}var ClickMonkey=(function(){var B="http://nsclick.baidu.com/h.gif?pid=106&v=mp3-index",$="bd_clickmonkey",C=function(C){var _=(new Date()).getTime(),D=window[$+_]=new Image(),A="";for(var E in C)A+=("&"+E+"="+C[E]);D.src=B+"&r="+_+A;D.D.function(){D=null}},E="",A=function($,C){C=C||[];E=$.monkey||$.getAttribute("monkey")||E;if($.parentNode&&$.parentNode.tagName.toUpperCase()!="BODY")C=A($.parentNode,C);if($.previousSibling){var _=1,B=$.previousSibling;do{if(B.nodeType==1&&B.nodeName==$.nodeName)_++;B=B.previousSibling}while(B)}if($.nodeType==1)C.push($.nodeName.toLowerCase()+(_>1?_:""));return C},D=function(_,C,B,$){if(_.addEventListener){_.addEventListener(C,B,$);return true}else if(_.attachEvent){var A=_.attachEvent("on"+C,B);return A}},F=function($){return encodeURIComponent($)};D(document.body,"mousedown",function($){var $=window.event||$,_=$.srcElement||$.target;if(_.tagName.toUpperCase()!="A")if(_.parentNode.tagName.toUpperCase()=="A")_=_.parentNode;else if(!(_.tagName.toUpperCase()=="INPUT"&&(_.type.toLowerCase()=="checkbox"||_.type.toLowerCase()=="radio")))return;E="";var D=A(_).join("-"),B={xp:D},G=_.getAttribute("href",2);if(G&&!(/^javascript|#/.test(G)))B.objurl=F(G);else B.objurl="none";if(_.innerHTML&&!(/^s*s*$/i.test(_.innerHTML)))B.title=F(_.innerHTML);else B.title="none";if(E)B.monkey=E;if(E=="randL"||E=="ecom")B.objurl=B.title="none";C(B)});var _=function(_,$,A){var B={xp:"_"+_+"_"};if($)B.objurl=F($);else B.objurl="none";if(A)B.title=F(A);else B.title="none";C(B)};return{log:_}})();(function(){var v = window.setInterval(showWall,500);function showWall(){  if((document.documentElement.clientHeight+(document.documentElement.scrollTop||document.body.scrollTop)) > 1270){  document.getElementById('wallwp').innerHTML = GenFlash("big_hier", "http://imgs.zhangmen.baidu.com/mp3index/2010/img/PhotoWall.swf", 966, 213, "jsm=onItemClick") ; window.clearInterval(v);}}})();void function(){ var as = document.getElementsByTagName("a"); for(var i = 0, l = as.length; i < l; i ++)  if(!as[i].href.indexOf("http://mp3.baidu.com/singerlist/"))   as[i].href = as[i].href.replace(/(/x20|%20)+/g, " " );}();var UA2Config = {  "id": "mp3-index",  "action": "http://imgs.zhangmen.baidu.com/wd/",  "rate": 100 };// -->

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

你可能感兴趣的:(flash 与分解 分解百度MP3图片墙)