百度MP3设计文档: ( 1、需求 功能:通过程序从baidu(http://mp3.baidu.com/搜索内容,并提出内容(主要是URL地址),
要求语言:C++,最好用VC开发,用wininet或winhttp,不要用其它的http library 2、设计思路 从向BAIDUMP3搜索引擎模拟发送HTTP请求,获取网页内容然后提取歌词或者歌曲链接 分析1、百度MP3搜索的HTTP请求格式: 搜索“吻别”: 歌词: http://mp3.baidu.com/m?tn=baidump3lyric&ct=150994944&rn=10&word=吻别&lm=-1 ALLMUSIC: http://mp3.baidu.com/m?rn=&tn=baidump3&ct=134217728&word=吻别&lm=-1 MP3: http://mp3.baidu.com/m?tn=baidump3&ct=134217728&rn=&word=吻别&lm=0 RM: http://mp3.baidu.com/m?tn=baidump3&ct=134217728&rn=&word=吻别&lm=1 WMA: http://mp3.baidu.com/m?tn=baidump3&ct=134217728&rn=&word=吻别&lm=2 FLASH: http://mp3.baidu.com/m?tn=baidump3&ct=134217728&rn=&word=吻别&lm=6 仔细分析上面的链接会发现请求分为这么几段: HTTP HEAD: http://mp3.baidu.com/m? rn : 歌词时为10其他为空 tn : 查歌词时为baidump3lyric,查歌曲时为baidump3 ct : 查歌词时为150994944,查歌曲时为134217728 lm : 查歌词和查所有歌曲时为-1,MP3, RM, WMA, FLASH分别对应0, 1, 2, 6 word : 要查询的内容 其中rn, tn和lm的值都是不变的,而ct的值每天都在变化,需要先获取,检查http://mp3.baidu.com/的源代码发现如下这段代码: function syn(form) { if (form.lm[0].checked){ form.rn.value="10"; form.tn.value="baidump3lyric"; form.ct.value="150994944"; } else{ if(form.lm[6].checked){ form.tn.value="baidump3ring"; form.ct.value="285212672"; } else { form.tn.value="baidump3"; form.ct.value="134217728"; } } } 这样就可以先从http://mp3.baidu.com/提取ct的内容然后用来查询,提取方法有三种: 1、分析源代码,构建if、else二叉树, 2、找到form.lm[0].checked和form.lm[6].checked再查值 3、找到form.tn.value="xxxxxxx",然后查它附近的ct值即可 附近的:提取网页源码后,找到form.tn.value位置,向前找到{的位置,向后找到}的位置,这里面的内容里找到ct.value就是相应的tn.value对应的内容。 这些值确定下来以后,就可以根据用户查询内容来构造查询的HTTP请求了。 根据查询内容的HTTP请求获得源码内容以后,可以从中提取歌词和歌曲,提取关键词如下: 歌词: string lyricHead = "<b><font size=+1><font style=color:#e10900>"; string lyricTail = "<p align=right>"; 歌曲: 3、主要函数说明: //获取一个URL对应的HTML源文件,使用了CHttpGet类(自己做的,有源码) string GetURLPage(string url) //测试一个URL的链接是否可用,使用了CHttpGet类(自己做的,有源码) bool testConnection(string url) //清除空格、回车、换行、tab void ClearSpaces(string &str) //初始化ct的值,成功则返回true,否则返回false bool Initialize() //析取page里面的音乐链接 vector<string> TearSongURLs(string page) //去除html标志串 void StripTags(CString &html) //析取page里面的第一个歌词 string TearLyric(string page) //构造查询用的URL string BuildURL(int searchIndex, string songName, string singerName) //要提供的两个API void GetLyric(string songName, string singerName, string &lyric) bool GetMusicUrl(bool test, MusicType type, string songName, string singerName, string &url1, string &url2, string &url3) |
|