用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. 【趣味编程】第1期。用python做简易版音乐下载器

    目录 前言 爬虫部分 完整代码 前言 那废话不多说,先了解准备工作. 1.先下载python,可以搜索python官网,到官网里面下载 2.下载外置模块 第一种方法,按win+R,输入cmd,然后输入 ...

  2. python如何自制音乐软件_Python开发制作酷狗和QQ音乐下载器

    开发工具 **Python版本:**3.6.4 相关模块: requests模块 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 相关文件 ...

  3. [工具]再更新音乐下载软件,MP3音乐无损音乐下载器

    昨天发的音乐下载软件我没有多做几次测试,导致误导大家了,昨天分享的那个只能听音乐不能下载,知道后我又赶紧为大家找了一款(一个网站),不知道什么情况链接不能发自动回复里,我也不敢直接放文章里,大家回复转 ...

  4. [Android工具]安卓音乐下载软件,无损音乐FLAC音乐下载器

    功能:免费好用的无损音乐下载器. 音乐格式:APE.FLAC和MP3 下载:后台发送"FLAC"获取下载地址 不需要注册登录直接进入搜索界面: 点击输入框右侧的放大镜开始搜索: 下 ...

  5. 网页mp3提取器_用Python写一个酷狗音乐下载器!

    [这就是标题] 距离上一次发推送差不多有一个月了ヽ(ー_ー)ノ 做了一个小的酷狗音乐下载器,公众号内回复704就可以收到下载链接. 长下面这样. 双击打开,会提示让输入你要搜索的歌曲. 这里输入去流浪 ...

  6. python音乐下载器-支持所有主流平台-python脚本源码下载

    音乐下载器目前支持所有主流平台 下载地址

  7. MusicTools下载 v3.4.0 全网免费无损音乐下载器

    下载地址:点我 随着音乐版权越来越受到重视,我们在线听歌的限制也越来越大.在一个音乐平台上,我们无法听到所有歌手的作品,因为该平台可能没有某个歌手的版权.而且,由于很多内容都需要付费,我们也无法随心所 ...

  8. Tkinter写一个音乐下载器

    直接上源码: # 导入模块 from tkinter import * import requests import jsonpath import os from urllib.request im ...

  9. python制作一个网易音乐下载器

    你只需要在代码同级目录新建一个文件夹mp3即可.代码可复制粘贴. 第一次思路如下,该效果只能一次下载单个音乐: #coding=gbk """ 描述:传参id即可下载音乐 ...

最新文章

  1. 树莓派安装samba共享文件
  2. JAVA EE Eclipse下配置Tomcat服务器
  3. php fetchassoc 跨表,php-mysqli_fetch_assoc-如果同时更改数据会怎样?
  4. 最好用的日志分析工具ELK
  5. -bash: 未预期的符号 `(' 附近有语法错误
  6. mysql数据库操作手册
  7. 4152. [AMPPZ2014]The Captain(稠密图最短路)
  8. html之文档的头部和元数据定义(下,未写完)
  9. java中 将字符串时间 '2015-9-8 17:05:06' 转化为格式 '2015-09-08 17:05:06'
  10. Vue3.0 Composition API与Vue2.x 使用的 Options API
  11. dj鲜生-34-存档-用户中心地址页重复查询默认地址的优化-利用自定义模型管理器的方法来实现
  12. pyqt5框内显示图像_【好工具】VisualStudio下图像调试神器
  13. 嵌入式设备ntp同步时间的一些笔记
  14. free -m 下的含义
  15. 优美的js代码,拿去玩~
  16. 【知识碎片】JavaScript篇
  17. CSDN博客下载器v2.5(解决严重bug)
  18. PHP HTML转PDF
  19. python处理excel数值为文本_使用Python中的xlrd将数字Excel数据读取为文本
  20. Gauntlet风险评级上线: DeFi杠杆率多高?会不会崩盘?

热门文章

  1. 国家教育资源公共服务平台
  2. ARK Invest:SaaS 将迎来下一个黄金十年?
  3. 计算机用户来源分析,中国PC用户购买渠道调查报告前期准备用户篇
  4. 2020-2021信息论与编码1试卷
  5. 【问题解决】Ubuntu(Linux)显示时出现菱形乱码
  6. 补天应急响应公司发布中国实战化白帽人才能力白皮书
  7. 东华大学2020考研计算机复试准备上机题解析答案_进阶篇(61-95)
  8. 王通:SEO技术最NB的网站是百度
  9. 高薪就业面试题-张晨光-专题视频课程
  10. 百度网盘和视频网站都在用的P2P技术是什么?