以前咱们已经开发过一款小程序适用的qq音乐api库 https://github.com/FisherWY/Q...,此次开发网易云音乐api库的缘由是qq音乐api库在小程序中iOS环境下没法使用小程序提供的背景音频播放器播放的问题网易云的加密算法真的比其余几家api复杂太多了。。。完爆QQ和酷狗
想要直接用的话能够到Github直接取我封装好的api库。
Github地址https://github.com/JabinGP/Ne...javascript
本api库参考了Github上面开源的node库,由于咱们只想要查找音乐和播放音乐这两个功能,虽然Github那个库很方便,可是咱们不想为了两个接口特地去跑一个node.js服务。Github上的库java
这个库是用来aes加密的,在node上面有一个原生的crypto,可是在小程序里咱们没有,因此我照着Github上的源码一点一点用这个库翻译过来的,还有Buffer在小程序里也没有,我使用这个库的方法代替了。node
网上不少帖子讲的很清楚了,这里推荐几篇文章,我只作一个简单的总结,方便你们理解这个库。
网易云的加密算法大概使用了两个:git
加密大体流程:github
加密结果a
。abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/
随机生成一个新的16位密钥,而后用这个密钥去加密加密结果a
,获得加密结果b
。3.这样咱们的数据就被双重加密了,可是咱们要发给服务器去查询对应的数据,服务器知道第一个固定的密钥是多少,能够解开第一个加密结果,可是服务器可不知道咱们第二次加密用的是什么,因此服务器还须要获得咱们的第二个生成的随机加密密钥。算法
c
b
和c
发送给服务器,服务器就会返回给咱们对应的结果了。这段代码传入对象后能够直接加密成符合网易云api加密的结果。json
// 生成随机数,size默认16 function createSecretKey(size) { const keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let key = "" for (let i = 0; i < size; i++) { let pos = Math.random() * keys.length pos = Math.floor(pos) key = key + keys.charAt(pos) } return key } // aes加密方法 function aesEncrypt(word, secKey) { let key = CryptoJS.enc.Utf8.parse(secKey); //十六位十六进制数做为密钥 let iv = CryptoJS.enc.Utf8.parse(aes_mv); //十六位十六进制数做为密钥偏移量 let srcs = CryptoJS.enc.Utf8.parse(word); let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); let res = encrypted.toString(); console.log(res); return res; } // 填充方法 function zfill(str, size) { while (str.length < size) str = "0" + str return str } // rsa加密方法 function rsaEncrypt(text, pubKey, modulus) { const _text = text.split('').reverse().join('') const biText = bigInt(CryptoJS.enc.Utf8.parse(_text).toString(), 16), biEx = bigInt(pubKey, 16), biMod = bigInt(modulus, 16), biRet = biText.modPow(biEx, biMod) return zfill(biRet.toString(16), 256) } // 加密总入口 function Encrypt(obj) { const text = JSON.stringify(obj) const secKey = createSecretKey(16) const encText = aesEncrypt(aesEncrypt(text, nonce), secKey) const encSecKey = rsaEncrypt(secKey, pubKey, modulus) return { params: encText, encSecKey: encSecKey } }
首先到Github下载个人Api库https://github.com/JabinGP/Ne...
下载完成后,这个库应该是能够直接导入微信小程序开发工具运行的,可是有几个注意事项小程序
ES6转ES5
,可使用await处理异步请求(由于库是用Promise
写的,起码要能用Promise
,实例代码使用的是await
/async
)NetEaseCloudMusicApi/Libary
文件夹里面包含了项目依赖的js文件,应用的时候最好整个NetEaseCloudMusicApi
文件夹复制到项目里面使用。const {MusicManager} = require("../../NetEaseCloudMusicApi/src/MusicManager");
注意要用花括号吧MusicManager
括起来,这一句能够须要变化的地方只有../../NetEaseCloudMusicApi/src/MusicManager
中的../../
,后面的路径都表明了NetEaseCloudMusicApi
文件夹和NetEaseCloudMusicApi
里面文件的路径,由于个人库就是这样的结构,因此不须要改变,../../
就要根据你项目中实际结构来改变了。微信小程序
该类有如下方法:该类提供了全部获取其余对象的方法,能够经过该类获取其余须要的对象而不是newapi
getMusicSearchHelper()
须要参数:{keyword:"搜索歌曲关键词",limit:数字}
返回:MusicSearchHelper
搜索器
getMusicUrlHelper()
musicId
(数字类型的歌曲id)返回:MusicUrlHelper
Url获取器
getUserSearchHelper()
须要参数:{userName:"搜索用户的用户名关键词",limit:数字}
返回:UserSearchHelper
用户查询器
getUserListHelper()
须要参数:userId
(数字类型的用户id值)
返回:UserListHelper
用户列表查询器
getUserListDetailHelper()
须要参数:listId
(数字类型的列表id)
返回:UserListDetailHelper
用户列表详情信息获取器
用于搜索音乐
可用方法:
getSearchResult()
---获取数据(默认第一页)nextPage()
--- 下一页previousPage()
---上一页getCurrentPage()
---查看当前页数的执行完切换页数后须要再次调用getSearchResult
方法查看新的查询结果。
用于将搜索音乐结果中的id转换为url播放连接
可用方法:
getUrlResult()
---获取url播放连接用于根据用户名关键字搜索用户
可用方法:
getSearchResult()
---获取搜索结果用于获取用户id后根据id获取用户歌单信息
可用方法:
getAllLists()
---获取用户全部歌单getILikeList()
---获取用户的我喜欢歌单用于获取歌单id后获取歌单内歌曲列表
可用方法:
getDeatil()
---获取歌单内列表MusicManager
获取一个MusicSearchHelper
搜索器MusicSearchHelper
的方法:
getSearchResult()
---获取数据(默认第一页)nextPage()
--- 下一页previousPage()
---上一页getCurrentPage()
---查看当前页数的getSearchResult
方法查看新的查询结果。代码实例
const {MusicManager} = require("../../NetEaseCloudMusicApi/src/MusicManager"); async function test(){ // 搜索歌曲 let musicSearchHelper = MusicManager.getMusicSearchHelper({ keyword: "one more time one more chance", limit: 10 }); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); musicSearchHelper.nextPage(); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); musicSearchHelper.previousPage(); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); console.log(musicSearchHelper); } test();
有了搜索结果,咱们还须要url才能播放资源
MusicManager
获取一个MusicUrlHelper
Url获取器MusicUrlHelper
的getUrlResult
方法获取urlurlHelper
的getUrlResult
方法代码实例
const {MusicManager} = require("../../NetEaseCloudMusicApi/src/MusicManager"); async function test(){ // 搜索歌曲 let musicSearchHelper = MusicManager.getMusicSearchHelper({ keyword: "one more time one more chance", limit: 10 }); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); musicSearchHelper.nextPage(); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); musicSearchHelper.previousPage(); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); console.log(musicSearchHelper); // 获取歌曲url let songs = await musicSearchHelper.getSearchResult(); let musicId = songs[0].id; let musicUrlHelper = MusicManager.getMusicUrlHelper(musicId); console.log(`歌曲的ID是:${musicId}`); let url = await musicUrlHelper.getUrlResult(); console.log(`歌曲的url连接是:${url}`); } test();
新增搜索用户以及用户歌单获取接口
MusicManager
获取一个UserSearchHelper
用户查询器UserSearchHelper
的getSearchResult()
方法获取搜索结果async function test(){ // 搜索用户 let userSearchHelper = MusicManager.getUserSearchHelper({ userName: "JabinGP", limit: 20 }); let users = await userSearchHelper.getSearchResult(); console.log(users); }
MusicManager
获取一个UserListHelper
用户查询器经过UserListHelper
的
getILikeList()
---获取我喜欢歌单,返回一个列表对象getAllLists()
---获取全部歌单,返回一个列表对象的数组async function test(){ // 搜索用户 let userSearchHelper = MusicManager.getUserSearchHelper({ userName: "JabinGP", limit: 20 }); let users = await userSearchHelper.getSearchResult(); console.log(users); // 获取我喜欢歌单 let userListHelper = MusicManager.getUserListHelper(users[0].userId); let iLikeList = await userListHelper.getILikeList() console.log(iLikeList); }
与前面一致,再也不赘述
完整实例代码在项目page下的index.js中,运行项目就会自动执行输出结果。
async function test(){ // 搜索歌曲 let musicSearchHelper = MusicManager.getMusicSearchHelper({ keyword: "one more time one more chance", limit: 10 }); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); musicSearchHelper.nextPage(); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); musicSearchHelper.previousPage(); console.log(`如今是第${musicSearchHelper.getCurrentPage()}页`); console.log(await musicSearchHelper.getSearchResult()); console.log(musicSearchHelper); // 获取歌曲url let songs = await musicSearchHelper.getSearchResult(); let musicId = songs[0].id; let musicUrlHelper = MusicManager.getMusicUrlHelper(musicId); console.log(`歌曲的ID是:${musicId}`); let url = await musicUrlHelper.getUrlResult(); console.log(`歌曲的url连接是:${url}`); // 搜索用户 let userSearchHelper = MusicManager.getUserSearchHelper({ userName: "JabinGP", limit: 20 }); let users = await userSearchHelper.getSearchResult(); console.log(users); // 获取用户歌单 let userListHelper = MusicManager.getUserListHelper(users[0].userId); let iLikeList = await userListHelper.getILikeList() console.log(iLikeList); // 获取我喜欢歌单 let userListDeatilHelper = MusicManager.getUserListDetailHelper(iLikeList.id); let listDetail = await userListDeatilHelper.getDeatil(); console.log(listDetail); let timer=0; for(let song of listDetail.tracks){ musicUrlHelper.musicId=song.id; console.log(`歌曲的ID是:${musicUrlHelper.musicId}`); let url2 = await musicUrlHelper.getUrlResult(); console.log(`歌曲的url连接是:${url2}`); if(timer++>20)break; } } test();
2019 4.25目前就只有这两个接口,由于咱们项目就只须要这两个接口,若是有须要更多接口的,能够在下方评论,以上示例代码都在Github项目上的index.js中,也就是你把文件导入微信开发者工具后,取消勾选一下详情的ES6转ES5以及取消勾选合法域名检验,就能够在控制台看到以上示例代码的输出了2019 4.26更新搜索用户和获取用户歌单以及获取歌单详细三个接口。
若是对你有帮助,点个Star吧~