一、引言与说明

目前很多公众帐号都可以实现点歌功能,笔者也很好奇是如何实现的,就做了个实验,现将经验分享如下。

有关音乐消息的说明,就不在此赘述,请自行查阅开发文档。

回复音乐消息的关键在于如何获得歌曲的链接,开发者必须找一个现成的音乐搜索API(对大多数开发者都不太可能有自己的音乐服务器),或者只向用户回复固定的几首音乐,可以定期手动更新[1](参考)。

百度有一个私有的音乐搜索API。开发者可以直接调用,地址如下:

http://box.zhangmen.baidu.com/x?op=12&count=1&title=Song$$Singer$$$$

开发者只需要提供歌名和歌手就可搜索到指定音乐(歌手可以为空)。在浏览器中输入该地址可以得道以下信息:

1

http://zhangmenshiting.baidu.com/data2/music/64380827/Z2ZmbGVuaW9fn6NndK6ap5WXcGZlbm-aYpNol2ppm5xjamRtbpttbWeVlpdrmGlrkpNomZaXa3CTZJeZmW1ncGVll1qin5t1YWBnZWVoam5hZWNqZ2hnaTE$

64380827.mp3?xcode=2088b1a5c53dd28199e656ccc6b23aa5eaa48b2ded70843d&mid=0.41023603062201

8

14706

1

http://zhangmenshiting2.baidu.com/data2/music/35424427/ZGdnZmlqaW9fn6NndK6ap5WXcGZlbm-aYpNol2ppm5xjamSWm5qbaGaWZWyXbm2dampsbGqca5mVZ5iWlmxwnGJmZlqin5t1YWBnZWVoam5hZWNqZ2hnaTE$

35424427.mp3?xcode=2088b1a5c53dd281bfdd05d28b86e98985f4ad5eba69d143&mid=0.41023603062201

8

14706

1

d1cae9f7634c5aa3d54d7b1b1ad4c5b79b6e97ff

mp3

5710896

192

有关各项参数的意义[2]:

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

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

3)中包含了加密后的音乐链接,实际上只是对音乐名称进行了加密,中包含了解密后的音乐名称。因此,要获取音乐的链接就需要重点分析和中的内容。

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

5)是歌词的ID.

二、关键代码

开发者需要对中的链接进行进一步的处理,才能写入公众平台的消息中。请看php代码:

/*

* 所属类:apiFunction

* 函数名:baiduMusic()

* 参数:

* 功能:调用百度音乐api,推送音乐

*/

public function baiduMusic($Song, $Singer)

{

if (!empty($Song))

{

//音乐链接有两中品质,普通品质和高品质

$music = array (

‘url‘ => "",

‘durl‘ => "");

//采用php函数file_get_contents来读取链接内容

$file = file_get_contents("http://box.zhangmen.baidu"

.".com/x?op=12&count=1&title=".$Song."$$".$Singer."$$$$");

//simplexml_load_string() 函数把 XML 字符串载入对象中

$xml = simplexml_load_string($file,

‘SimpleXMLElement‘, LIBXML_NOCDATA);

//如果count大于0,表示找到歌曲

if ($xml->count > 0)

{

//普通品质音乐

$encode_str = $xml->url->encode;

//使用正则表达式,进行字符串匹配,处理网址

preg_match("/http:\/\/([\w+\.]+)(\/(\w+\/)+)/", $encode_str, $matches);

//第一个匹配的就是我们需要的字符串

$url_parse = $matches[0];

$decode_str = $xml->url->decode;

//分离字符串,截去mid

$decode_arr = explode(‘&‘, $decode_str);

//拼接字符串,获得普通品质音乐

$musicUrl = $url_parse.$decode_arr[0];

//高品质音乐

$encode_dstr = $xml->durl->encode;

preg_match("/http:\/\/([\w+\.]+)(\/(\w+\/)+)/", $encode_dstr, $matches_d);

//第一个匹配的就是我们需要的字符串

$durl_parse = $matches_d[0];

$decode_dstr = $xml->durl->decode;

//分离字符串,截去mid

$decode_darr = explode(‘&‘, $decode_dstr);

//拼接字符串,获得高品质音乐

$musicDurl = $durl_parse.$decode_darr[0];

//将两个链接放入数组中

$music = array(

‘url‘ => $musicUrl,

‘durl‘ => $musicDurl

);

return $music;

}

return $music;

}

else

{

$music = "";

return $music;

}

}

