当前位置: 首页 > news >正文

解析微信开发之搜索歌曲

原文出自传智播客官方公众号!(https://mp.weixin.qq.com/s?__biz=MjM5OTM4NDMyMg==&mid=208251305&idx=1&sn=44449fcfb1e82c26b3c821f317ed037b&key=2877d24f51fa538481aa2a603e35146c742c0af306917cf20ec620fa7df40c05b568b07a7e52ec5a6720fcc2819df5a8&ascene=4&uin=MjQ3MDk5Mjc4MA%3D%3D&devicetype=android-19&version=26020533&pass_ticket=o6lDRGq5VoZY6lsx8tDDfa1h0%2BiVP0Rs%2BVVYjWZVNaNBby1ui2OxIVHmA56%2B31J%2B)

微信公众平台支持向用户回复音乐消息,用户收到音乐消息后,点击即可播放音乐。

通过微信公众平台提供的回复音乐消息,公众号可以实现音乐搜索(歌曲点播)功能,即用户输入需要搜索的音乐(歌曲)名称,公众号返回对应的音乐(歌曲)。

效果是当用户要搜索歌曲《朋友》,发送内容“歌曲朋友”到公众号。当用户要搜索周华健演唱的《朋友》,可发送“歌曲朋友@周华健”到公众号。

1. 音乐消息数据格式

微信公众平台开发者文档中提供了公众号向用户回复音乐消息的XML数据格式。

1.  <xml>  
2.  <ToUserName><![CDATA[toUser]]></ToUserName>  
3.   <FromUserName><![CDATA[fromUser]]></FromUserName>  
4.   <CreateTime>12345678</CreateTime>  
5.   <MsgType><![CDATA[music]]></MsgType>  
6.   <Music>  
7.    <Title><![CDATA[TITLE]]></Title>  
8.     <Description><![CDATA[DESCRIPTION]]></Description>  
9.     <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>  
10.   <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>  
11.   <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>  
12.</Music>  
13.</xml>  

  参数说明:

参数

是否必须

说明

ToUserName

接收方账号(收到的OpenID)

FromUserName

开发者微信号

CreateTime

消息创建时间(整型)

MsgType

music

Title

音乐标题

Description

音乐描述

MusicURL

音乐链接

HQMusicUrl

高质量音乐链接,WIFI环境优先使用该链接播放音乐

ThumbMediaId

缩略图的媒体ID,通过素材管理接口上传多媒体文件,得到的ID

2. 百度音乐搜索

百度音乐搜索API的请求地址如下:http://box.zhangmen.baidu.com/x?op=12&count=1&title=TITLE$$AUTHOR$$$$

其中:http://box.zhangmen.baidu.com为百度音乐盒的首页地址,参数TITLE表示歌曲名称,AUTHOR表示演唱者,AUTHOR可以为空,参数TITLE和AUTHOR需要进行URL编码(UTF-8或GB2312均可)。例如,要搜索歌曲零点乐队的“相信自己”,可以像下面这样:

1. // GB2312编码的音乐搜索链接

2. http://box.zhangmen.baidu.com/x?op=12&count=1&title=%CF%E0%D0%C5%D7%D4%BC%BA$$%C1%E3%B5%E3%C0%D6%B6%D3$$$$

3. // UTF-8编码的音乐搜索链接

4. http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E7%9B%B8%E4%BF%A1%E8%87%AA%E5%B7%B1$$%E9%9B%B6%E7%82%B9%E4%B9%90%E9%98%9F$$$$

通过浏览器访问上面的地址,返回的是如下格式的XML数据:

1.  <result>  
2.  <count>1</count>  
3.   <url>  
4.   <encode>  
5.   <![CDATA[http://zhangmenshiting.baidu.com/data2/music/44277542/ZWZla2xra2pfn6NndK6ap5WXcJVob5puZ2trbWprmnBjZ2xolpeZa2drZmWZmZmdl2hjZWhvnWlpYmRtZmltcGplZFqin5t1YWBobW5qcGxia2NmZ2twbzE$]]>
6.    </encode>  
7.    <decode>  
8.    <![CDATA[44277542.mp3?xcode=a39c6698955c82594aab36931dcbef60139f180191368931&mid=0.59949419022597]]>  
9.    </decode>  
10.  <type>8</type>  
11.  <lrcid>64644</lrcid>  
12.  <flag>1</flag>  
13. </url>  
14. <durl>  
15.  <encode>  
16.  <![CDATA[http://zhangmenshiting2.baidu.com/data2/music/44277530/ZWZla2xramhfn6NndK6ap5WXcJVob5puZ2trbWprmnBjZ2xolpeZa2drZmWZmZmdl2hjaGhvnZ5qlGRpbpedamJla1qin5t1YWBobW5qcGxia2NmZ2twbzE$]]>  
17.  </encode>  
18.  <decode>  
19.  <![CDATA[44277530.mp3?xcode=a39c6698955c82594aab36931dcbef60439ff9b159af2138&mid=0.59949419022597]]>  
20. </decode>  
21.  <type>8</type>  
22.  <lrcid>64644</lrcid>  
23.  <flag>1</flag>  
24. </durl>  
25. <p2p>  
26. <hash>022bc0fbf66cd19bea96db49634419dc2600393f</hash>  
27.  <url>  
28.  <![CDATA[ ]]>  
29.  </url>  
30.  <type>mp3</type>  
31.  <size>5236902</size>  
32.  <bitrate>192</bitrate>  
33. </p2p>  
34.</result>  

  

返回结果中的主要参数说明如下:

1)<count>表示搜索到的音乐数;

2)<url>中包含了普通品质的音乐链接,<durl>中包含了高品质音乐的链接;

3)<encode>中包含了加密后的音乐链接,实际上只是对音乐名称进行了加密,<decode>中包含了解密后的音乐名称;

4)<type>表示音乐文件的类型,如rm、wma、mp3等;

5)<lrcid>是歌词的ID,<url>中的歌词ID为64644,那么如何得到歌词呢?本例并不关心歌词,只是附带提一下。歌词的地址如下:http://box.zhangmen.baidu.com/bdlrc/646/64644.lrc,其中,http://box.zhangmen.baidu.com/bdlrc/是固定值;646为歌词所在目录名,计算方法为歌词ID(64644)除以100,取整数部分;64644.lrc是歌词文件名。

