当前位置: 首页 > 后端技术 > Node.js

网易云音乐API接口-music

时间:2023-04-03 21:04:42 Node.js

关注nodejs很久了,直到最近有空尝试写了一个nodejs小demo。文章如有错误,欢迎批评指正!来自未知的前端。前言(本项目仅供学习使用)1、本demo一开始是用koa2开发的,后来由于koa2的异步响应,改为express(还在研究中);后面会尝试使用koa2进行改造。2、http请求(csrf伪造)主要是指netmusic-node;其他部分参考网易CloudMusicApi。3、本项目预览地址https://music.jeeas.cn/已经实现了网易云音乐的基本功能和get方式的websocket数据推送请求1、搜索歌曲名称params[s=歌曲名称,类型,offset,limit]getApi/search?s=songname2.单曲播放地址params[id=songid,br]getApi/music/url?id=256430933.歌词params[id]getApi/lyric?id=256430934.单曲详情params[id]getApi/music/detail?id=256430935.专辑详情params[id]getApi/album/detail?id=22631646.歌曲列表类型listparams[]getApi/playlist/catlist7.歌单类型列表-热门类型params[]getApi/playlist/hot8.推荐新歌params[]getApi/personalized/newsong9.搜索热门params[]getApi/search/hot10.推荐歌曲列表params[]getApi/personalizedpackage.json主包描述“dependencies”:{“apicache”:“^1.5.2”,“big-integer”:“^1.6.47”,“crypto”:“^1.0.1”,“ejs”:"^2.7.1","express":"^4.17.1","express-rate-limit":"^3.5.3","fs-extra":"^8.1.0","redis":“^2.8。0","request":"^2.88.0","socket.io":"~2.1.1"}apicache:请求缓存,防止过于频繁的api调用被禁止ipejs:datatemplateexpress-rate-limit:express内部封装api访问限制redis:数据暂存在redis中,不涉及数据库操作...varredisClient=false;varioSocket=null;//开始查看redis状态redis.initRedis(function(client){redisClient=client&&client!=''&&client!=null?true:false;io.redisClient=redisClient;});...socketServer.initServer(io);//static//api访问限制20s内60次//cache缓存2分钟2分钟0.05分钟=3s//设置跨域访问//useejs//使用路由app.use(router);...server.listen(port,()=>{console.log('SocketServerlisteningatport%d',port);console.log('访问http://127.0.0.1:%d',port);console.log('你好,我是%s,有什么可以帮忙的吗?',serverName);});http.js项目http请求简单封装varhttp=require('http');...functionWebAPI(options,callback){//....varhttpClients=http.request({hostname:'music.163.com',method:method,path:options.path,headers:{...}},function(req,res){req.on('error',function(err){//请求异常处理...});req.on('data',function(chunk){//获取数据...});req.on('end',function(){//网易云api调用有时响应为空,为空时,重新发起请求//数据接收并处理rsp//使用websoket发送所有客户端在回调广播消息之前,更新rediscallback(rsp);})});//网易云csrf伪造,详解crypto.jshttpClients.write('params='+cryptoreq.params+'&encSecKey='+cryptoreq.encSecKey);httpClients.end();}...module.exports={WebAPI:WebAPI,}socket.js服务器从客户端接收消息并向所有客户端广播消息(api调用次数)functioninitServer(io,callback){if(io){io.on('connection',function(socket){socket.on('message',function(data){console.log(data.message)});//console.log('emitEveryonepushes,broadcast向除了某个socket之外的所有人发送消息,eg:connectiondoesnotpush');//向所有连接推送消息socket.broadcast.emit('news',{message:'anewconnection',newsType:'server-prop'});如果(回调){回调(套接字)}socket.on('disconnect',function(){//console.log('disconnect')});});}}module.exports={initServer:initServer};redis.jsredis简单查询更新包varredis=require('redis');varclient=null;functioninitRedis(callback){if(!client){client=redis.createClient(6379,'127.0.0.1');}client.on('connect',function(){//redis连接成功console.log('redis连接成功!');if(callback){callback(client);}});让第一个=真;client.on('error',function(){//redis连接失败console.log('redisconnecterror!');if(callback&&first==true){first=false;callback(null);}});};functionhmSet(options,callback){if(client){client.hmset(options.apiType,options.apiName,options.total);//redis简单使用(设置keys的值)}}functionhgetAll(keys,callback,isTotal){if(client){client.hgetall(keys,function(err,obj){//redis简单使用(查询所有key)});}}functiongetApiNumber(res){//简单计算api调用总数}module.exports={hmSet:hmSet,hgetAll:hgetAll,initRedis:initRedis};了解了基本功能后,我们将着重介绍routes.js路由内部的API封装,这也是整个demo部署的核心部分。http(GET方法)是主要方法。这一次,我将以Socket调用(内部)的例子来分享自己的经验。routes.js路由routes.jsejs指令需要在server.js入口配置app.set('views',path.join(__dirname,'./views'));app.set("viewengine","ejs");constexpress=require('express');constrouter=express.Router();constversion="/v1";...router.get('/music',function(request,response){//监听路由routing/musicaccess//console.log(request.query)//模板使用ejs,response需要设置type,否则会显示ejs源码response.type('html');//普通模式response.render(路由模板,返回页面参数)//此时会搜索ejs配置,view/music.ejsresponse.render('music',{title:'网易云音乐云',keywords:Tools.randomSongs()//随机选择一首歌名进行搜索})//music.ejs模板中,<%=title%><%=keywords%>可以使用变量});/*****1.搜索歌曲名称**params[s=歌曲名称,类型,offset,limit]**/search?s=大城市,小爱***/router.get(version+'/search',function(request,response){//type:1:单曲,10:专辑,100:歌手,1000:播放列表,1002:用户,1004:MV,1006:歌词,1009:电台,1014:视频//offset:偏移量,用于分页,如:如:(页数-1)*20,其中20为limit的值,默认为0vardata={s:decodeURI(request.query.s)||'',偏移量:request.query.offset||0,限制:request.query.limit||20、类型:request.query.type||1};varparams={path:'/weapi/cloudsearch/get/web',request:request,response:response,data:data,apiType:'1'};//response.sendinsideWebAPI响应网络数据Tools.WebAPI(params)});...module.exports=router;然后在server.js下挂载router.js,整个配置的路由就可以访问了。该演示刚开始使用koa2作为服务器端框架。router.get(xx,function(request,response){内部response异步响应不好处理(初学者孤陋寡闻,很抱歉,大家一起讨论),使用express处理异步响应})网易cloudAPI请求接入方式,大家可以抓包或者搜索网易云音乐官网慢慢摸索查看。当然,你也可以借鉴别人的劳动成果!体验写作