微信小程序使用QQ音乐API完整实例

article/2025/3/4 22:02:41

微信小程序使用QQ音乐API完整实例

    • 一、QQ音乐常用API接口:
      • 1.1、音乐搜索接口:
      • 1.2、最新音乐排行榜top100
      • 1.3. 随机推荐
    • 二、请求数据格式(以搜索为例)
    • 三、播放链接(重点)
      • 3.1、获取歌曲信息
      • 3.2 获取token
      • 3.3、拼接播放地址:
    • 四、结合微信小程序:
      • 4.1 music.js
      • 4.2、music.wxml
    • 五、总结几个关键点和容易模糊的地方
      • 5.1、关于 var和let区别:
      • 5.2、微信小程序数组的遍历 forEach

(5月14号补充,QQ音乐接口问题还没解决,可以看看新发的小程序调用网易云音乐接口,小程序调用网易云音乐接口)

最近在看微信小程序,写播放音乐功能的时候,遇到些问题写写心得。

一、QQ音乐常用API接口:

1.1、音乐搜索接口:

Method
GET
URL:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=2&w=简单爱&format=json

参数:
p:页数,从1开始
n:每一页显示的条数
w:搜索关键字
format:返回数据格式
通过p和n参数,就可以实现分页请求加载了。
二、其他接口

1.2、最新音乐排行榜top100

Method:GET
URL

https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?g_tk=5381&uin=0&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=h5&needNewCode=1&tpl=3&page=detail&type=top&topid=27&_=1519963122923

1.3. 随机推荐

Method:GET
URL

https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?g_tk=5381&uin=0&format=json&inCharset=utf-8&

二、请求数据格式(以搜索为例)

在这里插入图片描述
以搜索结果的数据格式为例,curPage即当前页数,totalnum即总数。list中即本次请求的歌曲的数据,如果请求的位移超过了totalnum,list中返回0条。
然后主要看下list下的歌曲信息应该如何使用,一个简单的播放器显示会有专辑名称、封面、歌曲名称、歌手名称等:

1. 歌曲名称
songname

2. 歌手名称
singer字段,列表结构,其中会多个歌手的信息

3. 专辑名称
albumname
4. 专辑封面
封面图片url要使用albumid字段拼接生成,格式:

"http://imgcache.qq.com/music/photo/album_300/%i/300_albumpic_%i_0.jpg", albumid%100, albumid

比如albumid=8217,封面地址就是http://imgcache.qq.com/music/photo/album_300/17/300_albumpic_8217_0.jpg,可以在浏览器中打开验证。

三、播放链接(重点)

3.1、获取歌曲信息

请求搜索API接口

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=2&w=简单爱&format=json

在这里插入图片描述
从本次请求中可以获取歌曲的基本信息,关键是songmid

3.2 获取token

播放链接并不是一个永久的地址,每次需要动态获取一个token,然后再生成播放链接。这个token是用来验证链接的有效性的,会包含时效等信息。

地址需要用到songmidfilenamesongmid可以从歌曲信息中取到,filename根据songmid生成。
比如,songmid是003lghpv0jfFXG,则filename就是前缀加上C400,后缀加上.m4a,即C400003lghpv0jfFXG.m4a。其他字段format、platform、cid、guid可以写死,但都是必须的。
地址:

https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?format=json205361747&platform=yqq&cid=205361747&songmid=003lghpv0jfFXG&filename=C400003lghpv0jfFXG.m4a&guid=126548448

结果:
在这里插入图片描述这里我们就拿到了vkey字段就是我们接下来拼接播放地址要使用的。

3.3、拼接播放地址:

http://ws.stream.qqmusic.qq.com/filename?fromtag=0&guid=126548448&vkey=

filenamevkey即token中的vkey字段填上。参数中的几个字段都是必须的:guid要和请求token时使用的guid保持一致,fromtag随意指定一个整数,可以写死为0。
下面是拼接好的地址:

