Skip to content

Commit

Permalink
support web nondanee#54, add warning
Browse files Browse the repository at this point in the history
  • Loading branch information
nondanee committed Apr 24, 2019
1 parent 6cad2c6 commit 59a369a
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,15 @@ optional arguments:

## 使用

**警告:本项目不提供线上 demo,请不要轻易信任使用他人提供的公开代理服务,以免发生安全问题**

**若将服务部署到公网,强烈建议使用严格模式 (此模式下仅放行网易云音乐所属域名的请求) `-s` 限制代理范围 (需使用 PAC 或 hosts),~~或启用 Proxy Authentication `-t <name>:<password>` 设置代理用户名密码~~ (目前密码认证在 Windows 客户端设置和 macOS 系统设置都无法生效,请不要使用),以防代理被他人滥用**

支持 Windows 客户端,UWP 客户端,Linux 客户端,macOS 客户端和 Android 客户端
支持 Windows 客户端,UWP 客户端,Linux 客户端,macOS 客户端 (726 版本以上需要自签证书),Android 客户端和网页版 (需要自签证书)

目前除 UWP 外其它客户端都默认请求 HTTPS 接口,本代理对网易云所有 HTTPS API 连接返回空数据 (网易云网页版会被屏蔽),促使客户端降级使用HTTP接口 (降级有时不能自动触发,若提示 "网络不给力" 请切换页面标签试试)
目前除 UWP 外其它客户端都优先请求 HTTPS 接口,默认情况下本代理对网易云所有 HTTPS API 连接返回空数据,促使客户端降级使用HTTP接口 (降级有时不能自动触发,若提示 "网络不给力" 请切换页面标签试试)

测试发现 iOS 客户端设置 WLAN 代理有效果 (HD 版不行),虽 Apple 强制要求使用 HTTPS 但 API 请求仍可以降级,不过播放音源地址需要 HTTPS,因此需要一个有可信任证书的 (公网) HTTPS 接口来转发流量,无法直接使用 (其它项目有提到使用 Surge,Shadowrocket 可以直接转发 HTTPS 流量到 HTTP,有兴趣可以试试)
测试发现 iOS 客户端设置 WLAN 代理有效果 (HD 版不行),虽 Apple 强制要求使用 HTTPS 但 API 请求仍可以降级,不过播放音源地址需要 HTTPS,因此需要一个有可信任证书的 (公网) HTTPS 接口来转发流量,设置代理无法直接使用 (其它项目有提到使用 Surge,Shadowrocket 可以直接转发 HTTPS 流量到 HTTP,有兴趣可以试试)

### 方法 1. 修改 hosts

Expand Down
12 changes: 8 additions & 4 deletions hook.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ hook.target.path = [
'/api/v1/album',
'/api/playlist/privilege',
'/api/song/enhance/player/url',
'/api/song/enhance/player/url/v1',
'/api/song/enhance/download/url',
'/batch',
'/api/batch',
Expand All @@ -54,14 +55,14 @@ hook.request.before = ctx => {
const req = ctx.req
req.url = (req.url.startsWith('http://') ? '' : (req.socket.encrypted ? 'https:' : 'http:') + '//music.163.com') + req.url
const url = parse(req.url)
const netease = {}
if((hook.target.host.includes(url.hostname)) && req.method == 'POST' && (url.path == '/api/linux/forward' || url.path.startsWith('/eapi/'))){
return request.read(req)
.then(body => {
req.body = body
req.headers['X-Real-IP'] = '118.88.88.88'
if(body){
let data = null
let netease = {}
netease.pad = (body.match(/%0+$/) || [''])[0]
netease.forward = (url.path == '/api/linux/forward')
if(netease.forward){
Expand All @@ -86,6 +87,9 @@ hook.request.before = ctx => {
console.log(error)
})
}
if((hook.target.host.includes(url.hostname)) && url.path.startsWith('/weapi/')){
ctx.netease = {web: true, path: url.path.replace(/^\/weapi\//, '/api/').replace(/\?.+$/, '').replace(/\/\d*$/, '')}
}
else if(req.url.includes('package')){
try{
let data = req.url.split('package/').pop().split('/')
Expand Down Expand Up @@ -120,9 +124,9 @@ hook.request.after = ctx => {
netease.jsonBody = JSON.parse(crypto.eapi.decrypt(buffer).toString())
}

if(netease.path.includes('manipulate') && [401, 512].includes(netease.jsonBody.code))
if(netease.path.includes('manipulate') && [401, 512].includes(netease.jsonBody.code) && !netease.web)
return tryCollect(ctx)
else if(netease.path == '/api/song/like' && [401, 512].includes(netease.jsonBody.code))
else if(netease.path == '/api/song/like' && [401, 512].includes(netease.jsonBody.code) && !netease.web)
return tryLike(ctx)
else if(netease.path.includes('url'))
return tryMatch(ctx)
Expand Down Expand Up @@ -266,7 +270,7 @@ const tryMatch = ctx => {
tasks = [inject(jsonBody.data)]
}
else{
target = parseInt((netease.param.ids instanceof Array ? netease.param.ids : JSON.parse(netease.param.ids))[0].toString().replace('_0', '')) // reduce time cost
target = netease.web ? 0 : parseInt((netease.param.ids instanceof Array ? netease.param.ids : JSON.parse(netease.param.ids))[0].toString().replace('_0', '')) // reduce time cost
tasks = jsonBody.data.map(item => inject(item))
}
return Promise.all(tasks).catch(() => {})
Expand Down

0 comments on commit 59a369a

Please sign in to comment.