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不就是真是的下载地址嘛?哈哈哈哈哈!!!!
立即操刀,写出了这个音乐文件下载器。。。。。。。。。
注意:这个程序只用于学习目的,不要用作其他用!
源代码:http://files.cnblogs.com/maxun/DownloadMusic.rar
编译好的程序:http://files.cnblogs.com/maxun/fansmi_download.rar
使用方法明天再贴上来了,哈哈哈!
转载于:https://www.cnblogs.com/maxun/archive/2007/07/26/832609.html
FANSMI音乐下载器原理相关推荐
- 【趣味编程】第1期。用python做简易版音乐下载器
目录 前言 爬虫部分 完整代码 前言 那废话不多说,先了解准备工作. 1.先下载python,可以搜索python官网,到官网里面下载 2.下载外置模块 第一种方法,按win+R,输入cmd,然后输入 ...
- python如何自制音乐软件_Python开发制作酷狗和QQ音乐下载器
开发工具 **Python版本:**3.6.4 相关模块: requests模块 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 相关文件 ...
- [工具]再更新音乐下载软件,MP3音乐无损音乐下载器
昨天发的音乐下载软件我没有多做几次测试,导致误导大家了,昨天分享的那个只能听音乐不能下载,知道后我又赶紧为大家找了一款(一个网站),不知道什么情况链接不能发自动回复里,我也不敢直接放文章里,大家回复转 ...
- [Android工具]安卓音乐下载软件,无损音乐FLAC音乐下载器
功能:免费好用的无损音乐下载器. 音乐格式:APE.FLAC和MP3 下载:后台发送"FLAC"获取下载地址 不需要注册登录直接进入搜索界面: 点击输入框右侧的放大镜开始搜索: 下 ...
- 网页mp3提取器_用Python写一个酷狗音乐下载器!
[这就是标题] 距离上一次发推送差不多有一个月了ヽ(ー_ー)ノ 做了一个小的酷狗音乐下载器,公众号内回复704就可以收到下载链接. 长下面这样. 双击打开,会提示让输入你要搜索的歌曲. 这里输入去流浪 ...
- python音乐下载器-支持所有主流平台-python脚本源码下载
音乐下载器目前支持所有主流平台 下载地址
- MusicTools下载 v3.4.0 全网免费无损音乐下载器
下载地址:点我 随着音乐版权越来越受到重视,我们在线听歌的限制也越来越大.在一个音乐平台上,我们无法听到所有歌手的作品,因为该平台可能没有某个歌手的版权.而且,由于很多内容都需要付费,我们也无法随心所 ...
- Tkinter写一个音乐下载器
直接上源码: # 导入模块 from tkinter import * import requests import jsonpath import os from urllib.request im ...
- python制作一个网易音乐下载器
你只需要在代码同级目录新建一个文件夹mp3即可.代码可复制粘贴. 第一次思路如下,该效果只能一次下载单个音乐: #coding=gbk """ 描述:传参id即可下载音乐 ...
最新文章
- 树莓派安装samba共享文件
- JAVA EE Eclipse下配置Tomcat服务器
- php fetchassoc 跨表,php-mysqli_fetch_assoc-如果同时更改数据会怎样?
- 最好用的日志分析工具ELK
- -bash: 未预期的符号 `(' 附近有语法错误
- mysql数据库操作手册
- 4152. [AMPPZ2014]The Captain(稠密图最短路)
- html之文档的头部和元数据定义(下,未写完)
- java中 将字符串时间 '2015-9-8 17:05:06' 转化为格式 '2015-09-08 17:05:06'
- Vue3.0 Composition API与Vue2.x 使用的 Options API
- dj鲜生-34-存档-用户中心地址页重复查询默认地址的优化-利用自定义模型管理器的方法来实现
- pyqt5框内显示图像_【好工具】VisualStudio下图像调试神器
- 嵌入式设备ntp同步时间的一些笔记
- free -m 下的含义
- 优美的js代码,拿去玩~
- 【知识碎片】JavaScript篇
- CSDN博客下载器v2.5(解决严重bug)
- PHP HTML转PDF
- python处理excel数值为文本_使用Python中的xlrd将数字Excel数据读取为文本
- Gauntlet风险评级上线: DeFi杠杆率多高?会不会崩盘?