一、引言与说明 目前很多公众帐号都可以实现点歌功能,笔者也很好奇是如何实现的,就做了个实验,现将经验分享如下。 有关音乐消息的说明,就不在此赘述,请自行查阅开发文档。 回复音乐消息的关键在于如何获得歌曲的链接,开发者必须找一个现成的音乐搜索AP

一、引言与说明

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

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

回复音乐消息的关键在于如何获得歌曲的链接,开发者必须找一个现成的音乐搜索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。

参考文献:

[1]青龙老贼:《微信公众平台入门到精通》Vol.11

[2] [042] 微信公众帐号开发教程第18篇-应用实例之音乐搜索

bsdcfp的专栏,请尊重他人的辛勤劳动成果,谢谢!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 微信平台,【php】微信公众平台相关推荐

  1. 微信公众平台 分享到朋友圈 js代码

    前言:1目前必须是被微信认证过的公众平台才能使用此接口 1.绑定域名 2.引用文件 http://res.wx.qq.com/open/js/jweixin-1.0.0.js 3配置前台js配置 va ...

  2. 自制公众平台Web Api(微信)

    最近一段时间感觉没什么东西可以分享给大家,又由于手上项目比较赶,不太更新博客了,今天趁着生病闲下来的时间分享一些项目中的东西给大家. 公众平台 提起公众平台当下最流行的莫过于腾讯的微信了,当然还有易信 ...

  3. 基于java的微信公众平台开发(一)--账号申请与服务器的搭建

    2019独角兽企业重金招聘Python工程师标准>>> 微信公众号开发文档:https://mp.weixin.qq.com/wiki 微信公众平台接口调试工具:https://mp ...

  4. 微信公众平台开发入门

    微信公众平台开发入门 开发简介 公众号的分类 微信公众平台概述 微信公众平台和微信开放平台的区别 开发需知 开发模式 开始开发 开发中遇到的问题 开发简介 公众号的分类 我们平常在微信应用上会看到有很 ...

  5. 微信公众平台从入门到精通二

    第二章  微信公众平台后台介绍 一.微信公众平台后台欢迎页面 登陆公众平台首先进入的就是欢迎页,跟大部分CMS后台一样,这里会提供的是公众账号的一些运营数据 例如:欢迎你,公众平台教程的页面,里面有: ...

  6. 微信公众平台开发接口配置URL index.php和token

    最近在帮别人做个小项目,要用到微信公众平台,虽然以前也做过微信开发,但是没有深入的自己去搞一套微信开发的东西(也搞不了,那时候没能力,也弄不到微信公众号),最近开始搞,第一步就是配置微信基本配置(账号 ...

  7. 微信公众平台网页授权

    最近要做一个功能,用户扫描二维码,获取用户信息,判断他是否关注了公众号,来进行一系列操作: 其中需要获取用户信息,微信有几种方式获取用户信息,这边我了解如下几种可以: 1.通过网页授权获取用户的ope ...

  8. 微信公众平台改版内容

    7月3日消息,微信公众平台再次改版,新版本对超过164处细节进行改进,新增了开发者中心.且对开通了微信支付的公众号,允许在图文消息中加入跳转连接,加强了微信电商的整体布局.微信营销的发展真的是大势所趋 ...

  9. 调用微信公众平台API免费给自己发消息

    素材: 注册 微信公众平台的订阅号 开通开发者中心功能,注册公众平台测试账号.获取到appID和appsecret 摘要: 使用Python 2.7 基于 微信'公众平台测试账号'的appID和app ...

  10. 微信开放平台与公众平台授权区别

    微信开放平台 授权登录主要用于PC端,手机端打开微信空白 微信公众平台 h5页面授权登录,手机端和pc端微信都能使用 如果想要开放平台的与公众平台的unionid相同,绑定即可,同一开放平台下的所有移 ...

最新文章

  1. P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
  2. 更安全的堡垒机登录方法
  3. 在虚幻UE4中不同VR头盔的FOV和分屏处理
  4. 错误:java.lang.Illegal Argument Exception: Document base F:/apache-tomcat-7.0.40/webapps/ web3 does no
  5. location.search
  6. Linux下压缩工具gzip和归档工具tar及其实战shell应用
  7. 面试官:说说Java对象的四种引用方式
  8. windos 服务怎么写_我的产品或服务怎么写?
  9. 响应式微服务 in java 译 十六 Deploying a Microservice in OpenShift
  10. android 系统字体无效,android内嵌H5页面,字体设置失效的问题
  11. cmmi3认证需要企业具备什么条件?
  12. 赋能未来的昆腾全新Scalar存储平台
  13. 最新WIN10系统封装教程2019系列(七)——封装
  14. 华为交换机升级包及补丁验证完整性
  15. 这里有20万个虎年微信红包封面免费领取!
  16. php 图片大小更改,word图片怎么统一调整大小
  17. Java程序员被逼迫,挣着卖白菜的钱,操着卖白粉的心,2021年Java常见面试题
  18. python 与and运算符
  19. .Net 官方学习文档
  20. node.js+vue+elementui餐厅外卖团购点餐限时秒杀网站平台

热门文章

  1. Camera Sensor
  2. GD32450i-EVAL学习笔记 6 - ADC
  3. 带SN切换流程_抖音频繁切换账号会限流吗?抖音频繁切换账号会降权吗?
  4. ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements
  5. 1px、1em、1rem、1vh / 1vw 的含义
  6. RGB及颜色相关概念
  7. 商铺wifi短信验证如何实现?商铺无线wifi短信认证方案
  8. zabbix web 检测
  9. 黑苹果系统更换SSD的方法
  10. 微信小程序选项卡swiper默认高度150px(让高度实现自适应)怎么解决?