看了破船兄的文章【原创】好听音乐网 -- 歌曲下载分析流程及程序的编写,我也来写一个。破船的代码是智慧型的,我来个猛士型的。。
打开好听音乐网的首页,随便点一首歌来听,出现了播放界面,同时音乐也出来了,这时查看源文件,容易发现如下关键代码
代码:
if("undefined"==typeof(UUAuthCode)|| UUAuthCode==null) UUAuthCode="";
else UUAuthCode="?"+UUAuthCode;
urlht = "/21z/0/daodaidq090508/1/8f4257328b24c8d0_5.wma"+UUAuthCode;
}
seto();
var url='http://wma.haoting.com';
document.writeln("<object id=\"mPlayer\" width=365 height=62");
document.writeln(" classid=\"CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6\" type=application\/x-oleobject standby=\"Loading Windows Media Player ");
document.writeln("");
document.writeln("components...\">");
document.writeln(" <param name=\"URL\" value='"+url+""+urlht+"'>");
,通过观察,要查找到它的位置就要找到能唯一确定它的特征代码,而 /21z/ 这个字符串正是它的特征代码,这个字符串是唯一的,而且是通用的。发现了这个,剩下的就是体力活了,Now is Code Time , Go !代码:
#include <windows.h>
#include <UrlMon.h>
#pragma comment (lib, "URLmon.lib")
WCHAR wcURL[2048];
WCHAR wcFileName[2048];
char szBuffer[256];
char szFullPath[512];
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
memset(szFullPath, 0, sizeof(char) * 512);
memset(szBuffer, 0, sizeof(char) * 256);
memset(wcFileName, 0, sizeof(WCHAR) * 2048);
memset(wcURL, 0, sizeof(WCHAR) * 2048);
lstrcpyA(szFullPath, "http://wma.haoting.com"); //好听音乐网的音乐服务器网址,域名是固定的
lstrcpy(wcFileName, TEXT("C:\\Test.txt")); //临时保存的文件,会在文件关闭后自动被删除
lstrcpy(wcURL, TEXT("http://www.haoting.com/htmusic/349809ht.htm")); //示例网址
if (S_OK == URLDownloadToFile(NULL,
wcURL,
wcFileName,
0,
NULL))
{
HANDLE hFile = CreateFile(wcFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL, OPEN_EXISTING,
FILE_FLAG_DELETE_ON_CLOSE,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
hFile = NULL;
return 0;
}
LARGE_INTEGER FileSize = {0};
GetFileSizeEx(hFile, &FileSize);
HANDLE hMemFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (INVALID_HANDLE_VALUE == hMemFile)
{
hMemFile = NULL;
return 0;
}
LPBYTE lpByte = (LPBYTE)MapViewOfFile(hMemFile, FILE_MAP_READ, 0, 0, 0);
for (UINT i = 0; i < FileSize.u.LowPart; i++)
{
if ((*lpByte == '/')
&& (*(lpByte + 1) == '2')
&& (*(lpByte + 2) == '1')
&& (*(lpByte + 3) == 'z')
&& (*(lpByte + 4) == '/'))
{
for (int j = 0;; j++)
{
szBuffer[j] = *lpByte;
if ((*lpByte == 'a')
&& (*(lpByte - 1) == 'm')
&& (*(lpByte - 2) == 'w')
&& (*(lpByte - 3) == '.'))
{
break;
}
lpByte += 1;
}
break;
}
lpByte += 1;
}
UnmapViewOfFile((LPVOID)lpByte);
CloseHandle(hMemFile);
CloseHandle(hFile);
lstrcatA(szFullPath, szBuffer);
MessageBoxA(NULL, szFullPath, NULL, MB_OK); //测试是否弹出了我们想要的下载地址 ^_^ ~~
}
return 0;
}
有了这个查找引擎,做个GUI来实现批量下载还难吗

PS:这个服务器都是提供WMA格式的,价值不大,我的方法也很挫,但是所想即所得

附件中是一个编译好的示例,演示用的。


。。。