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

转载 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多相关岗位!更多内推信息请扫描以下二维码关注查阅。



十分钟教你打造一个微信语音点歌系统

最近在做一个微信项目,接触到了微信公众平台。通过公众平台可以很方便的搭建一个功能完善的移动应用。昨天发现:开发者可使用手机号来申请接口测试帐号,体验高级接口。    这篇文章的应用将使用到高级接口中...
  • zhuqilin0
  • zhuqilin0
  • 2013年12月03日 19:09
  • 8912

弹幕功能Demo

  • 2016年08月11日 16:47
  • 189KB
  • 下载

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

偶然的机会,发现了B站的点歌机器人,觉得挺好玩的就自己做了一个简易版点歌机器人,预览如下: 功能 使用websocket,支持多人同时点歌,发送弹幕聊天 具有搜索sugg...
  • ourpush
  • ourpush
  • 2016年08月28日 20:03
  • 2202

使用python-aiohttp爬取网易云音乐

通过上文《使用python-aiohttp搭建微信公众平台》,我们已经可以响应来自微信服务器的请求,接下来,我们为公众号增加一个在线点歌的功能。...
  • u011475134
  • u011475134
  • 2017年04月15日 11:24
  • 5696

【php】微信公众平台--点歌功能

一、引言与说明 目前很多公众帐号都可以实现点歌功能,笔者也很好奇是如何实现的,就做了个实验,现将经验分享如下。 有关音乐消息的说明,就不在此赘述,请自行查阅开发文档。 回复音乐消息的关键在于如何获得...
  • bsdcfp
  • bsdcfp
  • 2014年02月01日 18:47
  • 3585

js实现点歌效果

背景音效 站长学院www.pigzz.com>             a{font-size:30pt;color:blue;font-family:Vineta BT}     a:l...
  • sa1176732685
  • sa1176732685
  • 2012年11月20日 20:59
  • 415

今天收到点歌电话

01096000786我一接听,是语音电话,说是免费的,有朋友给我点歌,又没说是谁,然后就开始放歌,我听了几秒就把它挂掉了 网上有人说自己接听也要收费的,2块钱/分钟无语。。。。...
  • zhy97031
  • zhy97031
  • 2007年08月12日 16:14
  • 680

抓取今日头条文章

抓取内容文章作者信息也就是文章作者管理客户端提供文章作者首页地址,http://www.toutiao.com/c/user/6310889977/ 通过如下方式可以获取到作者信息: publi...
  • qq455276333
  • qq455276333
  • 2017年08月02日 09:17
  • 7122

多人实时对战网络同步方式研究

写在开头:已经研究生毕业快一年半了,一直在一家游戏公司做客户端研发。至于这篇文章讲的却是服务端的东西,主要是因为以前一直没想写博客,学到的东西也一直记在本子上就得了。本人喜欢有剧情的东西,像RPG游戏...
  • yscyfy2
  • yscyfy2
  • 2016年09月16日 12:44
  • 3549

c#自学二之KTV点歌系统

1.四种文件的说明,参考:http://stackoverflow.com/questions/774187/what-is-the-purpose-of-vshost-exe-file .ex...
  • CHS007chs
  • CHS007chs
  • 2014年04月02日 21:50
  • 2353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从零开始实现实时多人点歌机器人 (来自网易云音乐)
举报原因:
原因补充:

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