下面介绍如何获得音乐链接:

上图中,1和2拼接可成普通品质音乐的链接,3和4拼接可拼接成高品质音乐的链接。拼接普通品质和高品质的音乐链接如下:

1. // 普通品质音乐链接

2. http://zhangmenshiting.baidu.com/data2/music/44277542/44277542.mp3?xcode=a39c6698955c82594aab36931dcbef60139f180191368931

3. // 高品质音乐链接

4. http://zhangmenshiting2.baidu.com/data2/music/44277530/44277530.mp3?xcode=a39c6698955c82594aab36931dcbef60439ff9b159af2138

参数xcode可以理解为随机验证码,每次搜索得到的值都不一样。

3. 编程调用百度音乐搜索API

编写PHP程序来实现,编写_getMusicURL方法,代码如下:

1.   private function _getMusicURL($song, $singer){
2.     if($singer==''){
3.         $curl ='http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$';
4.     } else {
5.         $curl ='http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$'.$singer.'$$$$';
6.     }
7.     $content = $this->_request($curl, false);
8.     $content = simplexml_load_string($content,'SimpleXMLElement', LIBXML_NOCDATA);
9.     $musicUrl =substr($content->url->encode,0,strrpos($content->url->encode,'/')+1).substr($content->url->decode,0,strrpos($content->url->decode,'&'));
10.   return $musicUrl;
11. } 

  

4. 发送音乐(歌曲)

在公众账号后台,需首先对用户发送的文本消息进行判断,如果是以“歌曲”两个字开头,就认为用户是在使用“歌曲点播”功能,此时需要对“歌曲”两个字之后的内容进行判断,如果包含“@”符号,就表示需要按演唱者搜索,否则不指定演唱者。PHP代码如下:

