實時多人點歌機器人 (來自網易雲音樂)

偶然的機會,發現了B站的點歌機器人,以爲挺好玩的就本身作了一個簡易版點歌機器人,預覽以下:javascript

clipboard.png

clipboard.png

功能

  1. 使用websocket,支持多人同時點歌,發送彈幕聊天html

  2. 具備搜索suggestion,用戶體驗更佳java

  3. 點擊mv視頻右上角能夠縮小放大,不影響用戶其餘操做node

  4. 具備mv的資源,優先播放mvgit

  5. 對於未播放的已點歌曲,能夠進行取消github

  6. 加上了實時歌詞滾動web

  7. ...算法

其餘說明

因爲是實時多人點歌,因此不可以跳過當前播放歌曲,也不能跳躍播放,Mv只可以重頭開始播放,mp3可以根據線上其餘用戶的播放進度進行同步npm

音樂資源均來自網易雲音樂,該程序僅用於我的學習,不得用於任何商業用途json

關於網易雲音樂的接口規則,我就很少說了,由於關於商業機密,可能吃官司的,有興趣的能夠私下找我

技術沉澱

clipboard.png

如上圖,網易雲音樂的請求參數是作了加密處理的。
關於網易雲音樂請求參數的加密方法,簡單提下

aesRsaEncrypt: function (text) {
    var secKey = createSecretKey(16);
    return {
        params: aesEncrypt(aesEncrypt(text, nonce), secKey),
        encSecKey: rsaEncrypt(secKey, pubKey, modulus)
    }
}

clipboard.png

secKey爲本地隨機生成的密文,經過rsa非對稱加密算法加密,而後網易服務器經過約定好的與pubKey對應的另外一個因數進行解密,獲得secKey, 而後經過兩次aes逆運算就能獲得text,也就是真實的參數了。

這樣作的好處不言而喻,不法分子很難破解抓取到的請求數據
但服務器負擔加劇了,每次提供服務前,還得先去破解一番

另外!網易還作了一點安全措施,調用接口獲得音樂url是有時間限制的!!!

clipboard.png

因此,不可以在點歌的時候就把音樂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
}

最後在上個預覽

clipboard.png

源碼與使用

song-robot

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/

相關文章
相關標籤/搜索