微信服务开发——读取百度音乐接口返回音乐




最近用了很多网上的坑爹接口,都泪奔了,不说了,都是泪啊~


前两天做了个微信返回音乐的接口,先来看下效果:




出来之后在手机微信里面就可以实现音乐播放了。


技术很简单,首先访问百度音乐接口,传入音乐名称和歌手名称,然后百度会返回一个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 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,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;
            //读取xml
            XDocument 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;
        }



接着,在配置的服务器地址



中的处理用户消息页面做出对音乐消息的处理,然后服务器处理后将音乐消息返给用户。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