解锁网易云音乐客户端变灰歌曲
- 使用 QQ / 虾米 / 百度 / 酷狗 / 酷我 / 咕咪 / JOOX 音源替换变灰歌曲链接 (默认仅启用前三,可通过
-o
设置) - 为请求增加
X-Real-IP
参数解锁海外限制,支持指定网易云服务器 IP,支持设置上游 HTTP / HTTPS 代理 - 完整的流量代理功能 (HTTP / HTTPS),可直接作为系统代理 (同时支持 PAC)
从源码运行
$ node app.js
或使用 Docker
$ docker run nondanee/unblockneteasemusic
$ docker-compose up
$ node app.js -h
Usage: unblockneteasemusic [options] [value ...]
Options:
-v, --version output the version number
-p, --port <port> specify server port
-u, --proxy-url <url> request through upstream proxy
-f, --force-host <host> force the netease server ip
-o, --match-order <name,...> set priority of sources
-t, --token <token> set up http basic authentication
-s, --strict enable proxy limitation
-h, --help output usage information
若将服务部署到公网,强烈建议使用严格模式 (此模式下仅放行网易云音乐所属域名的请求) -s
限制代理范围 (需使用 PAC 或 hosts),或启用 Proxy Authentication (目前密码认证在 Windows 客户端设置和 macOS 系统设置都无法生效,请不要使用),以防代理被他人滥用-t <name>:<password>
设置代理用户名密码
支持 Windows 客户端,UWP 客户端,Linux 客户端,macOS 客户端和 Android 客户端
目前除 UWP 外其它客户端都默认请求 HTTPS 接口,本代理对网易云所有 HTTPS API 连接返回空数据 (网易云网页版会被屏蔽),促使客户端降级使用HTTP接口 (降级有时不能自动触发,若提示 "网络不给力" 请切换页面标签试试)
测试发现 iOS 客户端设置代理有效果 (HD 版不行),虽 Apple 强制要求使用 HTTPS 但 API 请求仍可以降级,不过播放音源地址需要 HTTPS,因此需要一个有可信任证书的 (公网) HTTPS 接口来转发流量,无法直接使用 (其它项目有提到使用 Surge,Shadowrocket 可以直接转发 HTTPS 流量到 HTTP,有兴趣可以试试)
向 hosts 文件添加两条规则
<Server IP> music.163.com
<Server IP> interface.music.163.com
使用此方法必须监听 80 端口
-p 80
若在本机运行程序,请指定网易云服务器 IP
-f xxx.xxx.xxx.xxx
(可在修改 hosts 前通过ping music.163.com
获得) 或 使用代理-u http(s)://xxx.xxx.xxx.xxx:xxx
,以防请求死循环Android 客户端下修改 hosts 无法使用,原因和解决方法详见云音乐安卓又搞事啦,安卓免 root 绕过网易云音乐 IP 限制
PAC 自动代理脚本地址
http://<Server Name:PORT>/proxy.pac
全局代理地址填写服务器地址和端口号即可
平台 | 设置方法 |
---|---|
Windows | 设置 > 工具 > 自定义代理 (客户端内) |
UWP | Windows 设置 > 网络和 Internet > 代理 |
Linux | 系统设置 > 网络 > 网络代理 |
macOS | 系统偏好设置 > 网络 > 高级 > 代理 |
Android | WLAN > 修改网络 > 高级选项 > 代理 |
iOS | Surge,Shadowrocket 等添加配置 |
UWP 应用需要开启 loopback 才会使用系统代理,可借助 Fiddler,EnableLoopback Utility 等工具
iOS Surge 配置
[Proxy] UnblockNeteaseMusic = http,<Server Name>,<PORT>,, [Rule] USER-AGENT,NeteaseMusic*,UnblockNeteaseMusic FINAL,DIRECT
[编程层面] 作为依赖库使用 (在纠结要不要发布到 NPM)
const match = require('./UnblockNeteaseMusic')
/**
* Set proxy or hosts if needed
*/
global.proxy = require('url').parse('http://127.0.0.1:1080')
global.hosts = {'i.y.qq.com': '59.37.96.220'}
/**
* Find matching song from other platforms
* @param {Number} id netease song id
* @param {Array<String>||undefined} source support qq, xiami, baidu, kugou, kuwo, migu, joox
* @return {Promise<Object>}
*/
match(557581404, ['qq', 'xiami', 'baidu']).then(song => console.log(song))
感谢大佬们为逆向 eapi 所做的努力
使用的其它平台音源 API 出自
listen1/listen1_chrome_extension
向所有同类产品致敬
EraserKing/Unblock163MusicClient
bin456789/Unblock163MusicClient-Xposed
fengjueming/unblock-NetEaseMusic
mengskysama/163-Cloud-Music-Unlock
typcn/163music-mac-client-unlock
The MIT License