微信服务开发——读取百度音乐接口返回音乐
最近用了很多网上的坑爹接口,都泪奔了,不说了,都是泪啊~
前两天做了个微信返回音乐的接口,先来看下效果:
出来之后在手机微信里面就可以实现音乐播放了。
技术很简单,首先访问百度音乐接口,传入音乐名称和歌手名称,然后百度会返回一个XML格式给你,里面包括音乐的链接地址等信息。但是比较坑爹的是,这里的链接地址是写在两个node里面的,我要先从一个encode里面拿到前半段,然后再从deconde里面拿到后半段,然后拼起来,拿到URL之后,就要把这个信息放到返回给用户的音乐信息里面。
先来看下微信里面返回给用户的音乐消息的XML的格式:
其中,MusicUrl跟HQMusicUrl都写成从百度拿到的音乐地址就ok了。对于一般公众号,缩略图是不需要的。
其实返回给用户的信息是比较坑爹的,除了音乐链接地址是真的,音乐名称和歌手都是根据用户输入的东西显示的。
当@歌手的时候,上述XML的描述里面写的是就是被@的歌手。
下面是具体代码:
先来看看调用百度音乐接口返回的XML里是什么
如下,红字的部分,为歌曲名称和歌手名称:
http://box.zhangmen.baidu.com/x?op=12&count=1&title=东风破$$周杰伦$$$$
调用完成之后,返回XML为:
<result><count>1</count><url><encode>http://zhangmenshiting.baidu.com/data2/music/120892918/YmRjbG5ocGlpYKCkaHWvm6CWmHFub5qbaJeWlWponG9lmGVkmWppcGZiaGpomphrYWZqlmhuam9la2uWbG6acWpklJZbo6CcbmJhbGxubm5ha2xka2dpcGcy</encode><decode>120892918.mp3?xcode=99cc7eca52e74f20d42850563da3047b3837498b78c992ab&mid=0.87876099061286</decode><type>8</type><lrcid>29026</lrcid><flag>1</flag></url><durl><encode>http://zhangmenshiting2.baidu.com/data2/music/120892919/YmRjbG5ocGlqYKCkaHWvm6CWmHFub5qbaJeWlWponG9lmGVkmWppcGZiaGpomphrYWZqlm6bb5xhlWiXZ2ybbJJkY5Zbo6CcbmJhbGxubm5ha2xka2dpcGcy</encode><decode>120892919.mp3?xcode=99cc7eca52e74f20d42850563da3047b9e8d0c5c26d4a20b&mid=0.87876099061286</decode><type>8</type><lrcid>29026</lrcid><flag>1</flag></durl><p2p><hash>acf1ed82375d608f50d630248cf3d04a72ec6699</hash><url></url><type>mp3</type><size>7674555</size><bitrate>192</bitrate></p2p></result>
之后,拿到拼接地址:http://zhangmenshiting.baidu.com/data2/music/120892918/120892918.mp3?xcode=99cc7eca52e74f20d42850563da3047b3837498b78c992ab
注意,这里要去掉:&mid=0.87876099061286
代码如下:(c#版):
private string strSonger = null; //歌手private string strSongName = null; //歌曲名称/// <summary>/// 获取音乐/// </summary>/// <param name="strType">服务类型</param>/// <param name="strOpenId">用户OpenId</param>/// <param name="strWxAccount">公众号</param>/// <param name="strParams">传入参数:查询歌曲所用</param>/// <param name="strXML">返回的XML</param>public void GetMusic(string strType, string strOpenId, string strWxAccount, string strParams, out string strXML){strXML = null;try{ComponentServiceMessge comServiceMessage = ComponentServiceMessgeAdapter.Instance.GetUrlByComType(strType);if (comServiceMessage == null) //未找到服务{return;}else //找到服务{//发给微信用户strXML = this.ReturnWxMusic(strOpenId, strWxAccount, this.GetMusicFromBaiDu(comServiceMessage.ComponentURL, strParams));}}catch{strXML = null;}}/// <summary>/// 从百度接口拿到音乐信息/// </summary>/// <param name="strParams">传入的参数</param>/// <returns></returns>public string GetMusicFromBaiDu(string strUrl, string strParams){string strMusicXml = null;//拆参数int posOne = strParams.IndexOf("@");if (posOne >= 0) //有歌手{strSongName = strParams.Substring(0, posOne);//歌曲名称strSonger = strParams.Substring(posOne + 1, strParams.Length - posOne - 1);//歌手strUrl = strUrl + strSongName + "$$" + strSonger + "$$$$";strMusicXml = base.RequestMyWebClient(EnumSubmitMethod.Get, "", strUrl);}else//只有歌曲的名称{strSongName = strParams;strUrl = strUrl + strParams + "$$";strMusicXml = base.RequestMyWebClient(EnumSubmitMethod.Get, "", strUrl);}return strMusicXml;}/// <summary>/// 得到发给微信的XML/// </summary>/// <param name="strXml">传入从百度拿到的XML</param>/// <returns></returns>private string ReturnWxMusic(string strOpenId, string strWxAccount, string strXml){string strWxMusicXml = null;//拼入,返回给微信用户strWxMusicXml = string.Format(@"<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[{3}]]></Title><Description><![CDATA[{4}]]></Description><MusicUrl><![CDATA[{5}]]></MusicUrl><HQMusicUrl><![CDATA[{6}]]></HQMusicUrl></Music></xml>", strOpenId, strWxAccount, this.DateTimeToStamp(DateTime.Now).ToString(), strSongName, strSonger, this.GetMusicUrl(strXml), this.GetMusicUrl(strXml));return strWxMusicXml;}/// <summary>/// 获取百度音乐链接的URL地址/// </summary>/// <param name="strXml">访问百度音乐得到的XML</param>/// <returns></returns>private string GetMusicUrl(string strXml){string strMusicUrl = null;//读取xmlXDocument doc = XDocument.Parse(strXml);XElement RootEle = doc.Root; List<XElement> XEleColl = RootEle.Elements().ToList();strMusicUrl = HttpUtility.UrlDecode(XEleColl.ElementAt(1).Element("encode").Value);//拼接地址:取前面的一段地址+decode节点地址int posFlag = strMusicUrl.LastIndexOf("/");strMusicUrl = strMusicUrl.Substring(0, posFlag + 1);string strValue = XEleColl.ElementAt(1).Element("decode").Value;strValue = strValue.Substring(0, strValue.IndexOf("&"));strMusicUrl += strValue;//加上后一段地址return strMusicUrl;}/// <summary>/// DateTime时间格式转换为Unix时间戳格式/// </summary>/// <param name="time"></param>/// <returns></returns>private int DateTimeToStamp(System.DateTime time){System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));return (int)(time - startTime).TotalSeconds;}
接着,在配置的服务器地址
中的处理用户消息页面做出对音乐消息的处理,然后服务器处理后将音乐消息返给用户。
微信服务开发——读取百度音乐接口返回音乐相关推荐
- 关于微信小程序云开发,申请退款接口返回“订单不存在”的问题
关于微信小程序云开发,申请退款接口返回"订单不存在"的问题 微信支付的退款接口返回"订单不存在",有可能是因为传入的商户订单号或微信订单号有误,但本文要讲的是关 ...
- 若依微服务版前端怎样在接口返回500时去掉一直弹窗提示服务未找到
场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: 若依微服务版手把手教你本地搭建环境并运行前后端项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依微服务 在上面的基础上, ...
- 企业微信逆向开发协议,HOOK接口,DLL开发
企业微信hook接口 基本实现企业微信pc端所有功能. 1.登陆模块: 接收登录二维码,登录成功通知,退出通知 2.用户信息模块: 获取自己的信息,获取联系人信息 获取内部联系人列表,获取外部联系人列 ...
- AppInventor读取百度翻译接口(韩语立刻说)
写在前面:这注定是一篇简单粗暴的文章,由于没有太多时间截图,直接抛源代码给大家了哈! 接口地址:http://apistore.baidu.com/astore/serviceinfo/27469.h ...
- 微信小程序对接快递鸟接口返回格式有误的解决
小程序对接快递鸟接口也是先在快递鸟的官网下载一个 nodejs的示例代码.因为我是小程序新手.所以花的时候有点多了.小程序的加密和解密需要用到两个js类.我先传上来. md5.js function ...
- 微信小程序开发之天气预报,调用百度天气接口,显示温馨提示和之后的天气
效果预览 页面功能介绍 此天气预报功能首先获取用户当前位置城市名,对于获取当前位置城市名和百度天气ak申请有疑问可以参考之前文章,然后根据城市名调用百度天气接口返回天气各项数据,最后对返回的数据进行处 ...
- 微信对账单接口返回值解析
最近在做微信支付相关的业务,在调用微信的对账单接口时,遇到一个当时感觉很头大的问题,为什么说当时很头大呢?因为现在这个问题已经被我解决了!嘿嘿... 好吧,言归正传.我遇到的问题就是在调用微信的对账单 ...
- 高德逆地理编码接口返回数据格式不统一以及百度逆地理编码接口返回数据解析失败的踩坑记录
最近有个需求是定位后根据定位的经纬度获取当前地址的详细信息,例如获取街道名称,街道号,乡镇街道编码,区域编码等信息. 于是乎找到了高德的逆地理编码接口,看了看正好符合我的需求.然而使用起来并不顺利! ...
- 【渝粤题库】广东开放大学 微信平台开发与应用 形成性考核 (2)
选择题 题目: 以下哪些功能是属于微信的? 题目: 认证过的订阅号的底部是否可以直接链接到外部链接? 题目: 下面哪些属于页面前端开发技术? 题目: 那种情况下的公众号可以申请微信支付? 题目: 单选 ...
最新文章
- MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
- Python 各种读取保存tif,tiff,png,jpg,mat等格式图像方法大集合
- 网络工程师面试PK--胜者为王
- matlab实现盖尔圆,[理学]数值分析习题解答.doc
- 从程序员到项目经理(12):如何管理自己的时间(上)
- Gtk:利用alignment控制button大小
- java9模块不可见问题
- linux 火狐浏览器插件,Linux系统Firefox(火狐浏览器)插件挂机
- Redis实战(11)高级特性(3)持久化
- 寻找被黑金毁掉的黑客精神
- bmfont-instructions
- [GIS教程] 6 空间数据采集与处理-GIS数据源分类及其特征、采集与处理的基本流程、4D产品
- 入门必看,51单片机学习三步走
- 人工智能目前有哪些突破?
- 服务器装win7没有硬盘模式,联想电脑BIOS里硬盘的SATA,AHCI模式里面怎么没有I...-联想p310工作站装win7,联想电脑工作站...
- 淘宝客(springboot版本)从头开始搭建(二)
- 类微信卡包应用实现(附源码)
- js修改服务器域名,春哥详解:业务域名 JS接口安全域名 网页授权域名
- sketch插件导出html,Sketch插件根据命名导出HTML片段Sketch Emmet
- Oracle 强制中止正在执行的SQL语句