现在听歌用百度随心听,感觉里面的歌还不错,把喜欢的歌都存到百度云音乐中去了,可是到想把百度云音乐中的歌曲下载到本地时,发现它竟然没有提供批量下载的功能,于是自己动手写代码来实现批量下载歌曲。
package pml; import java.io.*; import java.net.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class BaiduCloundMusic { public static void main(String[] args) throws Exception { BaiduCloundMusic bcm = new BaiduCloundMusic(); bcm.login("username", "password"); bcm.downloadAll(); } private String cookieValue = ""; private String downloadDirectory = "d:/baidumusic"; /** * 登陆百度,其他方法调用之前需要先登陆 * @param username * @param password */ public void login(String username, String password){ try { URL url=new URL("http://www.baidu.com/"); HttpURLConnection httpUrlConnection=(HttpURLConnection)url.openConnection(); httpUrlConnection.setRequestMethod("GET"); String cookie1=httpUrlConnection.getHeaderField("Set-Cookie"); //System.out.println("cookie1:"+cookie1); cookie1 = cookie1.substring(0,45); url=new URL("https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true"); httpUrlConnection=(HttpURLConnection)url.openConnection(); httpUrlConnection.setRequestMethod("GET"); httpUrlConnection.setRequestProperty("Cookie", cookie1); //httpUrlConnection.connect(); String cookie2 = httpUrlConnection.getHeaderField("Set-Cookie"); System.out.println("cookie2:"+cookie2); cookie2 = cookie2.substring(0,11); String response = getResponse(httpUrlConnection.getInputStream()); //System.out.println(response); Pattern pattern = Pattern.compile("token='(\\w+)'"); Matcher matcher = pattern.matcher(response); matcher.find(); String token = matcher.group(1); url=new URL("https://passport.baidu.com/v2/api/?login"); httpUrlConnection=(HttpURLConnection)url.openConnection(); httpUrlConnection.setRequestMethod("POST"); //System.out.println(cookie1+"; "+cookie2); httpUrlConnection.setRequestProperty("Cookie", cookie1+"; "+cookie2); httpUrlConnection.setDoOutput(true); //System.out.println(token); String querystring = "loginType=1&tpl=mn&token="+token+"&username="+username+ "&password="+password+"&mem_pass=on"; httpUrlConnection.getOutputStream().write(querystring.getBytes()); httpUrlConnection.getOutputStream().flush(); httpUrlConnection.getOutputStream().close(); response = getResponse(httpUrlConnection.getInputStream()); //System.out.println(response); //String cookie3=httpUrlConnection.getHeaderField("Set-Cookie"); //System.out.println("cookie3:"+cookie3); //获取登陆后的cookie Map<String, List<String>> hfs=httpUrlConnection.getHeaderFields(); List<String> loginCookies = hfs.get("Set-Cookie"); for(String cookie:loginCookies){ cookieValue += cookie.substring(0,cookie.indexOf(";")+1); } } catch (Exception e) { e.printStackTrace(); } } /** * 获得歌曲列表 * @return [{ngId:'',songName:'',artistName:''},...] */ public List<JSONObject> getSongList(){ List<JSONObject> songList = new ArrayList<JSONObject>(); //解析歌曲列表 String link = "http://yinyueyun.baidu.com/data/cloud/collection?type=song&start=0&size=200"; String response = getResponse(link); JSONArray songIds = JSONObject.fromObject(response).getJSONObject("data").getJSONArray("songList"); for(int i=0;i<songIds.size();i++){ JSONObject songInfo = getSongInfo(songIds.getJSONObject(i).getString("id")); songList.add(songInfo); } return songList; } public void downloadAll(){ List<JSONObject> songList = getSongList(); for(int i=0;i<songList.size();i++){ String songId = songList.get(i).getString("songId"); download(songId); } } public File download(String songId){ try { String maxRate = getMaxRate(songId); JSONObject songInfo = getSongInfo(songId); //以歌手名字+歌曲名称组成文件名,格式:歌手 - 歌曲名称 String filename = songInfo.getString("artistName")+" - "+songInfo.getString("songName"); String link = "http://yinyueyun.baidu.com/data/cloud/downloadsongfile?songIds="+songId+"&rate="+maxRate; URL urlObject=new URL(link); HttpURLConnection httpUrlConnection=(HttpURLConnection)urlObject.openConnection(); httpUrlConnection.setRequestMethod("GET"); httpUrlConnection.setDoOutput(true); httpUrlConnection.setRequestProperty("Cookie", cookieValue); String disposition = httpUrlConnection.getHeaderField("Content-Disposition"); disposition = disposition.replaceAll("\"", ""); //此转码经测试发现有些是UTF-8编码,有些是GBK编码,所以文件名采用另外方式获得 //disposition = new String(disposition.getBytes("iso-8859-1"),"UTF-8"); //根据disposition中信息确定歌曲格式 String suffix = disposition.substring(disposition.lastIndexOf(".")); //System.out.println(disposition); InputStream inputStream= httpUrlConnection.getInputStream(); File file = new File(downloadDirectory+"/"+filename+suffix); FileOutputStream fos = new FileOutputStream(file); byte[] buf = new byte[4096]; int read=0; while((read=inputStream.read(buf)) > 0){ fos.write(buf,0,read); } fos.flush(); fos.close(); inputStream.close(); //System.out.println("完成<"+file.getName()+">歌曲下载!"); return file; }catch (Exception e) { e.printStackTrace(); return null; } } /** * 获得歌曲的最大码率 * @param songId * @return */ public String getMaxRate(String songId){ String link = "http://yinyueyun.baidu.com/data/cloud/download?songIds="+songId; String response = getResponse(link); JSONObject rates = JSONObject.fromObject(response).getJSONObject("data").getJSONObject("data"); String maxRate = (rates.getString("320").length()>0?"320":(rates.getString("192").length()>0?"192":"128")); return maxRate; } /** * 获得歌曲详细信息 * @param songId * @return {songId:'',songName:'',artistName:''} */ public JSONObject getSongInfo(String songId){ String link = "http://yinyueyun.baidu.com/data/cloud/songinfo?songIds="+songId; String response = getResponse(link); JSONObject songInfo = JSONObject.fromObject(response).getJSONObject("data").getJSONArray("songList").getJSONObject(0); return songInfo; } private String getResponse(String link){ try { URL urlObject=new URL(link); HttpURLConnection httpUrlConnection=(HttpURLConnection)urlObject.openConnection(); httpUrlConnection.setRequestMethod("GET"); httpUrlConnection.setDoOutput(true); httpUrlConnection.setRequestProperty("Cookie", cookieValue); return getResponse(httpUrlConnection.getInputStream()); }catch (Exception e) { e.printStackTrace(); } return ""; } private String getResponse(InputStream in){ StringBuilder response=new StringBuilder(); try{ BufferedReader rd = new BufferedReader(new InputStreamReader(in)); char[] buf = new char[1024]; int read=0; while((read=rd.read(buf)) > 0){ response.append(buf,0,read); } rd.close(); in.close(); }catch (Exception e) { e.printStackTrace(); } return response.toString(); } }
相关推荐
主要介绍了java获取百度网盘真实下载链接的方法,涉及java针对URL操作及页面分析的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
java做的仿百度云盘项目,包括上传下载,云盘空间展示等功能。项目封装了很多使用的utils,拿来即用。
因为百度云bcs的文件一次只能删除20个,而且没删除一次网页需要刷新一次,对于bcs中文件太多且需要删除全部文件的用户来说,该工具可以满足您的需求。 使用java swing 编写,免积分给大家...关键字:903010797
如何在一些没有批量下载按钮的网址(只有单独下载按钮)批量下载文件。详情见我的博客https://blog.csdn.net/goolete/article/details/86776880
对图片进行水印处理,利用TESS4J识别图片并提取信息生成excel表格。里面有字库文件所以占用空间较大。 说明:https://blog.csdn.net/xlantian/article/details/80789115
ASP.NET WEB版阿里云操作示例 .NET Framework 4.0 VS2010 开发,全源代码 主要功能:单文件上传、批量上传、分页预览
感谢java交流群主的无私贡献,整理了这样一份非常好的资源。 java全套视频,计算机视频...所以建议你下载资源的时候,下载一个叫做百度云管家的客户端(需要免费注册一个百度账号),这样下载就很快了,可以批量下载的
│ Java面试题64:有没有使用过云主机.mp4 │ Java面试题65:数据库优化方面的事情.mp4 │ Java面试题66:如果查询和定位慢查询.mp4 │ Java面试题67:数据库优化之数据库表设计遵循范式.mp4 │ Java面试题68:选择...
Excel批量导入.txtJava命令详解.txtlinux命令大全.txtXPath说明.txt日期验证.txt正则.TXTJavaServlets.chm
文件批量重命名软件 同时可以批量修改文件属性, 简单实用, 分享给喜欢整理文件, 追求完美的人。
基于swing开发,可以批量签到,需要另行下载两个jar包(common-logging.jar,log4j.jar)
目录: 网盘文件永久连接 ...27-29 大数据离线批量场景化解决方案 30-34 大数据实时检索场景化解决方案 35-37 大数据实时流处理场景化解决方案 38 Readis.1 39-42 大数据实时流处理场景化解决方案 43 ReadisB
GC调优步骤: 1、打印GC日志 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log Tomcat则直接加在JAVA_OPTS变量里 2、分析日志得到关键性指标 3、分析GC原因,调优JVM参数
CoolFormat源代码格式化是一款C\C++\C#\CSS\...使用介绍: 1.全新Ribbon界面,操作方便 2.支持全部、部分、批量格式化方式 3.可自定义的代码格式化风格 4.支持代码高亮到网页、博客
ShuzhenAnalyzer-1.1.3是一款用java写的基于字典的中文分词器,可以与Lucene(目前只测试了与Lucene2.2.0版本一起使用的情况,其他版本Lucene版本未测试过)一起使用来构建搜索引擎系统 其特性如下: 1、基于字典...
采用了百度OCR的API和百度翻译API,实现了拍照,选图,批量图片识别提取文字,表格识别,图片剪裁,支持分享,翻译,校对,记录识别历史等功能,还使用了微信小程序云函数进行识别后文字的安全鉴定。###(扫码下方...
qiniu-suits (qsuits)qiniu-suits-java 是一个多线程的云存储 api tools (base-qiniu),通过设计的能够高效并发列举云存储空间的资源列表(支持七牛云/阿里云/腾讯云/AWS S3/又拍云/华为云/百度云等,支持 S3 接口的...
目前支持的类型:模板消息-公众号、模板消息-小程序、微信客服消息、微信企业号/企业微信消息、阿里云短信、阿里大于模板短信 、腾讯云短信、云片网短信、E-Mail、钉钉、百度云短信、华为云短信、又拍云短信、七牛云...