用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?; //空地址
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



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

相关文章:

  • 2022-12-23
  • 2021-06-13
  • 2022-01-03
  • 2021-11-18
  • 2021-08-03
  • 2021-10-17
  • 2022-02-07
  • 2022-02-08
猜你喜欢
  • 2021-12-19
  • 2021-07-01
  • 2021-09-28
  • 2021-05-21
  • 2021-12-08
  • 2021-08-18
相关资源
相似解决方案