FANSMI音乐下载器原理

用BAIDU来搜索歌曲还是有一定的局限,于是想到了在线听歌,然后把音乐的名字记下来到BAIDU切搜索,但是那样我觉得还是很麻烦~上上上个月,帮朋友做了一个用于读取www.fansmi.com网站上的音乐的真实下载地址的软件,很粗糙的一个!就一个文本输入框,然后输入播放列表的地址後点搜索,就可以把当前播放列表中的歌曲下载地址搞出来。。。。。。不过上个月的时候,她突然给我说用不了了,它娘的难道是还了“汤"?????管求得哦,只要药不换老子就有办法,HOHOHOHOH,再一次操刀抓包工具和记事本(不要小看了它,必要的时候很管用的!!!!)。。。。www.fansmi.com的音乐文件再一次落入我的魔手,哈哈哈哈………………………………………………再然后通过昨天晚上一个通宵的代价,编写了一个专门下载fansmi播放列表中的歌曲文件的软件,欢迎大家下载哦,哈哈哈哈!!!!



1、分析JS代码
    进入播放列表之后,查看源代码。。。。。发现底部有一砣
         Insertsong("M11650/36.wma|Yesterday (Mello Dee Remix)/昨天|舞曲大帝国21|Fans迷音乐网|139841");
         Insertsong("M11650/35.wma|Move Your Body/舞动你的身体|舞曲大帝国21|Fans迷音乐网|139840");
         Insertsong("M11650/28.wma|James Dean (I Wanna Know)/精舞门原曲|舞曲大帝国21|Fans迷音乐网|139838");
         Insertsong("M11650/32.wma|Slice Me (Disco Disco)/迪斯可迪斯可|舞曲大帝国21|Fans迷音乐网|139837");
         Insertsong("M11650/27.wma|Wind It Up/甜蜜开关|舞曲大帝国21|Fans迷音乐网|139836");
         Insertsong("M11650/21.wma|Pieces Of Heaven/天堂一角|舞曲大帝国21|Fans迷音乐网|139835");
    这样的代码,嘿嘿,不用我说了吧?看样子就知道,第一个|之前的是文件名,第二个是歌曲名………………
   

    再往下看,有一个:
         SongList.options[0].selected=true;
         acong_player();
    也明显,是一个自动从第一个列表项开始播放的指令。。用查找功能搜索acong_player()函数,没有搜索到,嘿嘿,那肯定再某个导入的JS文件中啦嘛,哈哈哈,网上看,发现一条<script language="JavaScript" src="/play/PlayUrl_B.js"></script>代码,用浏览器将这个文件下载下来後找到了acong_player()函数,如下:
function acong_player(){
  if(SongList.selectedIndex < 0) alert('系统错误,请选择您要播放的曲目!');
  else{
  var varvar,person,ii,singerarray,go1,go2,collect,song,url,lrcid;
  varvar = SongList.options[SongList.selectedIndex].value.split("|");
  //alert(varvar.length + "\n" + SongList.options[SongList.selectedIndex].value);
  url = varvar[0];song = varvar[1];collect = varvar[2];lrcid = varvar[0].replace(".Wma",".lrc").replace(".wma",".lrc");
  person = varvar[3];SongID = varvar[4];Songi = varvar[4];
  //if(person.length > 5) info_person.innerHTML = person.substr(0,5) + "...";
  //else info_person.innerHTML = person;
  if(collect.length > 6) info_collect.innerHTML = collect.substr(0,6) + "...";
  else info_collect.innerHTML = collect;
  if(song.length > 12) info_song.innerHTML = song.substr(0,8) + "...";
  else info_song.innerHTML = song;

//**************************************************************
var singerarray = singer.split(",");

for(ii=0;ii<singerarray.length;ii++){

  go1 = varvar[2].indexOf(singerarray[ii]);
  go2 = varvar[1].indexOf(singerarray[ii]);

  if(go1>=0) {
    top.location.href = goto;
   return;
  }

  if(go2>=0) {
    top.location.href = goto;
   return;
  }

}//**************************************************************
                document.getElementById('MusicGeCi').style.display='none';
                document.getElementById('lrcPage').height='332px';
                document.getElementById('lrcPage').width='354px';
  MusicGeCi.innerHTML = "<iframe frameBorder=0 allowTransparency=\"true\" width=\"354px\" height=\"312px\" src='/play/geci.aspx?id=" + SongID  + "'>对不起,你的浏览器不支持框架。</iframe><img src=\"/play/hits.aspx?stype=3&id=" + SongID  + "\" border=\"0\" width=\"0\" height=\"0\">";
  lrcPage.location.href="/play/lrc.html?" + lrcid;
                ivrs.innerHTML = "<table width=\"340\"><tr><td width=\"240\">下载<font color=\"#ff7d39\">" + song.substr(0,5) +"</font>到手机</td><td width=\"200\"><iframe width=\"200\" height=\"28\" src=\"http://www.7town.com/Tnsend/mpn60.aspx?style=1&uid=14143&mn="+ song +"&dy=2&a=&b=&c=&d=&e=&f=\" frameborder=\"no\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"No\"></iframe></td></tr></table>";           
                document.title = song + " - "+ collect + " Fans迷音乐网 FansMi.Com";
                Musicsc.innerHTML = "<a title=\"收藏[" + song + "]到音乐盒\" href='/musicscadd.aspx?id=" + SongID + "' target=\"sc\">把此歌曲加到音乐盒</a>";
                //Musicxz.innerHTML = "<A title=\"下载[" + song + "]歌曲\" href='/play/DownLoad.aspx?id="  + song  + "' target=\"xz\">下载此歌曲</FONT></A>";
                ivrloop.innerHTML = "<iframe width=300 height=\"268\" src=\"http://ivrsend.7town.com/Tnivr/mpn.aspx?style=_3&mn=" + song + "&uid=14143&a=&b=&c=&d=&e=&f=&g=\" frameborder=no marginwidth=0 marginheight=0 scrolling=no align=\"center\"></iframe>";
  var wmp2 = document.getElementById('WMP');
  wmp2.FileName = getpath(1)+url; 
                showTLab();
  return;
  }
}

