songtaste是一个非常好的音乐网站,主要是基于SNS的音乐分享主题,让小众的好音乐得到更好的分享,遗憾的是在国内版权保护不力,公司于2015年关闭,现在的首页:

但是点击音乐还是可以找到音乐列表:

任意点击进入一个音乐播放的页面:

无法播放,查看页面的代码:

原来是被注释掉了,分析音乐下载的逻辑:
音乐url请求资源逻辑:

function flashplay(strURL,st_songid,t) {$.ajax({type:'POST',url:'/time.php',cache:false,data:'str='+strURL+'&sid='+st_songid+'&t='+t,dataType:'html',success:function(data){if(data){   var obj = {name:"seeing ghosts〈 小小迷幻系列⒈ 〉",url:data,isShowLogo:"0" ,isAutoReplay:1, isAutoPlay:0};setSongInfo(obj);if(data.indexOf('duomi.com') > 0){$("#show_logo").show();    }       }           },      error:function(data){}   });}

关键在于获取strURL,st_songid,t三个参数。这三个参数随着音乐的ID生成。然后解析页面标签。
最后可以拿到音乐源文件的url,用流的方式下载到本地,完整java代码:

public class Songtaste {private String strUrl, st_songid, t;private String musicName;private static final String outFilePath = "H:" + File.separator + "songtaste download" + File.separator;// 文件后缀public static final String FILE_SUFFIX = ".mp3";// 信息分割public static final String INFO_SEPARETE = "-------";public static void main(String[] args) {Songtaste songtaste = new Songtaste();boolean isDownload = songtaste.downloadFromSongtastePageUrl("http://www.songtaste.com/song/650417/");if (isDownload)System.out.println("下载成功");elseSystem.out.println("下载失败");}public boolean downloadFromSongtastePageUrl(String url) {try {String htmlContext = this.sendRequest(url);this.setDuoMiUrlBySongtasteHtml(htmlContext);String duomiUrl = getDuomiUrl();download(duomiUrl);} catch (Exception ex) {System.out.println("错误信息" + ex.getMessage());return false;}return true;}private String getDuomiUrl() throws Exception {String requestDuomiUrl = "http://www.songtaste.com" + "/time.php?str="+ this.strUrl + "&sid=" + this.st_songid + "&t=" + this.t;return this.sendRequest(requestDuomiUrl);}// 处理下载任务public void download(String downloadUrl) throws Exception {if (downloadUrl.contains("404.html")) {throw new Exception("歌曲资源不存在");}URL url = new URL(downloadUrl);System.out.println(Songtaste.INFO_SEPARETE);System.out.println("下载链接为:" + downloadUrl);System.out.println(Songtaste.INFO_SEPARETE);URLConnection connection = url.openConnection();connection.connect();// 读取字节流写入文件InputStream in = connection.getInputStream();System.out.println(Songtaste.INFO_SEPARETE);System.out.println("文件尺寸为:" + (double) connection.getContentLength()/ (1024 * 1024) + "MB");System.out.println(Songtaste.INFO_SEPARETE);byte[] b = new byte[1024 * 10];File file = new File(Songtaste.outFilePath + this.musicName + Songtaste.FILE_SUFFIX);if (file.exists()) {System.out.println("文件已存在");return;}FileOutputStream out = new FileOutputStream(file);int len;int sum = 0;int size = connection.getContentLength();while ((len = in.read(b)) > 0) {out.write(b, 0, len);sum += len;System.out.println("已下载" + (sum * 100 / size) + "%");}in.close();out.close();}// 获取向多米发送请求的urlpublic void setDuoMiUrlBySongtasteHtml(String htmlContext) {// 获取3个参数strURL,st_songid,tString begainString = "<a href=\"javascript:playmedia1('playicon','player', '";int begain = htmlContext.indexOf(begainString);begain += begainString.length();int end = htmlContext.indexOf(");ListenLog(");String[] params = htmlContext.substring(begain, end).replace(" ", "").split(",");this.strUrl = params[0].substring(0, params[0].length() - 1);this.st_songid = params[5].substring(1, params[5].length() - 1);this.t = params[6];// 获取歌名String name = htmlContext.substring(htmlContext.indexOf("mid_tit")+ "mid_tit".length() + 2,htmlContext.indexOf("</p>", htmlContext.indexOf("mid_tit")));this.musicName = name;System.out.println(Songtaste.INFO_SEPARETE);System.out.println("歌名为:" + name);System.out.println(Songtaste.INFO_SEPARETE);}public String sendRequest(String urlString) throws Exception {System.out.println(Songtaste.INFO_SEPARETE);System.out.println("发送url请求" + urlString);System.out.println(Songtaste.INFO_SEPARETE);URL url = new URL(urlString);URLConnection connection = url.openConnection();connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");connection.setRequestProperty("connection", "keep-alive");connection.setRequestProperty("accept", "*/*");connection.connect();BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String oneLine = null;StringBuffer htmlContext = new StringBuffer();while ((oneLine = reader.readLine()) != null) {if (oneLine.length() > 2 && (oneLine.substring(0, 2).equals("//"))) {oneLine = oneLine.substring(2);}htmlContext.append(oneLine).append("\n");}reader.close();return htmlContext.toString();}
}

在main函数中替换想要下载的详情连接