重点解释下preg_match这条语句

preg_match("/http:\/\/([\w+\.]+)(\/(\w+\/)+)/", $encode_str, $matches);

preg_match执行一个正则表达式匹配,原型如下:

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )按照pattern给定的正则表达式模式,搜索subject与pattern的一个匹配。结果保存在array $matches中。

pattern的语法为--"/ /",如:"/php/".

http:是链接开头,\表示转义,\/表示/,\/\/表示//

第一个括号([\w+\.]+):

圆括号表示匹配括号内模式,并获取该字符串。

[]表示字符集合,例如, ‘[abc]‘ 可以匹配 "plain" 中的 ‘a‘。\w表示匹配包括下划线的任何单词字符。等价于‘[A-Za-z0-9_]‘

+表示匹配前面的子表达式一次或多次

\.表示 .

第一个括号匹配的结果为http://zhangmenshiting.baidu.com

第二个括号(\/(\w+\/)+)

\/表示/

(\w+\/)表示匹配 ’music/‘ 这样的字符串

+表示匹配前面的子表达式一次或多次

第二个括号匹配结果为/data2/music/64380827/

这两段字符串连起来就是所需要的字符串,保存在$matches中

三、调用

在处理文本消息函数中,调用

/* 点歌,百度API */

$str_music = mb_substr($keyword, 0, 1, "UTF-8");

$str_explode = mb_substr($keyword, 1, 20, "UTF-8");