不要觉得代码多就不耐烦了!仔细的看看,起始那么多代码中,对我们有用的就只有: 
var wmp2 = document.getElementById('WMP');
  wmp2.FileName = getpath(1)+url; 
WMP,哈哈哈,不就是windows media player的简写嘛?哈哈哈,然后设置它的播放文件名为getpath(1)的返回值加url,
首先来看一下url是什么:
 var varvar,person,ii,singerarray,go1,go2,collect,song,url,lrcid;
  varvar = SongList.options[SongList.selectedIndex].value.split("|");
  url = varvar[0];song = varvar[1];collect = varvar[2];lrcid = varvar[0].replace(".Wma",".lrc").replace(".wma",".lrc");
看了着些代码能联想到什么吗?对了,这个就是已经取出的Insertsong("M11650/36.wma|Yesterday (Mello Dee Remix)/昨天|舞曲大帝国21|Fans迷音乐网|139841");的每一个|前的字符了。。。其中url变量正是对应了M11650/36.wma的,也就是说url保存的是文件名,那么文件名有了,在那里去照路径呢?有没有看到前面那个getpath(1)??先看看这个是个什么函数再说......但是找了半天也没有找到getpath的定义,哈哈,我郁闷了,呵呵,妈的,天无绝人之路,再回到播放列表的那个HTML源代码,我惊喜的发现了一个<script type="text/javascript" src="/scripts/path_url.aspx"></script>,path_url这个关键字和getpath(1)这个关键字好像还是很接近的哦?哈哈哈,凭直觉,我访问了path_url.aspx,访问后,那个.net程序在服务端输出了一个javascript代码块回来如下:
<!--
self.focus();
document.write("<S"+"CRIPT type=\"text/javascript\" src=\"http://djs.xq163.cn/mpin\">"); 
document.write("</S"+"CRIPT>");
//调用方法为var path=getpath(#) 其中#为1-10之间的数字
function getpath(cs)
{
var path=new Array(12);
path[1]="http://www.fansmi.com/Scripts/geturl.asp?url="; //在引号中写入路径
path[2]="http://wma.xxx.com.cn/uboxxf2/";
path[3]="http://wma.xxx.com.cn/Mv1/";
path[4]="http://wma.xxx.com.cn/uboxff3/";
path[5]="http://wma.xxx.com.cn/Flash1/";
path[6]="http://www6.xxx.cn/";
path[7]="http://www7.xxx.cn/";
path[8]="http://www8.xxx.cn/";
path[9]="http://www9.xxx.cn/";
path[10]="http://www10.xxx.cn/";
path[11]="http://60.195.252.80/banzou/"; //空地址
return path[cs];
}

//-->