-------
发送url请求http://www.songtaste.com/song/1620684/
-------
-------
歌名为:声をきかせて
-------
-------
发送url请求http://www.songtaste.com/time.php?str=f29562a30e0c8dca8ee79f77e930562eebbc55988262bfeecc25d11cb385297633163f17aa9d4dd82f1ced3fe51ffc51&sid=1620684&t=1
-------
-------
下载链接为:http://mb.songtaste.com/201606191247/24300369f204365ce0f56d54ab528369/b/b8/b80c4cfb07ddb0c705b4ad48eaca1cb7.mp3-------
-------
文件尺寸为:3.94814395904541MB
-------
已下载0%
....
已下载99%
已下载100%
下载成功

如果你也是songtaste爱好者,可以加入群:33305126。欢迎联系。

songtaste资源下载程序相关推荐

  1. 医学教育网批量资源下载程序之——完成

    2019独角兽企业重金招聘Python工程师标准>>> 大家好! 经过好长时间的拆腾,终于实现了 "医学教育网批量资源下程序" . 相关的博文: 医学教育网批量资 ...

  2. Fork and Join: Java也可以轻松地编写并发程序 原文地址 作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zi

    Fork and Join: Java也可以轻松地编写并发程序 原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) ...

  3. 星宿UI源码V1.3 wordpress系统资讯资源下载小程序源码开源下载

    更新内容: 新增:金刚区支持跳转业务域名(个人小程序不支持) 新增:wordpress后台公众号文章(焦点)开关 新增:资源下载提取密码 新增:支持wordpress文章中添加小程序流量主AD,图组 ...

  4. 小程序资源下载、解压、保存到本地及本地文件的使用

    小程序对资源存储有限一般10M,不要超过限制 思路解析:将资源保存到本地,首先 需要获取到 本地路径 ,然后将文件下载(下载前需要判断文件是否更新,第一次和更新则需要下载,如果存在之前的资源则将其删除 ...

  5. 利用AVR单片机 专用下载 USBtinyISP对Arduino UNO下载程序

    简 介: 测试了利用USBtinyISP对于Arduino UNO,也就是ATmega系列的单片机下载Bootloader的过程.通过测试可以看到,利用USBtinyISP可以更快的下载ATmega系 ...

  6. 使用单片机对STC8G,8H,8A进行ISP下载程序

    通过第三方程序实现对STC单片机的程序下载,可以方便进行现场的调试和更新.特别是对于设计远程程序更新.无线程序下载与调试等功能有帮助. 本文给出了下载相关的一些程序设计. STC单片机ISP下载协议 ...

  7. 深圳.Net俱乐部2.26活动资源下载之——从SmartClient到ClickOnce

    今天讲座的PPT,应广大听众要求加了一些相关资源的连接.PPT下载  程序 种子 转载于:https://www.cnblogs.com/szzhouke/archive/2006/02/26/338 ...

  8. 优化asp.net ajax的脚本资源下载

    大家好像都有一种同感,使用了asp.net ajax的网站的速度好像都不是特别快.目前维护的网站,页面执行时间在0.1秒上下,页面本身的HTML也在50K左右,经常都是页面标题已经显示出来一段时间了, ...

  9. SourceTree安装破姐添加SSH KEY以及拉取代码教程(附资源下载)

    场景 Source Tree 拥有可视化界面的项目版本控制软件,适用于git项目管理 安装包以及破姐资源见文末. 注: 博客: https://blog.csdn.net/badao_liumang_ ...

最新文章

  1. laravel CURD facade原始SQL
  2. SAP FSM 学习笔记(二) : SAP FSM的微信接入
  3. tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...
  4. php进程间通信 yoc_PHP 进程间通信各种通信方式间的优劣之分??
  5. spring源码分析第二天------spring系统概述以及IOC实现原理
  6. 25岁什么都不会进入软件测试晚吗?别让假努力毁了你...
  7. mac10.11重装php,macosx-10.11-更新osx10.11后,删除自带php版本,重新编译php5.5.29,到make阶段提示错误。...
  8. 首个完全武器化的 Spectre Exploit 现身
  9. Iso时间转java instant,Java /将ISO-8601(2010-12-16T13:33:50.513852Z)转换为
  10. 【转】flex中的labelFunction(combox和dataGrid)
  11. 【忆往昔】我欠老牛两本书
  12. 数据结构一些常见术语的中英文对照
  13. 致远V8.1 协同 最新版
  14. easypoi 批量导出_浅谈easypoi快速实现excel批量导入
  15. 飞鱼星流控王VF12路由器使用体验
  16. 机器学习入门算法及其java实现-EM(Expectation Maxium)算法
  17. OPEN-WRT老毛子固件的无线中继设置建议
  18. 对话行癫:解密阿里云顶层设计和底层逻辑 1
  19. 6846. 【2020.11.02提高组模拟】旅人1970
  20. calcite是什么

热门文章

  1. string 函数 java_Java String 常用函数
  2. 谁考了第k名c语言源代码,排序入门练习题3 谁考了第k名 题解
  3. ssm毕设项目校园快递系统q9061(java+VUE+Mybatis+Maven+Mysql+sprnig)
  4. OVS learn学习
  5. Rust入坑指南:朝生暮死
  6. 京准讲述北斗授时产品(NTP时钟服务器)应用及原理
  7. Java 汉字转拼音 完整代码实例(包含多音字解决方案)
  8. 【老徐子杰】PDF转图片方法(解决中文乱码)
  9. vue3+typescript 写小学算术出题器web应用(一)
  10. 项目工程重启后,用RedisTemplate获取不了在redis中存在的数据