$req_music = explode(‘#|#‘, $str_explode);

//$song = mb_substr($keyword, 1, 220, "UTF-8");

$song = $req_music[0];

$singer = $req_music[1];

if ($str_music == ‘#‘ || $str_music == ‘#‘)

{

if ($str_valid == ‘#‘ || $str_valid == ‘#‘)

{

$contentStr = "输入格式不正确哦".

"点歌请输入:#+歌名 或者 #+歌名+#+歌手";

}

else

{

$url_arr = $apiFunc->baiduMusic($song, $singer);

if (empty($url_arr))

{

$contentStr = "非常抱歉哦,小和尚".

"没有找到这首歌,可以换一首嘛[微笑]";

}

else

{

include("wx_tpl.php");

$resultStr = sprintf(

$musicTpl,

$object->FromUserName,

$object->ToUserName,

$song,

$singer,

$url_arr[‘url‘],

$url_arr[‘durl‘]

);

return $resultStr;

}

}

}首先对关键字进行处理并判断。如果第一个字是以“#”开头,表示点歌。全角或半角都可以。

explode函数对字符串进行分隔,将分隔后结果保存在数组中,在将数组值赋给变量$Song、$Singer。

参考文献:

转帖请注明本文出自bsdcfp的专栏,请尊重他人的辛勤劳动成果,谢谢!

原文:http://blog.csdn.net/bsdcfp/article/details/18894579

微信公众号点歌台php,【php】微信公众平台接口开发--点歌相关推荐

  1. 微信公众号授权步骤详细步骤介绍和整合springboot开发(java版)

    文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源. 一.微信公众号授权步骤 首先到微信公众平台注册账号,可以看到有四种类型(服务号,订阅号,小程 ...

  2. php 公众号验证回调方法_微信公众号关键词自动回复设置方法!

    什么是公众号关键词自动回复? 在微信公众号平台设置关键词自动回复,可以通过添加规则,关注/订阅的用户发送的消息内容如果是你设置的关键字,即可以实现自动回复预先设置好的内容. 关键字自动回复设置方法: ...

  3. 微信公众号api关注接口php,微信公众平台接口开发入门示例

    本文实例讲述了微信公众平台接口开发入门示例.分享给大家供大家参考.具体如下: 微信公众平台的接口开发是一个现在比较常用的功能了,很多的人都会去了解一下微信公众平台一些简单开发应用,这里就来给大家介绍一 ...

  4. 公众号openid实时存储mysql_微信--高效解决token及授权用户openid的持久化处理办法...

    摘要 关于微信开发的话题,例子确实已经有不少,但大部分都是人云亦云,很多小细节或者需要注意的地方却大多没有讲清楚,这令很多刚开始开发的人感觉大很迷茫.而我今天要说的话题,主要着眼于两个方面. 一:如何 ...

  5. php微信公众号测试号token配置失败,微信公众号Token配置失败解决办法

    前言 今天生病在家,由于我的微信公众号被投诉了,因此影视站接口被迫关闭,于是就想着给大家分享 APP,于是就用了下微信的自动回复, 想着能否把这个自动回复对接到 MIPCMS 上,于是就开干.但是微信 ...

  6. 微信公众号数据2019_如何制作微信公众号图文素材 微信公众号采集器好用吗

    现在有很多人都会通过微信公众号来发布文章.图片,这时候就需要使用一些编辑技巧了.下面拓途数据就和大家一同来看看如何制作微信公众号图文素材,微信公众号采集器好用吗? 微信公众号图文素材 如何制作微信公众 ...

  7. php微信公众号支付实例教程,php微信支付之公众号支付功能

    这篇文章主要为大家详细介绍了php微信支付之公众号支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 网上的很多PHP微信扫码支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后 ...

  8. 搜索python设计题的微信公众号_appium+python自动化42-微信公众号 (可能以后会遇到也遇到切换不了webview的问题 记录再此 还没试)...

    前言 本篇介绍如何在微信公众号上自动化测试,以操作我的个人公众号:yoyoketang为例,没关注的,先微信关注了,再跟着操作 环境准备: python 3.6 appium 1.7以上版本 微信6. ...

  9. 关于计算机学院 公众号的名字,好听的微信公众号名字

    现在是自媒体的时代,人们可以在各种平台上发表自己的见解,公众号作为一个阅读量极大的平台,也是很多人参与其中的,如今不少人都拥有个人的微信公众号.如果你也想有自己的微信平台的话,可以先来小编这里看一看好 ...

最新文章

  1. [JLOI2011]飞行路线
  2. webpack增量打包多页应用
  3. FileBuffer 与 ImageBuffer 互相转换(滴水PE作业)
  4. opengl代码实例_OpenGL-打开一个窗口
  5. MySQL——高阶语句(中)
  6. python时间模块设置_Python之时间和日期模块
  7. CSS : Cascading Style Sheets
  8. 40个极简WordPress主题
  9. 数据库开发基础-教案-3-认识数据库备份和事务日志备份
  10. paip.utf-8,unicode编码的本质输出unicode文件原理 python
  11. 小米生态链成功的12个关键因素
  12. 【Excel】【行列转换:转置粘贴 or TRANSPOSE】
  13. Macs Fan Control Pro for mac( 电脑风扇控制软件)
  14. 数商云化妆品行业电商平台系统解决方案
  15. html5的vidoe标签,HTML5的Video标签的属性,方法和事件
  16. Neo4j ① <图论>图,节点,关系,属性<知识图谱和图库>图谱,图库,优势<基础>模块,应用场景,环境搭建,浏览器
  17. 批量升级320k百度音乐(java版本)
  18. unique()用法
  19. SpringBoot源码学习系列之异常处理自动配置
  20. 遗传基因科普(4):为何人类不能制造DNA分子?

热门文章

  1. 重测信度及常见评价方法
  2. (void (*Visit)(const ElemType ))
  3. 正则,grep命令详解
  4. 图片上添加自定义标记,可点击,可删除,可长按移动
  5. 结构化思维的理解与思考
  6. 不同格式文件之间的相互转化
  7. Zamzar.com 在线文档转换 图片转换 视频转换
  8. My unqualified host name () unknown; sleeping for XX
  9. unity星空银河绚烂天空盒宇宙场景
  10. word2019设置背景色为护眼的绿色