[html] view plaincopy在CODE上查看代码片派生到我的代码片上面XML中,需要注意的是<Music>节点中的参数,说明如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[TITLE]]></Title>
<Description><![CDATA[DESCRIPTION]]></Description>
<MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
<HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
<ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
</Music>
</xml>
[html] view plaincopy在CODE上查看代码片派生到我的代码片返回结果中的主要参数说明如下:
// GB2312编码的音乐搜索链接
http://box.zhangmen.baidu.com/x?op=12&count=1&title=%CF%E0%D0%C5%D7%D4%BC%BA$$%C1%E3%B5%E3%C0%D6%B6%D3$$$$
// UTF-8编码的音乐搜索链接
http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E7%9B%B8%E4%BF%A1%E8%87%AA%E5%B7%B1$$%E9%9B%B6%E7%82%B9%E4%B9%90%E9%98%9F$$$$
通过浏览器访问上面的地址,返回的是如下格式的XML数据:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<result>
<count>1</count>
<url>
<encode>
<![CDATA[http://zhangmenshiting.baidu.com/data2/music/44277542/ZWZla2xra2pfn6NndK6ap5WXcJVob5puZ2trbWprmnBjZ2xolpeZa2drZmWZmZmdl2hjZWhvnWlpYmRtZmltcGplZFqin5t1YWBobW5qcGxia2NmZ2twbzE$]]>
</encode>
<decode>
<![CDATA[44277542.mp3?xcode=a39c6698955c82594aab36931dcbef60139f180191368931&mid=0.59949419022597]]>
</decode>
<type>8</type>
<lrcid>64644</lrcid>
<flag>1</flag>
</url>
<durl>
<encode><![CDATA[http://zhangmenshiting2.baidu.com/data2/music/44277530/ZWZla2xramhfn6NndK6ap5WXcJVob5puZ2trb
WprmnBjZ2xolpeZa2drZmWZmZmdl2hjaGhvnZ5qlGRpbpedamJla1qin5t1YWBobW5qcGxia2NmZ2twbzE$]]>
</encode>
<decode>
<![CDATA[44277530.mp3?xcode=a39c6698955c82594aab36931dcbef60439ff9b159af2138&mid=0.59949419022597]]>
</decode>
<type>8</type>
<lrcid>64644</lrcid>
<flag>1</flag>
</durl>
<p2p>
<hash>022bc0fbf66cd19bea96db49634419dc2600393f</hash>
<url>
<![CDATA[ ]]>
</url>
<type>mp3</type>
<size>5236902</size>
<bitrate>192</bitrate>
</p2p>
</result>
[html] view plaincopy在CODE上查看代码片派生到我的代码片参数xcode可以理解为随机验证码,每次搜索得到的值都不一样,如果不带该参数会报未授权异常“401 Authorization Required”。需要注意的是,xcode是有时间限制的,超过限制再访问链接会报异常:{"Error":{"code":"2","Message":"object not exists","LogId":"3456414897"}}。在xcode有效的前提下,通过浏览器访问上面的音乐链接,会提示下载音乐。
// 普通品质音乐链接
http://zhangmenshiting.baidu.com/data2/music/44277542/44277542.mp3?xcode=a39c6698955c82594aab36931dcbef60139f180191368931
// 高品质音乐链接
http://zhangmenshiting2.baidu.com/data2/music/44277530/44277530.mp3?xcode=a39c6698955c82594aab36931dcbef60439ff9b159af2138
[java] view plaincopy在CODE上查看代码片派生到我的代码片下面对代码进行简单的说明:
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.liufeng.course.message.resp.Music;
/**
* 百度音乐搜索API操作类
*
* @author liufeng
* @date 2013-12-09
*/
public class BaiduMusicService {
/**
* 根据名称和作者搜索音乐
*
* @param musicTitle 音乐名称
* @param musicAuthor 音乐作者
* @return Music
*/
public static Music searchMusic(String musicTitle, String musicAuthor) {
// 百度音乐搜索地址
String requestUrl = "http://box.zhangmen.baidu.com/x?op=12&count=1&title={TITLE}$${AUTHOR}$$$$";
// 对音乐名称、作者进URL编码
requestUrl = requestUrl.replace("{TITLE}", urlEncodeUTF8(musicTitle));
requestUrl = requestUrl.replace("{AUTHOR}", urlEncodeUTF8(musicAuthor));
// 处理名称、作者中间的空格
requestUrl = requestUrl.replaceAll("\\+", "%20");
// 查询并获取返回结果
InputStream inputStream = httpRequest(requestUrl);
// 从返回结果中解析出Music
Music music = parseMusic(inputStream);
// 如果music不为null,设置标题和描述
if (null != music) {
music.setTitle(musicTitle);
// 如果作者不为"",将描述设置为作者
if (!"".equals(musicAuthor))
music.setDescription(musicAuthor);
else
music.setDescription("来自百度音乐");
}
return music;
}
/**
* UTF-8编码
*
* @param source
* @return
*/
private static String urlEncodeUTF8(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* 发送http请求取得返回的输入流
*
* @param requestUrl 请求地址
* @return InputStream
*/
private static InputStream httpRequest(String requestUrl) {
InputStream inputStream = null;
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoInput(true);
httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect();
// 获得返回的输入流
inputStream = httpUrlConn.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
/**
* 解析音乐参数
*
* @param inputStream 百度音乐搜索API返回的输入流
* @return Music
*/
@SuppressWarnings("unchecked")
private static Music parseMusic(InputStream inputStream) {
Music music = null;
try {
// 使用dom4j解析xml字符串
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// count表示搜索到的歌曲数
String count = root.element("count").getText();
// 当搜索到的歌曲数大于0时
if (!"0".equals(count)) {
// 普通品质
List<Element> urlList = root.elements("url");
// 高品质
List<Element> durlList = root.elements("durl");
// 普通品质的encode、decode
String urlEncode = urlList.get(0).element("encode").getText();
String urlDecode = urlList.get(0).element("decode").getText();
// 普通品质音乐的URL
String url = urlEncode.substring(0, urlEncode.lastIndexOf("/") + 1) + urlDecode;
if (-1 != urlDecode.lastIndexOf("&"))
url = urlEncode.substring(0, urlEncode.lastIndexOf("/") + 1) + urlDecode.substring(0, urlDecode.lastIndexOf("&"));
// 默认情况下,高音质音乐的URL 等于 普通品质音乐的URL
String durl = url;
// 判断高品质节点是否存在
Element durlElement = durlList.get(0).element("encode");
if (null != durlElement) {
// 高品质的encode、decode
String durlEncode = durlList.get(0).element("encode").getText();
String durlDecode = durlList.get(0).element("decode").getText();
// 高品质音乐的URL
durl = durlEncode.substring(0, durlEncode.lastIndexOf("/") + 1) + durlDecode;
if (-1 != durlDecode.lastIndexOf("&"))
durl = durlEncode.substring(0, durlEncode.lastIndexOf("/") + 1) + durlDecode.substring(0, durlDecode.lastIndexOf("&"));
}
music = new Music();
// 设置普通品质音乐链接
music.setMusicUrl(url);
// 设置高品质音乐链接
music.setHQMusicUrl(durl);
}
} catch (Exception e) {
e.printStackTrace();
}
return music;
}
// 测试方法
public static void main(String[] args) {
Music music = searchMusic("相信自己", "零点乐队");
System.out.println("音乐名称:" + music.getTitle());
System.out.println("音乐描述:" + music.getDescription());
System.out.println("普通品质链接:" + music.getMusicUrl());
System.out.println("高品质链接:" + music.getHQMusicUrl());
}
}
[java] view plaincopy在CODE上查看代码片派生到我的代码片