偶然的機會,發現了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/