微信开发二三事:功能应用三、点歌系统

首先,得感谢柳峰老师的书,我是看了那本书,才知道有这么一个接口的。

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我就不写了,你们都懂的,那么,点歌功能就是这么实现的。在这里,我想强调一句话,数据是死的,而人是活的~~




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值