这下总算找到那个getpath函数了,哈哈哈哈哈,兴奋啊…………OK,继续。。。看到这个函数的时候我的第一想法是,11个URL,程序到底是访问的那个呢?嘿嘿,还好我记性好。。。。。不知道大家有没有看到,前面的代码是getpath(1) + url???也就是说,它是指定了使用path[1]作为下载地址的。嘿嘿,那么我们随便拿一个文件来测试一下,组合起来後是:http://www.fansmi.com/Scripts/geturl.asp?url=M11650/36.wma,用IE打开一访问,我日………………居然输出一个“没用的啦,请不要再来啦!”,狂晕。。。看来他是判断了HTTP协议中的一个Agent字段,OK,现在拿出抓包工具来分析一下,正常播放的时候,访问这个geturl.asp页面的时候用的什么agent,嘿嘿,抓包我选择的winsock expert,这个工具小,有好用,对于这类用途来说是大大有余了,呵呵,现在打开winsock expert,选择IE浏览器的进程,然后再用浏览器正常播放一下那些音乐文件,只需要播放一下就OK了。。。。一直往下寻找数据包,直到我找到了
GET /Scripts/geturl.asp?url=M11650/36.wma HTTP/1.1
Accept: */*
User-Agent: Windows-Media-Player/10.00.00.3997
UA-CPU: x86
Accept-Encoding: gzip, deflate
Host: www.fansmi.com
Connection: Keep-Alive
Cookie: cnzz02=19; rtime=2; ltime=1185441390497; cnzz_eid=77745478-; ASPSESSIONIDAAQDCRQQ=KBLJADBAFECFGKGAFLJABBFN; fangsheng=yes
的时候,嘿嘿。。。一切都明白了。。。。原来再请求这个文件的时候使用的不是浏览器的User-Agent,而是media player,嘿嘿,这下好办了,自己写一个下载工具就OK。

int CMyDownloaderDlg::DownloadFile(CString strAgent,CString strSource,CString strDest)
{
 HINTERNET hSession=InternetOpen(strAgent,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
 HINTERNET hConnection=InternetOpenUrl(hSession,strSource,NULL,0,0,0);

 BYTE Buffer[4096];
 DWORD Read=0,i;
 HANDLE hFile;

 // 开始从指定的网络位置读取文件(第一个数据包)
 InternetReadFile(hConnection,Buffer,sizeof(Buffer),&Read);

 // 没有找到文件的话
 CString strCheck;
 strCheck.Format("%s",Buffer);
 // 由于使用的是HINTERNET组件读取数据,没有使用SOCKET
 // 所以不能判断服务器的HTTP返回状态,只能通过
 // 返回的数据来判断文件是否存在!
 if(strCheck.Find("<TITLE>无法找到该页</TITLE>") > 0)
 {
  AfxMessageBox("文件不存在");
  Read = 0;
 }
 else
 {
  // 如果服务器文件存在的话才创建本地文件,并接收
  hFile = CreateFile(strDest,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
 }

 long nCount = Read;
 while(Read>0)
 {
  // 将缓冲区的内容写入文件
  WriteFile(hFile,Buffer,Read,&i,NULL);
  
  DoEvent();
  
  // 将文件内容读入缓冲区
  InternetReadFile(hConnection,Buffer,sizeof(Buffer),&Read);
  
  nCount += Read;
 }
 CloseHandle(hFile);  

 InternetCloseHandle(hConnection);  
 InternetCloseHandle(hSession);

 return(nCount);
}
程序很简单,一个DownloadFile函数就可以了,这个函数可以用指定的user-agent取访问一个页面,最后下载geturl.asp?url=M11650/36.wma 後得到一个:
<ASX version = "3.0">
<Entry CLIENTSKIP="yes">
<title>Fans迷音乐网 FansMi.com</title>
<author>Fans迷音乐网 FansMi.com</author>
<Copyright>歌曲版权属唱片公司所有!</Copyright>
<Abstract>Fans迷音乐网 FansMi.com</Abstract>
<REF HREF ="http://wma.xq163.cn:8081/musicdata/M11650/36.wma" />
<REF HREF ="http://wma.xq163.cn:8081/musicdata2/M11650/36.wma" />
<param name="Album" value="Fans迷音乐 FansMi.com"/>
<param name="Artist" value="Fans迷音乐网 FansMi.com"/>
</Entry>
</ASX>

嘿嘿,看那个http://wma.xq163.cn:8081/musicdata/M11650/36.wma不就是真是的下载地址嘛?哈哈哈哈哈!!!!
立即操刀,写出了这个音乐文件下载器。。。。。。。。。





注意:这个程序只用于学习目的,不要用作其他用!



源代码:https://files.cnblogs.com/maxun/DownloadMusic.rar
编译好的程序:https://files.cnblogs.com/maxun/fansmi_download.rar



使用方法明天再贴上来了,哈哈哈!

posted on 2007-07-26 18:06  samuel's blog  阅读(676)  评论(2编辑  收藏  举报

导航