偶然的机会,发现了B站的点歌机器人,以为挺好玩的就本身作了一个简易版点歌机器人,预览以下:javascript
使用websocket,支持多人同时点歌,发送弹幕聊天html
具备搜索suggestion,用户体验更佳java
点击mv视频右上角能够缩小放大,不影响用户其余操做node
具备mv的资源,优先播放mvgit
对于未播放的已点歌曲,能够进行取消github
加上了实时歌词滚动web
...算法
因为是实时多人点歌,因此不可以跳过当前播放歌曲,也不能跳跃播放,Mv只可以重头开始播放,mp3可以根据线上其余用户的播放进度进行同步npm
音乐资源均来自网易云音乐,该程序仅用于我的学习,不得用于任何商业用途json
关于网易云音乐的接口规则,我就很少说了,由于关于商业机密,可能吃官司的,有兴趣的能够私下找我
如上图,网易云音乐的请求参数是作了加密处理的。
关于网易云音乐请求参数的加密方法,简单提下
aesRsaEncrypt: function (text) { var secKey = createSecretKey(16); return { params: aesEncrypt(aesEncrypt(text, nonce), secKey), encSecKey: rsaEncrypt(secKey, pubKey, modulus) } }
secKey
为本地随机生成的密文,经过rsa非对称加密算法加密,而后网易服务器经过约定好的与pubKey
对应的另外一个因数进行解密,获得secKey
, 而后经过两次aes逆运算就能获得text
,也就是真实的参数了。
这样作的好处不言而喻,不法分子很难破解抓取到的请求数据
但服务器负担加剧了,每次提供服务前,还得先去破解一番
另外!网易还作了一点安全措施,调用接口获得音乐url是有时间限制的!!!
因此,不可以在点歌的时候就把音乐url抓取下来保存,必须得有用户须要播放的时候再抓取url
并且云音乐的mvurl不支持跨域访问,因此我只好作个代理,转发视频数据流了,但这样作的很差就是mv播放不能跳跃播放(如最上方动图所示),不知有没有大牛知道如何解决这个问题
let url = req.url let q = URL.parse(req.url, true).query if(url.startsWith(SUFFIX)) { if(q.id!=0) gs.getMvUrl(q.id) .then(json => { if(json.hurl || json.murl) { res.writeHead(200, {'Content-Type': u.suffix2Type('mp4')}); var s = gs.getStream(json.hurl || json.murl) s.on('error', (err) => { s.close && s.close() console.error(err) res.end() }) //传递MV视频数据流 s.pipe(res) } else { res.writeHead(500); res.end('Error '+JSON.stringify(json)) } }) else { res.writeHead(500); res.end('Error') } return }
npm i song-robot -g song-robot -p 9888 open http://localhost:9888
referer
https://zh.wikipedia.org/zh/H...
网易云api破解
http://qianzewei.com/2015/12/...
node crypto
https://nodejs.org/api/crypto...
输入框光标变色
http://jsfiddle.net/8k1k0awb/