`
pml346680914
  • 浏览: 7043 次
  • 性别: Icon_minigender_1
  • 来自: 怀化
社区版块
存档分类
最新评论

用java实现批量下载百度云中的音乐

    博客分类:
  • java
 
阅读更多

现在听歌用百度随心听,感觉里面的歌还不错,把喜欢的歌都存到百度云音乐中去了,可是到想把百度云音乐中的歌曲下载到本地时,发现它竟然没有提供批量下载的功能,于是自己动手写代码来实现批量下载歌曲。

 

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();
	}
}
  • lib.rar (1.1 MB)
  • 描述: 相关jar包下载
  • 下载次数: 17
分享到:
评论

相关推荐

    java获取百度网盘真实下载链接的方法

    在Java中,可以使用`java.net.HttpURLConnection`类来实现这一功能。`HttpRequest`类中的`getData`方法就是一个简单的HTTP GET请求示例,它创建了一个`URL`对象,然后通过`openConnection()`方法打开与该URL的连接,...

    提取文件中百度云链接与提取码的java源码

    本篇文章将聚焦于一个具体的问题:如何使用Java编程语言从网页中提取百度云链接和提取码,从而实现批量下载。 首先,我们需要理解百度云链接的工作机制。通常,百度云链接是一种指向特定文件或文件夹的共享链接,...

    java获取百度网盘分享的真实地址并下载

    在Java编程环境中,实现从百度网盘获取共享文件的真实下载地址并进行下载涉及多个关键知识点。首先,我们需要了解百度网盘的API接口以及如何通过网络请求来模拟用户行为。以下是一份详细的步骤和相关技术介绍: 1. ...

    Java 实现的微云盘系统(仿百度云盘)

    【Java实现的微云盘系统】是一个基于Java技术构建的在线存储服务,旨在模仿百度云盘的功能和用户体验。该项目的核心目标是提供一个便捷、安全的平台,让用户能够上传、下载文件,并查看自己的云盘空间使用情况。下面...

    百度云推送 java端代码

    综上所述,实现百度云推送的Java服务器端代码,需要理解百度云推送的API接口,使用提供的SDK进行设备注册、消息发送、标签管理等操作,并处理回调和错误。同时,还需要关注安全性、性能和用户体验。通过这些方法,...

    百度云推送代码

    使用百度云推送服务,开发者可以实现以下主要功能: 1. **实时消息推送**:通过API接口,开发者可以在服务器端发送消息到客户端,确保用户及时获取新内容。 2. **批量推送**:支持向大量设备或特定用户群体一次性...

    批量删除百度云存储bcs文件源码ABCDEFG

    因为百度云bcs的文件一次只能删除20个,而且没删除一次网页需要刷新一次,对于bcs中文件太多且需要删除全部文件的用户来说,该工具可以满足您的需求。 使用java swing 编写,免积分给大家...关键字:903010797

    java百度语音sdk

    Java百度语音SDK是一款专为Java开发者设计的工具包,它使得在Java应用程序中集成和使用百度的语音识别技术变得简单易行。通过这个SDK,开发者能够实现语音输入到文本的转换,极大地提升了人机交互的体验,特别是在...

    java实现提取图片文字信息并生成表格

    对图片进行水印处理,利用TESS4J识别图片并提取信息生成excel表格。里面有字库文件所以占用空间较大。 说明:https://blog.csdn.net/xlantian/article/details/80789115

    Java EE调用百度API,进行人脸识别登陆

    在本项目中,我们主要探讨如何使用Java EE技术结合百度的人脸识别API,实现一个基于人脸识别的登录系统。首先,我们需要了解几个关键概念和技术。 **Java EE**:全称为Java Platform, Enterprise Edition,是一个...

    阿里云存储OSS操作示例(单、批量上传、删除、分页预览)

    在本示例中,我们将详细探讨如何使用ASP.NET Web版进行阿里云OSS的操作,包括单个文件上传、批量上传以及分页预览的功能。 首先,让我们了解`OssClient`,它是阿里云官方提供的SDK中的核心类,用于与OSS服务进行...

    Java的txt和chm电子书打包下载

    标题中的“Java的txt和chm电子书打包下载”表明这是一个集合,包含了关于Java编程的多个文本文件(.txt)和帮助文档(.chm)。 首先,我们看到的.txt文件包括了“Excel批量导入.txt”,这可能涵盖了如何使用Java...

    java朗读中文字符串.zip

    总的来说,"java朗读中文字符串.zip"中的示例可能涵盖了以上这些知识点,通过阅读和学习这些代码,你可以了解如何在Java环境中实现中文文本的语音合成。对于学习和开发涉及语音交互的Java应用,这是一个非常实用的...

    安卓Android源码——基于百度云推送的IM项目.zip

    2. **百度云推送**:百度云推送是百度提供的云服务,允许开发者实现消息推送功能,包括实时消息、批量消息、透传消息等。它通过集成SDK,可以在无需维护服务器的情况下,为应用提供稳定的消息推送服务。 3. **即时...

    java开发的百度贴吧自动签到源码

    【Java开发的百度贴吧自动签到源码】是一款利用Swing图形用户界面库构建的应用程序,主要用于方便用户批量对百度贴吧进行自动签到。这款工具的出现,旨在解决用户逐一手动签到的繁琐问题,提高了签到效率,尤其对于...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题64:有没有使用过云主机.mp4 │ Java面试题65:数据库优化方面的事情.mp4 │ Java面试题66:如果查询和定位慢查询.mp4 │ Java面试题67:数据库优化之数据库表设计遵循范式.mp4 │ Java面试题68:选择...

    文件批量重命名 文件标签批量修改 文件批量改名 绿色免安装

    本文将详细介绍如何使用"文件批量重命名"软件来实现这一目标,特别是针对批量重命名和标签批量修改的功能。 批量重命名是文件管理中的一个重要功能,尤其对于那些需要整理大量文件的用户来说。这个软件能够帮助我们...

    腾讯云sms短信服务sdk含核心jar包:qcloudsms-1.0.5.jar

    使用此SDK,开发者可以快速集成到自己的Java项目中,实现短信服务功能。 ### 2. 引入SDK #### 2.1 Gradle集成 在Java项目中,如果使用Gradle作为构建工具,引入SDK非常简单。只需在项目的`build.gradle`文件中...

    基于Java语言的WePush批量消息推送工具设计源码

    本项目是一款基于Java语言的WePush批量消息推送工具设计源码,共包含468个文件,涵盖215个Java源文件、116个PNG图片文件、64个表单文件、26个SVG矢量图形文件、13个XML配置文件、7个JSON数据文件、6个Markdown文档、...

Global site tag (gtag.js) - Google Analytics