[转载]获取网络MP3真实地址

[转载]获取网络MP3真实地址 – Java综合 – Java – JavaEye论坛.

MP3网站的歌曲链接都采用了不同的加密方法,直接从页面的源文件中是找 不到其MP3的网址的。以下有两个public class都可独立运行,只要将其构造方法更名为main方法就可以了,同时还需要在给出的JAVA源代码中找到“//播放或下载代码…”这一行,将 其改为“Thread.sleep(200)”延时,否则同一IP频繁的连接请求会遭服务器拒绝或引发服务器的防恶意搜索保护。

1.获取百度新歌MP3真实地址

百度新歌的网址是http://xinge.baidu.com/index.html,打开该页面后用查看源文件,搜索“{sid:”,会看到这样的文本:

http://xinge.baidu.com/index.html的源文件片断
{sid:’468aecfeaabbd9467fb939a2e80da58a.mp3′,al:’今 生无缘’,ti:’一天爱一点’,si:’易欣 孙莺’,cp:’华友金信子 ‘,da:’2010-08-03′,cv:’38d9e957d5bdfb788989f1eb12239d8f.jpg’,lrc:’b118977f14893a70ab4652031dd1633d.txt’,dl:’511′,tl:’281394′,ico:0}

其中:“sid:”后面是歌曲连接、“al:”后是唱片集、“ti:”后面是歌曲标题、“si:”后面是歌手。

  • 读取“sid:”后面用一对单引号括起来的字符串,在前面加上 http://xinge.baidu.com/wgns/url/构成歌曲的链接,例如:http://xinge.baidu.com/wgns /url/468aecfeaabbd9467fb939a2e80da58a.mp3,这个链接是用于打开试听窗口的。
  • 试听窗口查看不到源文件,那就编程打开这个歌曲链接的网址并解析其源文件。接收到的源文件只有一行,在这一行字符串前面加上http://xinge.baidu.com就是MP3的真实网址了,这个网址可用于播放或下载MP3。

源代码如下:

