首先,得感谢柳峰老师的书,我是看了那本书,才知道有这么一个接口的。
OK,上两篇已经把微信聊天机器人讲完了,今天我们来讲讲微信点歌系统。
相信很多同学都喜欢听歌,但是.....我们也知道,现在的手机听歌APP越来越多,所以,我们用微信做点歌系统的话,有不足,也有优点。不足点为:功能不如专门的听歌软件强大,也没那么全面,无法下载。优点:不需要专门的听歌软件,只需要有微信即可(ps:个人观点)。为了完善我们的一个功能,我觉得点歌,还是很有必要的,so,那就不兜圈子了,进入正题。
给出接口:http://box.zhangmen.baidu.com/x?op=12&count=1&title={TITLE}$${AUTHOR}$$$$,这个是大掌门音乐网的隐藏接口,并没有公布(从柳峰老师的书中得知),根据接口我们可以知道,需要传输的参数,应该就是这个TITLE,歌曲名,和这个AUTHOR,演唱者了。所以这两个参数,就应该是用户传过来的值,我们只需要解析这个接口的响应值,然后拼接音乐格式的xml,然后发给用户即可,步骤如下:
1、创建music类
/**
@auther yc
*/
public class Music {
private String title;<span style="white-space:pre"> </span>//歌曲名
private String description;<span style="white-space:pre"> </span>//描述
private String musicUrl;<span style="white-space:pre"> </span>//音乐播放地址
private String hqMusicUrl;<span style="white-space:pre"> </span>//高清<span style="font-family: Arial, Helvetica, sans-serif;">音乐播放地址</span>
private String thumbMediaId;<span style="white-space:pre"> </span>//小图标
public Music() {
super();
}
public Music(String title, String description, String musicUrl,
String hqMusicUrl, String thumbMediaId) {
super();
this.title = title;
this.description = description;
this.musicUrl = musicUrl;
this.hqMusicUrl = hqMusicUrl;
this.thumbMediaId = thumbMediaId;
}
@XmlCDATA
@XmlElement(name = "Title")
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@XmlCDATA
@XmlElement(name = "Description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@XmlCDATA
@XmlElement(name = "MusicUrl")
public String getMusicUrl() {
return musicUrl;
}
public void setMusicUrl(String musicUrl) {
this.musicUrl = musicUrl;
}
@XmlCDATA
@XmlElement(name = "HQMusicUrl")
public String getHqMusicUrl() {
return hqMusicUrl;
}
public void setHqMusicUrl(String hqMusicUrl) {
this.hqMusicUrl = hqMusicUrl;
}
@XmlCDATA
@XmlElement(name = "ThumbMediaId")
public String getThumbMediaId() {
return thumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
this.thumbMediaId = thumbMediaId;
}
@Override
public String toString() {
return "Music [title=" + title + ", description=" + description
+ ", musicUrl=" + musicUrl + ", hqMusicUrl=" + hqMusicUrl
+ ", thumbMediaId=" + thumbMediaId + "]";
}
}
2、搜索音乐:
public Music searchMusic(String musicTitle, String musicAuthor) throws Exception {
String BaiduMusicService="http://box.zhangmen.baidu.com/x?op=12&count=1&title={TITLE}$${AUTHOR}$$$$";
String requestUrl= BaiduMusicService.replace("{TITLE}", <span style="font-family: Arial, Helvetica, sans-serif;">URLEncoder.encode(</span><span style="font-family: Arial, Helvetica, sans-serif;">musicTitle</span><span style="font-family: Arial, Helvetica, sans-serif;">,"utf-8")</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span> requestUrl=requestUrl.replace("{AUTHOR}", URLEncoder.encode(<span style="font-family: Arial, Helvetica, sans-serif;">musicAuthor</span><span style="font-family: Arial, Helvetica, sans-serif;">,"utf-8")</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span>
requestUrl=requestUrl.replaceAll("\\+", "%20");
//这里用的是HttpRequest的另一个方法,和原先的差不多,只是返回的类型是String,不是JSONObject
String xmlResult=HttpRequest.httpRequest(requestUrl);
Music music=parseMusic( xmlResult );<span style="white-space:pre"> </span>//解析XML
if( music!=null){
music.setTitle(musicTitle);
if( musicAuthor!=null){
music.setDescription(musicAuthor);
}else{
music.setDescription("来自源辰小助手");
}
}
return music;
}
3、解析返回响应值
private Music parseMusic(String xmlResult) {
Music music=null;
//注意,导dom4j的包
SAXReader reader=new SAXReader();
try {
Document doc=reader.read( new ByteArrayInputStream( xmlResult.getBytes()));
Element root=doc.getRootElement();
String count=root.element("count").getText();
if( !"0".equals(count)){
List<Element> urlList=root.elements("url");
List<Element> durlList=root.elements("durl");
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( urlDecode.lastIndexOf("&")!=-1){
url=urlEncode.substring(0,urlEncode.lastIndexOf("/")+1)+urlDecode.substring(0,urlDecode.lastIndexOf("&"));
}
//高品质音乐
String durl=url;
//判断是否存在高品质音乐节点
Element durlElement=durlList.get(0).element("encode");
if( durlElement !=null){
//高品质音乐节点数据
String durlEncode=durlList.get(0).element("encode").getText();
String durlDecode=durlList.get(0).element("decode").getText();
//拼装高品质音乐
durl=durlEncode.substring(0,durlEncode.lastIndexOf("/")+1)+durlDecode;
if( durlDecode.lastIndexOf("&")!=-1){
durl=durlEncode.substring(0,durlEncode.lastIndexOf("/")+1)+durlDecode.substring(0,durlDecode.lastIndexOf("&"));
}
}
//创建音乐对象
music=new Music();
music.setMusicUrl( url );
music.setHqMusicUrl(durl);
}
} catch (DocumentException e) {
YcUtils.error(e);
}
return music;
}
5、如何调用,这里应该是要用户按照格式输入一个值,然后通关关键字匹配,截取出歌曲名或者歌手,然后传给刚才那个方法:
/**
* 音乐操作
* @author yc
* @param content
* @throws Exception
*/
public Music musicOp(String content) throws Exception {
// 将歌曲两个字及后面的特殊字符去掉
String keyword = content.replaceAll("^音乐[\\+ ~!@#%^-_=]?", "");
// 如果歌曲名为空,则表明用户不明白该功能意思,将本功能描述再显示一次
if ("".equals(keyword)) {
throw new RuntimeException("无歌名,显示功能描述");
}
// 不为空,则取出歌曲名及作者
String[] keywordArray = keyword.split("@");
String musicTitle = keywordArray[0];
String musicAuthor = "";
if (keywordArray.length >= 2) {
musicAuthor = keywordArray[1];
}
// 再查找
Music music = musicService.searchMusic(musicTitle, musicAuthor);
return music;
}
OK,接下来,就是拼接xml的事情了,相信到了现在,你们的xml也应该封装完毕,所以拼接XML我就不写了,你们都懂的,那么,点歌功能就是这么实现的。在这里,我想强调一句话,数据是死的,而人是活的~~