从零开始实现实时多人点歌机器人 (来自网易云音乐)

转载 2016年08月28日 20:03:29

偶然的机会,发现了B站的点歌机器人,觉得挺好玩的就自己做了一个简易版点歌机器人,预览如下:

功能

  1. 使用websocket,支持多人同时点歌,发送弹幕聊天

  2. 具有搜索suggestion,用户体验更佳

  3. 点击mv视频右上角可以缩小放大,不影响用户其他操作

  4. 具有mv的资源,优先播放mv

  5. 对于未播放的已点歌曲,可以进行取消

  6. 加上了实时歌词滚动

  7. ...

其他说明

由于是实时多人点歌,所以不能够跳过当前播放歌曲,也不能跳跃播放,Mv只能够重头开始播放,mp3能够根据线上其他用户的播放进度进行同步

音乐资源均来自网易云音乐,该程序仅用于个人学习,不得用于任何商业用途

关于网易云音乐的接口规则,我就不多说了,因为关于商业机密,可能吃官司的,有兴趣的可以私下找我

技术沉淀

如上图,网易云音乐的请求参数是做了加密处理的。 
关于网易云音乐请求参数的加密方法,简单提下


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
}

最后在上个预览

源码与使用

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/


原文地址:

https://segmentfault.com/a/1190000006667593

【关于我们】

每天名企社招内推微信公众号ourpush),专注于国内各大互联网公司社会招聘内推。每天更新最新互联网名企(包括但不限于BAT网易小米京东乐视携程等名企)内推信息,有技术岗、有产品岗、有运营岗、有设计岗、有交互岗、有销售岗,更有其他N多相关岗位!更多内推信息请扫描以下二维码关注查阅。



相关文章推荐

Android使用supportv7包实现网易云音乐首页titlebar

使用Support.V7包高仿网易云音乐

实现60fps的网易云音乐首页

前言网易云音乐是一款很优秀的音乐软件,我也是它的忠实用户。最近在研究如何更好的开发TableView,接着我写了一个Model驱动的小框架 - MDTable。为了去验证框架的可用性,我选择了网易云音...

android design库DrawerLayout的使用及实现类似网易云音乐菜单效果

用网易云音乐的时候感觉它的侧滑菜单效果还是很酷炫的,而且在看过Design库以后就很清楚它应该是用DrawerLayout实现的(讲道理应该是哈)。 网易云音乐效果图: 建一个Activi...

安卓 实现网易云音乐底部播放栏效果之使用自定义BaseActivity实现 上

起因: 最近在写一个音乐项目,发现网易云音乐的底部播放栏看起来不错,不同的页面切换也能做到无缝连接,于是自己打算仿造一个。    折磨: 1.一开始我看到知乎有大神说使用Activity+Fragme...

安卓 实现网易云音乐底部播放栏效果之使用UI绑定到Service上实现

先说原理:音乐播放需要使用到Service,而播放栏也是属于音乐播放的,那么为什么我们不把这两者合在一起呢? 把UI和音乐Service合在一起,用Service来控制UI界面不是更简单。在进入Act...

用vuejs仿网易云音乐(实现听歌以及搜索功能)

前言前端时间学了vue,一开始看了vue1.0,后来实在觉得技术总得实践,就直接上手vue2.0。然后花了将近一周时间做了一个网易云音乐的小项目。一开始觉得项目比较小,没必要用vuex所以就没有使用,...

项目总结3 类似网易云音乐导航栏指示器(个性推荐、歌单等)的简单实现(一)

我们先来看看网易云音乐导航栏指示器是什么样的。箭头指向的蓝色框就是导航指示器,点击之后下面的view会跟着移动,每个button下面还有个小红线跟着。这个效果其实不难实现,我们先来分析分析。在iOS里...
  • Koptop
  • Koptop
  • 2016年06月18日 12:30
  • 5768

用RotateDrawable实现网易云音乐唱片机效果

Drawable系列之一,简单的用RotateDrawable实现网易云音乐的唱片机效果
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从零开始实现实时多人点歌机器人 (来自网易云音乐)
举报原因:
原因补充:

(最多只允许输入30个字)