Java代码
  1. /*
  2. * XingeBaidu.java – 获取’百度新歌’的MP3真实网址
  3. */
  4. package jmp123.player;
  5. import java.io.BufferedReader;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.net.URL;
  9. import java.net.HttpURLConnection;
  10. public class XingeBaidu {
  11. public XingeBaidu() {
  12. String strLine;
  13. int beginIndex, endIndex, idx;
  14. System.out.println(“连接到百度新歌\n”);
  15. try {
  16. URL url = new URL(“http://xinge.baidu.com/”);
  17. HttpURLConnection objHttp = (HttpURLConnection) url.openConnection();
  18. objHttp.setRequestProperty(“Connection”, “Keep-Alive”);
  19. InputStream objIS = objHttp.getInputStream();
  20. BufferedReader objReader = new BufferedReader(new InputStreamReader(objIS));
  21. while ((strLine = objReader.readLine()) != null) {
  22. if ((beginIndex = strLine.indexOf(“{sid:”)) != –1) {
  23. if ((idx = strLine.indexOf(“al:”)) != –1
  24. && (endIndex = strLine.indexOf(“‘,ti”)) != –1
  25. && idx + 4 < endIndex)
  26. System.out.printf(“[唱片集:%s]  “,strLine.substring(idx+4,endIndex));
  27. if ((idx = strLine.indexOf(“ti:”)) != –1
  28. && (endIndex = strLine.indexOf(“‘,si”)) != –1
  29. && idx + 4 < endIndex)
  30. System.out.printf(“%s”, strLine.substring(idx + 4,endIndex));
  31. if ((idx = strLine.indexOf(“si:”)) != –1
  32. && (endIndex = strLine.indexOf(“‘,cp”)) != –1
  33. && idx + 4 < endIndex)
  34. System.out.printf(”  [歌手:%s]”,strLine.substring(idx+4,endIndex));
  35. System.out.printf(“\n”);
  36. if ((endIndex = strLine.indexOf(“.mp3”)) != –1) {
  37. strLine = strLine.substring(beginIndex + 6, endIndex + 4);
  38. getMP3URL(“http://xinge.baidu.com/wgns/url/” + strLine);
  39. }
  40. }
  41. }
  42. catch (Exception e) {
  43. // e.printStackTrace();
  44. }
  45. }
  46. private void getMP3URL(String surl) throws Exception {
  47. String strLine;
  48. URL url = new URL(surl);
  49. HttpURLConnection objHttp = (HttpURLConnection) url.openConnection();
  50. InputStream objIS = objHttp.getInputStream();
  51. BufferedReader objReader = new BufferedReader(new InputStreamReader(objIS));
  52. if ((strLine = objReader.readLine()) != null) {
  53. strLine = “http://xinge.baidu.com” + strLine;
  54. System.out.println(strLine); //打印查找到的MP3的真实网址
  55. //播放或下载的代码…
  56. }
  57. objHttp.disconnect();
  58. objHttp = null;
  59. objReader.close();
  60. objReader = null;
  61. url = null;
  62. }
  63. }

2.获取搜狗MP3真实网址

用上面的方法不能获取搜狗新歌100等的MP3真实网址,原因可能是其服 务器有更严格的限制,防止用上面的方法去恶意搜索。前两天调试代码时连接上去,接收到的页面源文件中提示输入验证码,所以就不能用程序去解析其MP3网址 了,晕,接连两天都不行,不知道是前两天调试程序连接的太频繁了还是别的什么原因,触发了网站的防恶意搜索保护。

http://music.sogou.com/song/newtop_1.html源文件片断
<td width=”25″><a onclick=”window.open(‘http://mp3.sogou.com/down.so?t=%C0%F1%CE%EF&s=%BD%AD%D3%B3%C8%D8&w=02210600′,”,’width=428,height=394,scrollbars=no’);uigsPB(‘consume=phb_down’);return false;” href=”JavaScript:void(0);” target=”_blank” class=”link” title=”链接”></a></td>

源代码如下,自己对比一下,就能琢磨出与第一种方法有什么不同了。总的步骤是一样的,仍是两步:

  • 连接到http://music.sogou.com/song/newtop_1.html从接收到的数据流中查找到歌曲链接。打开这个页面的源文件,查找到window.open(,它后面用一对单引号括起来的内容就是歌曲的链接,这个链接是用于打开试听窗口的。
  • 用程序连接到这个歌曲链接,从接收到的数据流中查找以http://开头、以.mp3结尾的字符串,这个字符串就是MP3的真实网址。
Java代码
  1. /*
  2. * SogouNewTop.java – 获取’搜狗音乐新歌TOP100’的MP3真实网址
  3. */
  4. package jmp123.player;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.io.BufferedReader;
  8. import java.io.InputStreamReader;
  9. import java.net.Socket;
  10. /**
  11. * 创建、发送HTTP请求头
  12. */
  13. class MySocket {
  14. private String strReferer;
  15. private Socket socket;
  16. private PrintWriter pwOut;
  17. BufferedReader brIn;
  18. public MySocket(String strReferer) {
  19. this.strReferer = strReferer;
  20. }
  21. public void create(String surl) {
  22. int beginIndex, endIndex, iPort = 80;
  23. String strHost = surl.substring(7);
  24. endIndex = strHost.indexOf(“/”);
  25. String strPath = strHost.substring(endIndex);
  26. strHost = strHost.substring(0, endIndex);
  27. if( (beginIndex = strHost.indexOf(“:”)) != –1) {
  28. if(endIndex – beginIndex > 1)
  29. iPort = Integer.parseInt(strHost.substring(beginIndex+1, endIndex));
  30. strHost = strHost.substring(0, beginIndex);
  31. }
  32. try {
  33. socket = new Socket(strHost, iPort);
  34. pwOut = new PrintWriter(socket.getOutputStream(), true);
  35. // 构建HTTP请求头
  36. pwOut.println(“GET “ + strPath + ” HTTP/1.1″);
  37. pwOut.println(“Host:” + strHost);
  38. pwOut.println(“Referer:” + strReferer);
  39. pwOut.println(“Accept:*/*”);
  40. pwOut.println(“User-Agent:Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)”);
  41. pwOut.println(“Connection: Keep-Alive”);
  42. pwOut.println();
  43. // 调用socket.getInputStream方法时才发送HTTP请求头
  44. brIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  45. catch (IOException e) {
  46. System.out.println(“创建套接字/输入流错误。”);
  47. System.exit(1);
  48. }
  49. }
  50. public BufferedReader getBufferedReader() {
  51. return brIn;
  52. }
  53. public void close() {
  54. try {
  55. brIn.close();
  56. pwOut.close();
  57. socket.close();
  58. catch (IOException e) {
  59. System.out.println(“关闭套接字错误。”);
  60. System.exit(1);
  61. }
  62. }
  63. }
  64. /**
  65. * 解析搜狗音乐新歌TOP100页面获取MP3真实网址。
  66. */
  67. public class SogouNewTop {
  68. private static final String strReferer = “http://music.sogou.com/song/newtop_1.html”;
  69. private MySocket htmlSocket = new MySocket(strReferer);
  70. private MySocket urlSocket = new MySocket(strReferer);
  71. /*
  72. * 查找页面的歌曲链接
  73. */
  74. public SogouNewTop() throws Exception {
  75. System.out.println(“连接到搜狗音乐新歌TOP100\n”);
  76. String strline = “”;
  77. htmlSocket.create(strReferer);
  78. BufferedReader brIn = htmlSocket.getBufferedReader();
  79. int beginIndex, endIndex;
  80. while ((strline = brIn.readLine()) != null) {
  81. // 1.查找歌曲名(可省略)
  82. if ((beginIndex = strline.indexOf(“consume=phb_song”)) != –1 ) {
  83. strline = strline.substring(beginIndex);
  84. if ((beginIndex = strline.indexOf(“>”)) != –1
  85. && (endIndex = strline.indexOf(“<“)) != –1) {
  86. strline = strline.substring(beginIndex+1, endIndex);
  87. System.out.println(“[歌曲名] “ + strline);
  88. }
  89. continue;
  90. }
  91. // 2.查找歌曲链接
  92. if ((beginIndex = strline.indexOf(“onclick=\”window.open(“)) != –1
  93. && (beginIndex = strline.indexOf(“http://mp3.sogou.com/down.so”)) != –1
  94. && (endIndex = strline.indexOf(“‘,”)) != –1) {
  95. strline = strline.substring(beginIndex, endIndex);
  96. getMP3URL(strline);
  97. }
  98. }
  99. htmlSocket.close();
  100. }
  101. /**
  102. * 分析歌曲链接找到其真实网址
  103. */
  104. private void getMP3URL(String surl) throws Exception {
  105. String strline = “”;
  106. urlSocket.create(surl);
  107. BufferedReader brIn = urlSocket.getBufferedReader();
  108. int beginIndex, endIndex;
  109. while ((strline = brIn.readLine()) != null) {
  110. if ((beginIndex = strline.indexOf(“http://”)) != –1
  111. && (endIndex = strline.indexOf(“.mp3”)) != –1) {
  112. strline = strline.substring(beginIndex, endIndex + 4);
  113. System.out.println(strline);    //打印MP3的真实地址
  114. //播放或下载的代码放这……;
  115. break;
  116. }
  117. }
  118. urlSocket.close();
  119. }
  120. }

另外,http://mp3.sogou.com/的:

  • 歌曲TOP100 http://music.sogou.com/song/topsong.html
  • 单曲抢先听 http://music.sogou.com/song/newnew_1.html
  • 劲爆dj音乐榜 http://music.sogou.com/song/newdj_1
  • 欧美流行榜 http://music.sogou.com/song/enpop_1.html

等页面的搜索方法跟上面的是一样的,并不建议你写代码到 http://music.sogou.com/song/目录下搜索*.html并用上述方法解析(就是实现传说中的网络蜘蛛的一部分功能),这样一顿海搜不礼貌哈,别人藏着掖着的就是不想让你查找到其MP3的网址的嘛。 这些页面上的歌曲经常更新,固定查找某一页面的MP3也可以听到新歌,不错了。一边干活一边听听歌,挺不错的哦~~


MP3网站的加密方法经常变更,到目前为止这种方法可用,不能保证一直可用。应用示例到我的主页http://jmp123.sf.net/ 下载最新的MP3播放程序,程序(jar包)用法见其中的readme.txt。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