1.  private function _sendMusic($postObj){ 
2.     $postObj->Content =
3.  mb_substr(
4.  $postObj->Content,
5.  2,
6.  mb_strlen($postObj->Content,'UTF-8')-2,
7.  'UTF-8');
8.  $songinfo = explode('@',$postObj->Content);
9.  $song = trim($songinfo[0]);
10.$singer='';
11.if(isset($songinfo[1])){
12.$singer = trim($songinfo[1]);
13.}  
14.$musicURL = $this->_getMusicURL($song, $singer);
15.$musicTpl = 
16.'<xml>
17.<ToUserName><![CDATA[%s]]></ToUserName>
18.<FromUserName><![CDATA[%s]]></FromUserName>
19.<CreateTime>%s</CreateTime>
20.<MsgType><![CDATA[music]]></MsgType>
21.<Music>
22.<Title><![CDATA[%s]]></Title>
23.<Description><![CDATA[]]></Description>
24.<MusicUrl><![CDATA[%s]]></MusicUrl>
25.<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
26.<ThumbMediaId><![CDATA[l-mhCs8ecIACGP48FKvyI6k4MIdHdikR9UEW_COLq30]]></ThumbMediaId>
27.</Music>
28.</xml>';
29.$resultStr = sprintf(
30.$musicTpl, 
31.$postObj->FromUserName, 
32.$postObj->ToUserName, 
33.time(), 
34.$song, 
35.$singer, 
36.$musicURL, 
37.$musicURL);
38.echo $resultStr;
39.exit;
40.}   

  

在 <ThumbMediaId><![CDATA[MEDIA_ID]]></ThumbMediaId>中MEDIA_ID必须用公众号的永久图片素材的media_id替换。

以上是关于音乐的两个方法,功能是获取音乐的URL并发送给用户,用户发送“歌曲朋友”或者“歌曲朋友@周华健”到公众号时,公众号进行歌曲搜索,并将搜索到的歌曲以music类型发送给用户。

 

转载于:https://www.cnblogs.com/ghw0501/p/4848799.html

相关文章:

  • rhel 6.5 x86_64 配置centos yum源
  • C/C++连接MySql数据库
  • 【转】【Linux】 临界区,互斥量,信号量,事件的区别
  • LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
  • VMWare下虚拟机NAT共享方式上网的配置说明
  • hadoop中遇到的问题。
  • Android基础小技术点:Android ListView设置背景图片及分割线、周边距
  • 结构体
  • zabbix vfs.fs.discovery过滤
  • 主键生成
  • RDVTabBarController--可自由定制的iOS底部导航控件
  • 智能园区报修系统可行性分析
  • 堆排序学习笔记及堆排序算法的python实现
  • Golang 并发简介
  • Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)
  • 【Linux系统编程】快速查找errno错误码信息
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 4. 路由到控制器 - Laravel从零开始教程
  • Angular2开发踩坑系列-生产环境编译
  • canvas 五子棋游戏
  • Centos6.8 使用rpm安装mysql5.7
  • ComponentOne 2017 V2版本正式发布
  • IndexedDB
  • JavaScript创建对象的四种方式
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Mocha测试初探
  • oschina
  • PAT A1120
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 前端路由实现-history
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 推荐一个React的管理后台框架
  • 延迟脚本的方式
  • 用Visual Studio开发以太坊智能合约
  • (145)光线追踪距离场柔和阴影
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)hibernate配置管理
  • (分布式缓存)Redis持久化
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (转)Windows2003安全设置/维护
  • (转)为C# Windows服务添加安装程序
  • .NET Core 中插件式开发实现
  • .net 怎么循环得到数组里的值_关于js数组
  • .net实现客户区延伸至至非客户区
  • .NET值类型变量“活”在哪?
  • .考试倒计时43天!来提分啦!
  • @Valid和@NotNull字段校验使用
  • @取消转义
  • [AIGC] MySQL存储引擎详解
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [APUE]进程关系(下)
  • [BZOJ 3282] Tree 【LCT】
  • [CISCN 2019华东南]Web11
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