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

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

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

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

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

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

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

时间: 2024-08-07 21:19:43

微信服务开发——读取百度音乐接口返回音乐的相关文章

微信web开发的上传图片js接口

$('.chooseImage').click(function(){ wx.chooseImage({ count: pic_num, // 默认9,大于9也是显示9 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 'original', success: function (res) { images.localId = res.localIds; alert('已选择 ' + res.localIds.length + ' 张图片'); v

php 微信公众平台上传多媒体接口 41005错误

文链接: http://www.maoyupeng.com/wechart-upload-image-errorcode-41005.html PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求. 传统上,PHP的cURL支持通过在数组数据中,使用“@+文件全路径”的语法附加文件,供cURL读取上传.这与命令行直接调用cURL程序的语法是一致的: curl_setopt(ch, CURLOPT_POSTF

基于百度风云榜开发的API数据接口-为APP资讯资讯服务

是基于百度搜索风云榜采集的新闻信息,,该资讯会更好的体现人们关注的人多事件与热词 通过数据采集,同时发布相信的数据开放API接口 1.取得热词信息列表 如:api.yi18.net/top/list 2.取得热词信息详细 如:api.yi18.net/top/show?id=1 更多的API文档 doc.yi18.net/topwendang 数据镜像网站:  top.yi18.net API数据接口的免费开放,希望为更多的APP开发者提供更专业的数据 接口.为APP开发提供更简单的新闻热点板块

【微信公众平台开发】百度周边搜索接口php封装

现在微信公众平台很多娱乐的,都有用到周边搜索功能,研究下比较简单,通过百度周边搜索接口封装如下: 调用格式: $wechatBaiduAPI = new WechatBaiduAPI(); $ret = $wechatBaiduAPI->Place_search($str_key,$location['x'].",".$location['y'] ); 参数说明: $query:搜素关键词 $location: 地理位置经纬度 $radius: 搜索半径 <?php cla

在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据

百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路**号院**社区&output=json&ak=您的AK密钥 返回结果实例: { "status":0, "result": { "location":{"lng":116.79, "lat":

微信平台开发——日历服务

很多人可能用过如下的功能: 我向微信号发个字符,然后后台去解析字符,拆出其中的关键字,然后去数据库查询是否开启此项服务,如果服务开启,则返回给用户调用此服务的结果. 最近两天开始做的服务有,天气查询,日历,快递,火车,黄金...等六个服务做成接口,今天要分析的是这里面唯一没有调用外部API接口的服务. 首先,我们要写好一个计算农历的方法,: #region 获取农历方法 ///<summary> /// 实例化一个 ChineseLunisolarCalendar ///</summar

微信开发-素材/消息管理接口

开始 本文是 微信公众号开发者模式介绍及接入 的后续,如没看过前文的话,可能看本文会有些懵逼.本文主要介绍微信公众平台的素材.消息管理接口的开发.由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发.测试号的申请可参考下文: 使用微信测试账号对网页进行授权 图文消息 本小节我们来开发回复图文消息的功能,官方文档地址如下: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543 回复图文

微信公众平台开发(89) 高级群发接口

在这篇微信公众平台高级接口开发教程中,我们将介绍如何开发高级群发接口功能. 本文分为以下四个部分: 准备群发内容 选择群发对象 执行群发 接收群发结果 一.准备群发内容 群发内容可以是文本.图片.语音.视频.图文.群发文本只需要文本内容,其他内容需要获得相应的media_id. 1. 文本内容 文本内容就是一段文字,比如:"微信公众平台开发最佳实践" 2. 图片.语音.视频 要求如下: ? 图片(image): 128K,支持JPG格式 ? 语音(voice):256K,播放长度不超过

微信公众平台开发(73) 客服接口发送客服消息

原文:微信公众平台开发(73) 客服接口发送客服消息 微信公众平台开发 客服接口 发送客服消息作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/weixin73-custom-send.html 当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单clike事件.订阅事件.扫描二维码事件.支付成功事件.用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前为24小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通