搜索
查看: 9565|回复: 8

[网络] 搜歌词 --查找歌词不用愁

  [复制链接]

12

主题

678

帖子

3954

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
3954
发表于 2011-1-18 12:35:29 | 显示全部楼层 |阅读模式
lrc.jpg


  1. //比较简单,想要的功能可以自己添加
  2. import win.ui;
  3. import inet.http;
  4. import web.msxml;
  5. /*DSG{{*/
  6. var winform = ..win.form( right=348;bottom=406 ;text="搜歌词")
  7. winform.add(
  8. showLrc={ bottom=364;right=340;left=8;multiline=1;top=89;z=6;vscroll=1;edge=1;cls="richedit" };
  9. static3={ bottom=408;text="软件采用aardio编写,完全开源。
  10. 注:以上结果来自http://www.baidu.com";left=18;right=336;top=375;z=7;cls="static" };
  11. edtSinger={ bottom=72;right=229;left=94;top=45;z=4;text="梁静茹";edge=1;cls="edit" };
  12. edtSong={ bottom=38;right=320;left=92;top=11;text="暖暖";z=3;edge=1;cls="edit" };
  13. static={ bottom=42;right=87;left=24;text="歌曲名:";top=15;z=1;cls="static" };
  14. btnSeach={ bottom=72;text="搜索";left=245;top=45;z=5;right=320;cls="button" };
  15. static2={ bottom=78;right=86;left=23;text="歌手:";top=51;z=2;cls="static" }
  16. )
  17. /*}}*/

  18. winform.btnSeach.oncommand = function(id,event) {

  19.     //建立HTTP对象
  20.     http = inet.http()
  21.    
  22.     //输入网址执行get函数下载网页内容
  23.     str,errmsg = http.get("http://box.zhangmen.baidu.com/x?op=12&count=1&title="
  24.             + winform.edtSong.text
  25.             +"$"+ winform.edtSinger.text
  26.              +"$$"
  27.              );
  28.    
  29.     if( str ) {
  30.         var xmlDoc = web.msxml()
  31.         xmlDoc.loadXml(str)
  32.         var lrcid = xmlDoc.lrcid(0).text
  33.         var lrcUrl = "http://box.zhangmen.baidu.com/bdlrc/" +  math.modf(lrcid/100) + "/" + lrcid +".lrc"
  34.         var lrc,errmsg = http.get(lrcUrl);
  35.         winform.showLrc.text = lrc;
  36.     }
  37.     //否则输出错误信息
  38.     else {
  39.         winform.msgbox(errmsg)
  40.     }
  41.    
  42.     http.close();//释放资源  
  43.    
  44. }

  45. winform.show()
  46. win.loopMessage();

复制代码

评分

参与人数 1专家分 +80 收起 理由
qqmmcc + 80

查看全部评分

回复

使用道具 举报

12

主题

678

帖子

3954

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
3954
 楼主| 发表于 2011-1-18 12:36:20 | 显示全部楼层

[i=s] 本帖最后由 xauto 于 2011-10-12 21:29 编辑 [/i] [color=#FF0000]其实能做的更多 - - 贴上网上的文

本帖最后由 xauto 于 2011-10-12 21:29 编辑

其实能做的更多 - -  贴上网上的文章


当你在百度去搜索一首歌时,你会发现有种更简单的方法,嘿嘿,百度有个不公开的API

http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$
用上面的地址,红色部分改成歌名与作者名,然后百度就会给你一个XML:
<?xml version="1.0" encoding="gb2312" ?>
<result>
   <count>1</count>
<data>
<encode>http://song.feifa-radio.com/Q/20050701/jingxuan/YjI$.Wma</encode>
<decode>1.Wma</decode>
<type>2</type>
<lrcid>49684</lrcid>
    </data>
</result>

其中的count值为1是说返回的是一个,这个没什么用,接下来的东西就有用了,encode里的值是歌曲加密后的地址,加密只是对文件名加密的,我们需要的只是前面的路径,也就是http://song.feifa-radio.com/Q/20050701/jingxuan/ 这部分,然后复制decode 的值: 1.Wma与前面的相拼就是正确的下载地址:
[url=]http://song.feifa-radio.com/Q/20050701/jingxuan/1.Wma[/url]
后面的type的值为2表示此歌曲文件类型是wma的,其它的:1表示rm,0表示MP3,通常我们下的类型都是MP3或WMA的,所以只要有2或0的
lrcid这个的值是百度服务器上这首歌的歌词文件的文件名,这个文件的路径是:http://box.zhangmen.baidu.com/bdlrc/496/49684.lrc  



这个地址解析下:
http://box.zhangmen.baidu.com/bdlrc/ 这个是百度lrc歌词存放地址,后面的496是一个的不定的,民就是说歌曲不同那个目录名也不同,它的算法是拿歌词文件名(也就是上面说的 49684) 除以一百,然后取小于等于其结果的最大整数,如上面的:49684/100 =496.84 小于等于496.84 的最大整数就是496,于是这首歌完整的歌词地址就出来了:http://box.zhangmen.baidu.com/bdlrc/496/49684.lrc




回复

使用道具 举报

12

主题

678

帖子

3954

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
3954
 楼主| 发表于 2011-10-12 22:00:54 | 显示全部楼层

发现使用web.msxml解析xml更方便了

发现使用web.msxml解析xml更方便了
回复

使用道具 举报

65

主题

953

帖子

5036

积分

荣誉会员

Rank: 8Rank: 8

积分
5036
发表于 2011-1-18 13:00:24 | 显示全部楼层

前排站位..

前排站位..
回复

使用道具 举报

52

主题

1341

帖子

7331

积分

荣誉会员

Rank: 8Rank: 8

积分
7331
发表于 2011-1-18 14:15:55 | 显示全部楼层

先有歌曲伴奏不用愁,现有寻找歌词不用愁,未来也许有卡拉OK 不用愁{:lol} 谢谢xauto分享

先有歌曲伴奏不用愁,现有寻找歌词不用愁,未来也许有卡拉OK 不用愁
谢谢xauto分享
回复

使用道具 举报

23

主题

411

帖子

2240

积分

五级会员

Rank: 8Rank: 8

积分
2240
发表于 2011-1-19 23:26:26 | 显示全部楼层

不错哦,好久出个视频搜索吧{:lol}

不错哦,好久出个视频搜索吧
回复

使用道具 举报

9

主题

79

帖子

582

积分

三级会员

Rank: 4

积分
582
发表于 2011-10-12 16:08:43 | 显示全部楼层

哈哈。歌曲与歌词不用愁了。。谢谢楼主分享

哈哈。歌曲与歌词不用愁了。。谢谢楼主分享
回复

使用道具 举报

48

主题

593

帖子

3335

积分

五级会员

Rank: 8Rank: 8

积分
3335
发表于 2011-12-26 16:13:47 | 显示全部楼层

[quote][size=2][color=#999999]xauto 发表于 2011-1-18 12:36[/color] [url=forum.php?m

xauto 发表于 2011-1-18 12:36
其实能做的更多 - -  贴上网上的文章


当你在百度去搜索一首歌时,你会发现有种更简单的方法,嘿嘿,百 ...

这个讲解相当给力,多谢楼主
回复

使用道具 举报

3

主题

26

帖子

234

积分

荣誉会员

Rank: 8Rank: 8

积分
234
发表于 2013-11-6 01:06:57 | 显示全部楼层

感觉百度上的歌词不全,看到QQ歌词的请求地址,发一段qq歌词的搜索代码 [code][lang=aardio,false]import win.ui; im

感觉百度上的歌词不全,看到QQ歌词的请求地址,发一段qq歌词的搜索代码
  1. import win.ui;
  2. import inet.url;
  3. import web.msxml;
  4. import process;
  5. /*DSG{{*/
  6. var winform = ..win.form( bottom=450;parent=...;text="搜歌词";right=348 )
  7. winform.add(
  8. inputArtist={ right=231;bottom=69;text="崔健";left=97;top=44;z=7;edge=1;cls="edit" };
  9. lrcText={ bottom=356;right=321;readonly=1;multiline=1;top=79;vscroll=1;z=5;left=23;hscroll=1;edge=1;cls="edit" };
  10. static3={ bottom=440;text="软件采用aardio编写,完全开源。
  11. 注:以上结果来自QQ音乐";left=17;right=335;top=407;transparent=1;z=2;cls="static" };
  12. toAauForum={ bottom=398;text="要解析歌词,请点击...";left=23;top=365;z=8;right=321;cls="button" };
  13. inputTitle={ right=320;bottom=36;text="花房姑娘";left=97;top=11;z=6;edge=1;cls="edit" };
  14. static={ bottom=42;right=87;left=24;text="歌曲名:";top=15;z=4;transparent=1;cls="static" };
  15. btnSeach={ bottom=72;right=320;left=245;top=45;z=1;text="搜索";cls="button" };
  16. static2={ bottom=78;right=86;left=23;text="歌手:";top=51;transparent=1;z=3;cls="static" }
  17. )
  18. /*}}*/

  19. /*
  20. * 下载服务器上的数据
  21. */
  22. function getResponse(url,postData) {
  23.         import inet.http;
  24.         var http = inet.http();
  25.         var result;
  26.        
  27.         try{
  28.                 if(!postData) result = string.trim(http.get(url));
  29.                 else result = string.trim(http.post(url,postData));
  30.         }
  31.         catch(e) {
  32.                 http.close();
  33.                 return false;
  34.         }
  35.         http.close();
  36.         return result;
  37. }

  38. /*
  39. * 搜索QQ音乐上的歌词
  40. */
  41. function getLrc(title,artist) {
  42.         var response, lrcId, lrc;
  43.         var lrcGot = false;

  44.         if(!title || title=='' || !artist || artist=='') return false;
  45.        
  46.         response = win.invoke(getResponse,"http://qqmusic.qq.com/fcgi-bin/qm_getLyricId.fcg?name=" ++ inet.url.encode(title) ++ "&singer=" ++ inet.url.encode(artist) ++ "&from=qqplayer");       
  47.         if(response && not string.find(response,"没有找到")) {
  48.                 //io.print(response);
  49.                 xmlDoc = web.msxml();
  50.                 xmlDoc.loadXml(response);
  51.                 qNodes = xmlDoc.queryNodes(tagName="songinfo");
  52.                 if(qNodes) {
  53.                         lrcId = qNodes.attributes(0).nodeValue;
  54.                         if(!lrcId || string.trim(lrcId)=='') return false;
  55.                         xmlDoc = null;               
  56.                        
  57.                         response = win.invoke(getResponse,"http://music.qq.com/miniportal/static/lyric/" ++ tostring(tonumber(lrcId) % 100) ++ "/" ++ lrcId ++ ".xml");
  58.                         if(response && string.find(response,"lyric")) {

  59.                                 lrc = string.replace(response,'@@<?xml version="1.0" encoding="gb2312" ?><lyric><![CDATA[','');
  60.                                 lrc = string.replace(lrc,'@@]]></lyric>','');
  61.                                 lrcGot = true;
  62.                         }

  63.                 }
  64.                 else lrcGot = false;
  65.         }
  66.         else lrcGot = false;

  67.         if(lrcGot) {
  68.                 return lrc;
  69.         }
  70.         else {
  71.                 return false;
  72.         }
  73. }

  74. winform.btnSeach.oncommand = function(id,event){
  75.         winform.btnSeach.text = "请稍候";
  76.         winform.btnSeach.disabled = true;
  77.         title = string.trim(winform.inputTitle.text);
  78.         artist = string.trim(winform.inputArtist.text);
  79.         if(title!='' && artist!='') lrc = getLrc(title,artist);
  80.         else {
  81.                 winform.msgbox("请填写完整");
  82.                 winform.btnSeach.text = "搜索";
  83.                 winform.btnSeach.disabled = false;
  84.                 return;
  85.         }
  86.         if(lrc) winform.lrcText.text = lrc;
  87.         else winform.msgbox("未有找到歌词...");
  88.         winform.btnSeach.text = "搜索";
  89.         winform.btnSeach.disabled = false;
  90. }

  91. winform.toAauForum.oncommand = function(id,event){
  92.         process.execute("http://bbs.aardio.com/forum.php?mod=viewthread&tid=274&page=1#pid62647");
  93. }

  94. winform.wndproc = function(hwnd,message,wParam,lParam){
  95.         select( message ) {
  96.                 case 0x10/*0x10/*_WM_CLOSE*/{
  97.                         //关闭窗口时,完全退出程序
  98.                         win.quitMessage();
  99.                 }
  100.         }
  101. }

  102. winform.show();
  103. win.loopMessage();
复制代码


可以使用Fiddler软件抓包,找到QQ歌词请求的地址:类似(http://qqmusic.qq.com/fcgi-bin/qm_getLyricId.fcg?name=花房姑娘&singer=崔健),实际编程时,两个参数需要进行url地址编码,使用GBk。

返回一段xml,也为GBK编码。
找到其中songinfo字段,例如<songinfo id="103352"  scroll="1">
其中的id,下面获取歌词需要用到

歌词请求地址,类似于(http://music.qq.com/miniportal/static/lyric/52/103352.xml),其中的52,是上面的id除以100后的余数。xml前面,就是上面的id。
返回一段xml,为GBK编码。去除其中的lyric字段即得到歌词

当然也可以按楼主写的先搜索百度,百度没有再搜索qq音乐

得到歌词后,需要解析歌词,请参考
http://bbs.aardio.com/forum.php? ... d=274&pid=62647
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-4-23 00:25 , Processed in 0.062502 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表