mirror of
https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
synced 2025-10-22 06:03:09 +00:00
feat(randomCNIP): 添加随机中国IP选项
This commit is contained in:
parent
2cbd17a6d7
commit
d78a20ea11
1
interface.d.ts
vendored
1
interface.d.ts
vendored
@ -2,6 +2,7 @@ export interface RequestBaseConfig {
|
|||||||
cookie?: string
|
cookie?: string
|
||||||
realIP?: string // IPv4/IPv6 filled in X-Real-IP
|
realIP?: string // IPv4/IPv6 filled in X-Real-IP
|
||||||
proxy?: string // HTTP proxy
|
proxy?: string // HTTP proxy
|
||||||
|
randomCNIP?: boolean // Whether to use a random Chinese IP address filled in X-Real-IP
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MultiPageConfig {
|
export interface MultiPageConfig {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@neteaseapireborn/api",
|
"name": "@neteaseapireborn/api",
|
||||||
"version": "4.29.8",
|
"version": "4.29.9",
|
||||||
"description": "为停更的网易云音乐 NodeJs API 提供持续的维护!",
|
"description": "为停更的网易云音乐 NodeJs API 提供持续的维护!",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node app.js",
|
"start": "node app.js",
|
||||||
|
22
pnpm-lock.yaml
generated
22
pnpm-lock.yaml
generated
@ -196,8 +196,8 @@ packages:
|
|||||||
'@types/express-fileupload@1.5.1':
|
'@types/express-fileupload@1.5.1':
|
||||||
resolution: {integrity: sha512-DllImBVI1lCyjl2klky/TEwk60mbNebgXv1669h66g9TfptWSrEFq5a/raHSutaFzjSm1tmn9ypdNfu4jPSixQ==}
|
resolution: {integrity: sha512-DllImBVI1lCyjl2klky/TEwk60mbNebgXv1669h66g9TfptWSrEFq5a/raHSutaFzjSm1tmn9ypdNfu4jPSixQ==}
|
||||||
|
|
||||||
'@types/express-serve-static-core@5.0.7':
|
'@types/express-serve-static-core@5.1.0':
|
||||||
resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==}
|
resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==}
|
||||||
|
|
||||||
'@types/express@5.0.3':
|
'@types/express@5.0.3':
|
||||||
resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
|
resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
|
||||||
@ -2020,8 +2020,8 @@ packages:
|
|||||||
secure-json-parse@2.7.0:
|
secure-json-parse@2.7.0:
|
||||||
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
|
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
|
||||||
|
|
||||||
semver@7.7.2:
|
semver@7.7.3:
|
||||||
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
|
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@ -2596,7 +2596,7 @@ snapshots:
|
|||||||
'@types/busboy': 1.5.4
|
'@types/busboy': 1.5.4
|
||||||
'@types/express': 5.0.3
|
'@types/express': 5.0.3
|
||||||
|
|
||||||
'@types/express-serve-static-core@5.0.7':
|
'@types/express-serve-static-core@5.1.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 24.6.1
|
'@types/node': 24.6.1
|
||||||
'@types/qs': 6.14.0
|
'@types/qs': 6.14.0
|
||||||
@ -2606,7 +2606,7 @@ snapshots:
|
|||||||
'@types/express@5.0.3':
|
'@types/express@5.0.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/body-parser': 1.19.6
|
'@types/body-parser': 1.19.6
|
||||||
'@types/express-serve-static-core': 5.0.7
|
'@types/express-serve-static-core': 5.1.0
|
||||||
'@types/serve-static': 1.15.9
|
'@types/serve-static': 1.15.9
|
||||||
|
|
||||||
'@types/http-errors@2.0.5': {}
|
'@types/http-errors@2.0.5': {}
|
||||||
@ -2650,7 +2650,7 @@ snapshots:
|
|||||||
functional-red-black-tree: 1.0.1
|
functional-red-black-tree: 1.0.1
|
||||||
ignore: 5.3.2
|
ignore: 5.3.2
|
||||||
regexpp: 3.2.0
|
regexpp: 3.2.0
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
tsutils: 3.21.0(typescript@4.5.2)
|
tsutils: 3.21.0(typescript@4.5.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 4.5.2
|
typescript: 4.5.2
|
||||||
@ -2696,7 +2696,7 @@ snapshots:
|
|||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
globby: 11.1.0
|
globby: 11.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
tsutils: 3.21.0(typescript@4.5.2)
|
tsutils: 3.21.0(typescript@4.5.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 4.5.2
|
typescript: 4.5.2
|
||||||
@ -4245,7 +4245,7 @@ snapshots:
|
|||||||
|
|
||||||
node-abi@3.78.0:
|
node-abi@3.78.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
|
|
||||||
node-fetch@2.7.0:
|
node-fetch@2.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -4433,7 +4433,7 @@ snapshots:
|
|||||||
https-proxy-agent: 5.0.1
|
https-proxy-agent: 5.0.1
|
||||||
node-fetch: 2.7.0
|
node-fetch: 2.7.0
|
||||||
progress: 2.0.3
|
progress: 2.0.3
|
||||||
semver: 7.7.2
|
semver: 7.7.3
|
||||||
tar-fs: 2.1.4
|
tar-fs: 2.1.4
|
||||||
yargs: 16.2.0
|
yargs: 16.2.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@ -4737,7 +4737,7 @@ snapshots:
|
|||||||
|
|
||||||
secure-json-parse@2.7.0: {}
|
secure-json-parse@2.7.0: {}
|
||||||
|
|
||||||
semver@7.7.2: {}
|
semver@7.7.3: {}
|
||||||
|
|
||||||
send@1.2.0:
|
send@1.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -75,6 +75,8 @@ npx @neteaseapireborn/api@latest
|
|||||||
|
|
||||||
v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器(访问 Vercel 部署的接口,需要额外加一个 realIP 参数,如 `/song/url?id=1969519579&realIP=116.25.146.177`)
|
v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器(访问 Vercel 部署的接口,需要额外加一个 realIP 参数,如 `/song/url?id=1969519579&realIP=116.25.146.177`)
|
||||||
|
|
||||||
|
v4.29.9 加入了生成随机中国 IP 功能, 在请求时加上 `randomCNIP=true` 即可使用随机中国 IP, 如 `/song/url?id=1969519579&randomCNIP=true`
|
||||||
|
|
||||||
不能正常访问的,绑定下国内备案过的域名,之后即可正常访问
|
不能正常访问的,绑定下国内备案过的域名,之后即可正常访问
|
||||||
|
|
||||||
### 操作方法
|
### 操作方法
|
||||||
@ -230,6 +232,8 @@ $ sudo docker run -d -p 3000:3000 netease-music-api
|
|||||||
!> 由于网易限制,此项目在国外服务器或部分国内云服务上使用会受到限制,如 `460 cheating异常`,如需解决 , 可使用`realIP`参数,传进国内 IP 解决,如:`?realIP=116.25.146.177`
|
!> 由于网易限制,此项目在国外服务器或部分国内云服务上使用会受到限制,如 `460 cheating异常`,如需解决 , 可使用`realIP`参数,传进国内 IP 解决,如:`?realIP=116.25.146.177`
|
||||||
即可解决
|
即可解决
|
||||||
|
|
||||||
|
!> 接上, v4.29.9 加入了生成随机中国 IP 功能, 在请求时加上 `randomCNIP=true` 即可使用随机中国 IP, 如 `/song/url?id=1969519579&randomCNIP=true`
|
||||||
|
|
||||||
!> 图片加上 `?param=宽y高` 可控制图片尺寸,如 `http://p4.music.126.net/JzNK4a5PjjPIXAgVlqEc5Q==/109951164154280311.jpg?param=200y200`, `http://p4.music.126.net/JzNK4a5PjjPIXAgVlqEc5Q==/109951164154280311.jpg?param=50y50`
|
!> 图片加上 `?param=宽y高` 可控制图片尺寸,如 `http://p4.music.126.net/JzNK4a5PjjPIXAgVlqEc5Q==/109951164154280311.jpg?param=200y200`, `http://p4.music.126.net/JzNK4a5PjjPIXAgVlqEc5Q==/109951164154280311.jpg?param=50y50`
|
||||||
|
|
||||||
!> 分页接口返回字段里有`more`,more 为 true 则为有下一页
|
!> 分页接口返回字段里有`more`,more 为 true 则为有下一页
|
||||||
|
@ -99,7 +99,7 @@ async function getModulesDefinitions(
|
|||||||
*/
|
*/
|
||||||
async function checkVersion() {
|
async function checkVersion() {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
exec('npm info NeteaseCloudMusicApi version', (err, stdout) => {
|
exec('npm info NeteaseCloudMusicApiEnhanced version', (err, stdout) => {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
let version = stdout.trim()
|
let version = stdout.trim()
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
const logger = require('./logger')
|
||||||
// 预先定义常量和函数引用
|
// 预先定义常量和函数引用
|
||||||
const chinaIPPrefixes = [
|
const chinaIPPrefixes = [
|
||||||
'116.25',
|
'116.25',
|
||||||
@ -80,7 +81,9 @@ module.exports = {
|
|||||||
generateRandomChineseIP() {
|
generateRandomChineseIP() {
|
||||||
// 优化:使用预绑定的函数和常量
|
// 优化:使用预绑定的函数和常量
|
||||||
const randomPrefix = chinaIPPrefixes[floor(random() * prefixesLength)]
|
const randomPrefix = chinaIPPrefixes[floor(random() * prefixesLength)]
|
||||||
return `${randomPrefix}.${generateIPSegment()}.${generateIPSegment()}`
|
const returns = `${randomPrefix}.${generateIPSegment()}.${generateIPSegment()}`
|
||||||
|
logger.info('Generated Random Chinese IP:', returns)
|
||||||
|
return returns
|
||||||
},
|
},
|
||||||
// 生成chainId的函数
|
// 生成chainId的函数
|
||||||
generateChainId(cookie) {
|
generateChainId(cookie) {
|
||||||
|
@ -5,6 +5,7 @@ const createOption = (query, crypto = '') => {
|
|||||||
ua: query.ua || '',
|
ua: query.ua || '',
|
||||||
proxy: query.proxy,
|
proxy: query.proxy,
|
||||||
realIP: query.realIP,
|
realIP: query.realIP,
|
||||||
|
randomCNIP: query.randomCNIP || false,
|
||||||
e_r: query.e_r || undefined,
|
e_r: query.e_r || undefined,
|
||||||
domain: query.domain || '',
|
domain: query.domain || '',
|
||||||
checkToken: query.checkToken || false,
|
checkToken: query.checkToken || false,
|
||||||
|
@ -3,6 +3,7 @@ const encrypt = require('./crypto')
|
|||||||
const CryptoJS = require('crypto-js')
|
const CryptoJS = require('crypto-js')
|
||||||
const { default: axios } = require('axios')
|
const { default: axios } = require('axios')
|
||||||
const { PacProxyAgent } = require('pac-proxy-agent')
|
const { PacProxyAgent } = require('pac-proxy-agent')
|
||||||
|
const logger = require('./logger')
|
||||||
const http = require('http')
|
const http = require('http')
|
||||||
const https = require('https')
|
const https = require('https')
|
||||||
const tunnel = require('tunnel')
|
const tunnel = require('tunnel')
|
||||||
@ -160,8 +161,7 @@ const createRequest = (uri, data, options) => {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
// 变量声明和初始化
|
// 变量声明和初始化
|
||||||
const headers = options.headers ? { ...options.headers } : {}
|
const headers = options.headers ? { ...options.headers } : {}
|
||||||
const ip = options.realIP || options.ip || ''
|
const ip = options.realIP || options.ip || (options.randomCNIP ? generateRandomChineseIP() : '')
|
||||||
|
|
||||||
// IP头设置
|
// IP头设置
|
||||||
if (ip) {
|
if (ip) {
|
||||||
headers['X-Real-IP'] = ip
|
headers['X-Real-IP'] = ip
|
||||||
@ -255,10 +255,10 @@ const createRequest = (uri, data, options) => {
|
|||||||
break
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.log('[ERR]', 'Unknown Crypto:', crypto)
|
logger.error('Unknown Crypto:', crypto)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
// console.log(url);
|
// logger.info(url);
|
||||||
// settings创建
|
// settings创建
|
||||||
let settings = {
|
let settings = {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@ -300,16 +300,16 @@ const createRequest = (uri, data, options) => {
|
|||||||
settings.httpAgent = agent
|
settings.httpAgent = agent
|
||||||
settings.proxy = false
|
settings.proxy = false
|
||||||
} else {
|
} else {
|
||||||
console.error('代理配置无效,不使用代理')
|
logger.error('代理配置无效,不使用代理')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('代理URL解析失败:', e.message)
|
logger.error('代理URL解析失败:', e.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
settings.proxy = false
|
settings.proxy = false
|
||||||
}
|
}
|
||||||
// console.log(settings.headers);
|
// logger.info(settings.headers);
|
||||||
axios(settings)
|
axios(settings)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
const body = res.data
|
const body = res.data
|
||||||
@ -348,14 +348,14 @@ const createRequest = (uri, data, options) => {
|
|||||||
if (answer.status === 200) {
|
if (answer.status === 200) {
|
||||||
resolve(answer)
|
resolve(answer)
|
||||||
} else {
|
} else {
|
||||||
console.log('[ERR]', answer)
|
logger.error(answer)
|
||||||
reject(answer)
|
reject(answer)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
answer.status = 502
|
answer.status = 502
|
||||||
answer.body = { code: 502, msg: err.message || err }
|
answer.body = { code: 502, msg: err.message || err }
|
||||||
console.log('[ERR]', answer)
|
logger.error(answer)
|
||||||
reject(answer)
|
reject(answer)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user