{"id":13490961,"url":"https://github.com/imcuttle/request-song-robot","last_synced_at":"2025-04-14T03:25:47.206Z","repository":{"id":45113087,"uuid":"66147609","full_name":"imcuttle/request-song-robot","owner":"imcuttle","description":"点歌机器人！！！（来自网易云音乐）","archived":false,"fork":false,"pushed_at":"2024-07-30T16:17:15.000Z","size":48003,"stargazers_count":28,"open_issues_count":4,"forks_count":8,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-13T18:09:14.600Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imcuttle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-08-20T13:14:43.000Z","updated_at":"2024-12-28T03:18:50.000Z","dependencies_parsed_at":"2022-09-26T17:30:26.510Z","dependency_job_id":null,"html_url":"https://github.com/imcuttle/request-song-robot","commit_stats":null,"previous_names":["moyuyc/request-song-robot"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imcuttle%2Frequest-song-robot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imcuttle%2Frequest-song-robot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imcuttle%2Frequest-song-robot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imcuttle%2Frequest-song-robot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imcuttle","download_url":"https://codeload.github.com/imcuttle/request-song-robot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248758420,"owners_count":21156957,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T19:00:52.406Z","updated_at":"2025-04-14T03:25:47.185Z","avatar_url":"https://github.com/imcuttle.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# 点歌机器人 (来自网易云音乐) \n\n偶然的机会，发现了B站的点歌机器人，觉得挺好玩的就自己做了一个简易版点歌机器人，预览如下：\n\n![ClipboardImage](/upload/1471705339720.png)\n\u003c!--more--\u003e\n\nhhh\ntest break\n\n## 功能\n\n1. 使用websocket，支持多人同时点歌，发送弹幕聊天\n2. 具有搜索suggestion，用户体验更佳\n3. 点击mv视频右上角可以缩小放大，不影响用户其他操作\n4. 具有mv的资源，优先播放mv\n5. 对于未播放的已点歌曲，可以进行取消\n6. ...\n\n## 其他说明\n\n由于是实时多人点歌，所以不能够跳过当前播放歌曲，也不能跳跃播放，Mv只能够重头开始播放，mp3能够根据线上其他用户的播放进度进行同步\n\n**音乐资源均来自网易云音乐，该程序仅用于个人学习，不得用于任何商业用途**\n\n关于网易云音乐的接口规则，我就不多说了，因为关于商业机密，可能吃官司的,有兴趣的可以私下找我\n\n## 技术沉淀\n\n![ClipboardImage](/upload/1471696540554.png)\n如上图，网易云音乐的请求参数是做了加密处理的。  \n关于网易云音乐请求参数的加密方法，简单提下\n```js\n\naesRsaEncrypt: function (text) {\n    var secKey = createSecretKey(16);\n    return {\n        params: aesEncrypt(aesEncrypt(text, nonce), secKey),\n        encSecKey: rsaEncrypt(secKey, pubKey, modulus)\n    }\n}\n```\n\n![ClipboardImage](/upload/1471697286239.png)\n\n`secKey`为本地随机生成的密文，通过rsa非对称加密算法加密，然后网易服务器通过约定好的与`pubKey`对应的另一个因数进行解密，得到`secKey`, 然后通过两次aes逆运算就能得到`text`，也就是真实的参数了。  \n\n这样做的好处不言而喻，不法分子很难破解抓取到的请求数据  \n但服务器负担加重了，每次提供服务前，还得先去破解一番\n\n另外！网易还做了一点安全措施，调用接口得到音乐url是有时间限制的!!!\n\n![ClipboardImage](/upload/1471697765689.png)\n\n所以，不能够在点歌的时候就把音乐url抓取下来保存，必须得有用户需要播放的时候再抓取url\n  \n**怎么伪造浏览器请求报头中的`Referer`字段?**\n\n而且云音乐的mvurl不支持外链访问，所以我只好做个代理，转发视频数据流了，但这样做的不好就是mv播放不能跳跃播放（如最上方动图所示）\n如果需要实时的播放视频流, 好像就要牵涉到流媒体传输服务器了, 需要应用层`RTSP`协议, 具体也不是很清楚, 有时间的话再好好看看\n还有希望能加上歌词\n`express`中静态资源已经实现了\n\n```javascript\n\nlet url = req.url\nlet q = URL.parse(req.url, true).query\nif(url.startsWith(SUFFIX)) {\n    if(q.id!=0)\n        gs.getMvUrl(q.id)\n            .then(json =\u003e {\n                if(json.hurl || json.murl) {\n                    res.writeHead(200, {'Content-Type': u.suffix2Type('mp4')});\n                    var s = gs.getStream(json.hurl || json.murl)\n                    s.on('error', (err) =\u003e {\n                        s.close \u0026\u0026 s.close()\n                        console.error(err)\n                        res.end()\n                    })\n                    //传递MV视频数据流\n                    s.pipe(res)\n                } else {\n                    res.writeHead(500);\n                    res.end('Error '+JSON.stringify(json))\n                }\n            })\n    else {\n        res.writeHead(500);\n        res.end('Error')\n    }\n    return\n}\n```\n\n## 最后在上个预览\n\n![](/upload/gif3.gif)\n\n## 源码与使用\n\n[song-robot](https://github.com/moyuyc/request-song-robot)\n\n```\nnpm i song-robot -g\nsong-robot -p 9888\nopen http://localhost:9888\n```\n\n## 参考资料\n\nreferer\nhttps://zh.wikipedia.org/zh/HTTP%E5%8F%83%E7%85%A7%E4%BD%8D%E5%9D%80\n\n网易云api破解\nhttp://qianzewei.com/2015/12/10/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90api%E6%95%B4%E7%90%86/#\n\nnode crypto  \nhttps://nodejs.org/api/crypto.html\n\n输入框光标变色  \nhttp://jsfiddle.net/8k1k0awb/\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimcuttle%2Frequest-song-robot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimcuttle%2Frequest-song-robot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimcuttle%2Frequest-song-robot/lists"}