http://ws.stream.qqmusic.qq.com/C400003lghpv0jfFXG.m4a?fromtag=0&guid=126548448&vkey=BB4A40F3B706D4936B7A234F46E424E7F3E24C65EB6E880CC1F8340DB6E65C780D9EF1A7B60F97F6C130F73EAEAD3FFFF99FBA072987E8E7

放到浏览器测试一下

四、结合微信小程序:

先上简单的代码,由于没有分开,全码到music.js中了,大家弄得时候可以写配置文件分开。

4.1 music.js

Page({onReady: function (e) {// 使用 wx.createAudioContext 获取 audio 上下文 contextthis.audioCtx = wx.createAudioContext('myAudio')},data: {poster: null,name:null,author: null,src: null,songmid:null,vkey:null},onLoad: function (params) {var that = thisconsole.log("搜索音乐关键词-----"+params.w)//因为这是从我的小程序中拿出的一段,所以大家params.w 肯定是拿不到数据的,自己可以默认定一个数据测试(var value = '简单爱'),把params.w换成value就行了var url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=1&w=' + params.w + '&format=json'console.log(url)
//获取相关音乐数据wx.request({//QQ音乐搜索API接口url: url,data: {},method: 'GET',header: {"Content-Type": "application/json,application/json"},success: function (res) {console.log(res)//循环遍历数据,并赋值let pageData = res.data.data.song.listpageData.forEach(function (item, index) {that.setData({songmid: item.songmid,name: item.songname,author: item.albumname})})console.log('songmid-----'+that.data.songmid);//测试打印//拼接token获取链接var filename = 'C400'+that.data.songmid+'.m4a'console.log('filename-----'+filename)//var tokenUrl = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?format=json205361747&platform=yqq&cid=205361747&songmid=' + that.data.songmid+'&filename='+filename+'&guid=126548448'console.log('tokenUrl-----'+tokenUrl)/*** 发送请求获取token*/wx.request({url: tokenUrl,data: {},method: 'GET',header: {"Content-Type": "application/json,application/json"},success: function (res2) {console.log(res2)console.log(res2.data.data.items)//循环遍历数据let pageData2 = res2.data.data.itemspageData2.forEach(function (item, index) {that.setData({vkey: item.vkey})})/*** 拼接播放地址*/let musicUrl = 'http://ws.stream.qqmusic.qq.com/'+filename+'?fromtag=0&guid=126548448&vkey='+that.data.vkeythat.setData({src:musicUrl})},fail: function () {message.show.call(that, {content: '网络开小差了',icon: 'offline',duration: 3000})}})},fail: function () {that.setData({showLoading: false})message.show.call(that, {content: '网络开小差了',icon: 'offline',duration: 3000})wx.stopPullDownRefresh()typeof fail_cb == 'function' && fail_cb()}})},audioPlay: function () {this.audioCtx.play()},audioPause: function () {this.audioCtx.pause()},audio14: function () {this.audioCtx.seek(14)},audioStart: function () {this.audioCtx.seek(0)}
})

4.2、music.wxml

<audio poster="" name="{{name}}" author="{{author}}" src="{{src}}" id="myAudio" controls loop></audio>
<button type="primary" bindtap="audioPlay">播放</button>
<button type="primary" bindtap="audioPause">暂停</button>
<button type="primary" bindtap="audio14">设置当前播放时间为14</button>
<button type="primary" bindtap="audioStart">回到开头</button>

五、总结几个关键点和容易模糊的地方

5.1、关于 var和let区别:

let:
用let的方式声明的变量,为局部变量,该变量只会在最靠近{ }内的范围有效,出了{}之后,该变量就不能够再用了,否则会报该变量未定义的错误。也就是说,该变量的作用域为所在的代码块内。

const app = getApp()Page({data: {},onLoad: function () {console.log('App onLoad');// 用let的方式声明的i只在for循环内有效,在for循环外引用就会报错i未定义的错误for (let i = 0; i < 10; i++) {console.log('for循环里面的i的值为'+i);//不包错}console.log(i);//报错超出范围},
})

var:
用var的方式声明的变量,为全局变量,其作用域为所在的函数内。所以重点来了,在当前JS文件的其余函数中,如果直接拿来用,也会报变量未定义的错误。详情请看下面的var的错误使用方式。

Page({data: {},music: function () {console.log('music函数中i的值'+i);//报错},onLoad() {console.log('App onLoad');// 用var的方式声明的i在onLoad函数内都有效,在其余函数中是没有效果的哦。for (var i = 0; i < 10; i++) {console.log('for循环里面的i的值为' + i);//不报错}console.log('onLoad函数中i的值' + i);//不报错},
})

在这里插入图片描述
当然,如果你想 用var声明的i在addPerson类中也可以使用的话,那么你可以用this.data.i = i;将i存储在index.js整个文件中

Page({data: {name: '新增参保人',// name的默认值},music: function () {console.log('music函数中i的值'+this.data.i);},onLoad() {console.log('App onLoad');for (var i = 0; i < 10; i++) {console.log('for循环里面的i的值为' + i);}console.log('onLoad函数中i的值' + i);this.data.i = i;//赋值},
})

5.2、微信小程序数组的遍历 forEach

以上述例子的代码为例

//循环遍历数据let pageData2 = res2.data.data.items//获取到需要遍历的集合数据pageData2.forEach(function (item, index) {console.log(item.vkey)//遍历打印//遍历赋值that.setData({vkey: item.vkey})})

http://chatgpt.dhexx.cn/article/kDHGDmKq.shtml

相关文章

音乐播放器之QQ音乐最新api,亲测可用

大家好&#xff0c;前段时间重写了自己的音乐播放器&#xff0c;源码放在github上&#xff0c;源码地址和项目地址下面都有&#xff0c;如果喜欢记得star一下哈。 由于之前给大家分享的api虽然可以用&#xff0c;但是版本太旧了&#xff0c;很多也没有了歌词&#xff0c;今天博…

步数精灵v3.0运动安卓版

软件介绍: 一键修改微信运动、支付宝运动的步数&#xff0c;让你在家足不出户也能走几万步&#xff0c;天天霸占好友排行榜首位&#xff01; 软件预览图&#xff1a; 软件版本号&#xff1a;3.0 软件是否收费&#xff1a;免费软件/共享软件 运行环境&#xff1a;安卓 软件…

艾出行广告精灵挂机源码+对接码支付即时到账+充值系统+推广下级系统+封装app

简介&#xff1a; 安装说明&#xff1a;请使用win系统 apache php5.6 mysql5.6 进行安装。 1、上传到网站根目录 2、用phpMyadmin导入数据库文件.sql 3、修改数据库链接文件 /APP/Conf/config.php &#xff08;记得不要用记事本修改&#xff0c;否则可能会出现验证码显示不了问…

支付平台架构:终端安全技术实现

前蚂蚁集团宣布即将IPO之后&#xff0c;9月11日晚间&#xff0c;以金融支付起家的京东数科也要上市了。近年来&#xff0c;第三方支付业务的资金规模不断扩大&#xff0c;支付业务量稳步增长&#xff0c;“第三方支付”及“移动支付”已成为年度搜索热词&#xff0c;支付平台作…

键盘精灵_键盘

键盘精灵 They folks over at DasKeyboard loaned me a reviewers copy of their totally blank keyboard about three weeks ago and Ive been typing on it since. 大约在三周前&#xff0c; DasKeyboard的同事们借给了我审阅他们完全空白的键盘的副本&#xff0c;此后我一直…

Telink ble mesh天猫精灵应用

文章目录 1 前言2 完美对接天猫精灵平台2.1 创建新产品2.1.1 添加产品类型2.1.2 添加产品信息2.1.3 添加产品功能 2.2 设置人机交互2.2.1 设置控制口令2.2.2 添加产品展示图2.2.3 添加配网指导2.2.4 添加升级指导2.2.5 添加控制面板 2.3 选择品牌模组2.4 下载并保管好三元组2.5…

[超详细] 2021支付宝集五福【攻略】来了-附自动化脚本

一年一度的支付宝集五福在2月1号的凌晨开始了&#xff0c;虽然一年比一年瓜分的少&#xff0c;但不知不觉集福卡成了过年最佳的消遣娱乐方式了。活动从2月1日开始至1月11日结束。 扫下面这个福字&#xff0c;必得沾福卡&#xff01; 零、额外福利 额外福卡二维码扫福器下载地址…

小程序图标-精灵图

文章来源&#xff1a;刘俊涛的博客 欢迎关注&#xff0c;有问题一起学习欢迎留言、评论。

python调用按键精灵插件_【按键精灵】三分钟教你实现自动解决各种验证码

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习…

python调用按键精灵插件_【按键精灵教程】此帖在手,打码不愁

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习…

python调用按键精灵插件_按键精灵教程打码平台接入

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习…

手机端APP调起支付宝客户端支付!!!!

需要商户登录支付宝后台&#xff0c;在“账户中心-密钥管理”下配置MAPI网关产品密钥&#xff0c;用支付宝官方提供的openssl-1.0.2m工具生成一对私钥和公钥&#xff0c;把公钥配置上去就可以了。不清楚的也可以咨询支付宝的在线客服技术人员&#xff0c;很好的客服 赋代码&am…

支付宝蚂蚁森林php自动,auto.js蚂蚁森林智能脚本使用方法分享 支付宝蚂蚁森林自动辅助...

auto.js蚂蚁森林智能脚本使用方法分享 支付宝蚂蚁森林自动辅助 这个项目是 github上的一个开源项目&#xff0c;作者应该是 SuperMonster &#xff0c;此人在52也有ID 不管怎么说是一个长期维护的开源项目&#xff0c;安全性 跟可用性完全不用担心了 重点就是你玩不玩蚂蚁森林了…

按键精灵初接触

初衷 当目前想模拟人工操作的时候&#xff0c;而且不想去操作底层协议去攻破各大系统漏洞&#xff0c;还想自动化的操作&#xff0c;加流量&#xff0c;加粉丝&#xff0c;加关注&#xff0c;自动挂机等等。解放双手&#xff0c;按键精灵就是你需要的。 目前按键精灵类似软件…

MacOS 按键精灵推荐

前段时间本人被反复枯燥的工作折磨&#xff0c;后突发奇想使用按键精灵。 按键精灵是一款功能强大的自动化操作工具&#xff0c;可以用来完成一系列重复性的操作&#xff0c;比如键盘快捷键的模拟、文本自动输入、鼠标操作的模拟等等&#xff0c;可以大大提高工作效率。 工具…

支付宝集五福攻略

新年到了&#xff0c;支付宝又开启了一年一度的集五福活动 &#xff08;说实话一般情况下得不到多少钱&#xff09;&#xff0c;主要还是图个喜庆&#xff0c;图个高兴。下面小编为你奉上集五福攻略。 AR扫福这张图片大概率可以获得沾沾卡 第二是支付宝分别搜&#xff1a;滴滴…

1.3 JavaScript 输入与输出

1.3 JavaScript 输入与输出 输入 从HTML与用户的交互中输入信息&#xff0c;例如通过input、textarea等标签获取用户的键盘输入&#xff0c;通过click、hover等事件获取用户的鼠标输入。通过Ajax与WebSocket从服务器端获取输入标准输入&#xff0c;参考AcWing 1. A B let fs…

js控制文本框只能输入数字 及 常用字符对应ASCII码值

方法一: < INPUT TYPE =text NAME =text onkeypress ="a()" > < script language =javascript > ... function a()...{ var k = window.event.keyCode;if ( (k > 47 && k < 58) ||

js-确定输入字符串是否有效

// 给定一个仅包含字符 (, ), {, }, [ 和 ] 的字符串 s&#xff0c;// 确定输入字符串是否有效。// 输入字符串在以下情况下有效&#xff1a; // Input: s "()[]{}"// Output: true// Input: s "(]"// Output: false // Input: s "([)]"// Ou…

JS:js输出

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>js输出</title> </head> <body><script type"text/javascript">alert(hello javascript); // window.可省略 …