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 阅读(672) 评论(2) 编辑 收藏 举报