mirror of
https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
synced 2025-10-21 21:43: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
|
||||
realIP?: string // IPv4/IPv6 filled in X-Real-IP
|
||||
proxy?: string // HTTP proxy
|
||||
randomCNIP?: boolean // Whether to use a random Chinese IP address filled in X-Real-IP
|
||||
}
|
||||
|
||||
export interface MultiPageConfig {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@neteaseapireborn/api",
|
||||
"version": "4.29.8",
|
||||
"version": "4.29.9",
|
||||
"description": "为停更的网易云音乐 NodeJs API 提供持续的维护!",
|
||||
"scripts": {
|
||||
"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':
|
||||
resolution: {integrity: sha512-DllImBVI1lCyjl2klky/TEwk60mbNebgXv1669h66g9TfptWSrEFq5a/raHSutaFzjSm1tmn9ypdNfu4jPSixQ==}
|
||||
|
||||
'@types/express-serve-static-core@5.0.7':
|
||||
resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==}
|
||||
'@types/express-serve-static-core@5.1.0':
|
||||
resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==}
|
||||
|
||||
'@types/express@5.0.3':
|
||||
resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
|
||||
@ -2020,8 +2020,8 @@ packages:
|
||||
secure-json-parse@2.7.0:
|
||||
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
|
||||
|
||||
semver@7.7.2:
|
||||
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
|
||||
semver@7.7.3:
|
||||
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
@ -2596,7 +2596,7 @@ snapshots:
|
||||
'@types/busboy': 1.5.4
|
||||
'@types/express': 5.0.3
|
||||
|
||||
'@types/express-serve-static-core@5.0.7':
|
||||
'@types/express-serve-static-core@5.1.0':
|
||||
dependencies:
|
||||
'@types/node': 24.6.1
|
||||
'@types/qs': 6.14.0
|
||||
@ -2606,7 +2606,7 @@ snapshots:
|
||||
'@types/express@5.0.3':
|
||||
dependencies:
|
||||
'@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/http-errors@2.0.5': {}
|
||||
@ -2650,7 +2650,7 @@ snapshots:
|
||||
functional-red-black-tree: 1.0.1
|
||||
ignore: 5.3.2
|
||||
regexpp: 3.2.0
|
||||
semver: 7.7.2
|
||||
semver: 7.7.3
|
||||
tsutils: 3.21.0(typescript@4.5.2)
|
||||
optionalDependencies:
|
||||
typescript: 4.5.2
|
||||
@ -2696,7 +2696,7 @@ snapshots:
|
||||
debug: 4.4.3
|
||||
globby: 11.1.0
|
||||
is-glob: 4.0.3
|
||||
semver: 7.7.2
|
||||
semver: 7.7.3
|
||||
tsutils: 3.21.0(typescript@4.5.2)
|
||||
optionalDependencies:
|
||||
typescript: 4.5.2
|
||||
@ -4245,7 +4245,7 @@ snapshots:
|
||||
|
||||
node-abi@3.78.0:
|
||||
dependencies:
|
||||
semver: 7.7.2
|
||||
semver: 7.7.3
|
||||
|
||||
node-fetch@2.7.0:
|
||||
dependencies:
|
||||
@ -4433,7 +4433,7 @@ snapshots:
|
||||
https-proxy-agent: 5.0.1
|
||||
node-fetch: 2.7.0
|
||||
progress: 2.0.3
|
||||
semver: 7.7.2
|
||||
semver: 7.7.3
|
||||
tar-fs: 2.1.4
|
||||
yargs: 16.2.0
|
||||
transitivePeerDependencies:
|
||||
@ -4737,7 +4737,7 @@ snapshots:
|
||||
|
||||
secure-json-parse@2.7.0: {}
|
||||
|
||||
semver@7.7.2: {}
|
||||
semver@7.7.3: {}
|
||||
|
||||
send@1.2.0:
|
||||
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.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`
|
||||
即可解决
|
||||
|
||||
!> 接上, 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`
|
||||
|
||||
!> 分页接口返回字段里有`more`,more 为 true 则为有下一页
|
||||
|
@ -99,7 +99,7 @@ async function getModulesDefinitions(
|
||||
*/
|
||||
async function checkVersion() {
|
||||
return new Promise((resolve) => {
|
||||
exec('npm info NeteaseCloudMusicApi version', (err, stdout) => {
|
||||
exec('npm info NeteaseCloudMusicApiEnhanced version', (err, stdout) => {
|
||||
if (!err) {
|
||||
let version = stdout.trim()
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
const logger = require('./logger')
|
||||
// 预先定义常量和函数引用
|
||||
const chinaIPPrefixes = [
|
||||
'116.25',
|
||||
@ -80,7 +81,9 @@ module.exports = {
|
||||
generateRandomChineseIP() {
|
||||
// 优化:使用预绑定的函数和常量
|
||||
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的函数
|
||||
generateChainId(cookie) {
|
||||
|
@ -5,6 +5,7 @@ const createOption = (query, crypto = '') => {
|
||||
ua: query.ua || '',
|
||||
proxy: query.proxy,
|
||||
realIP: query.realIP,
|
||||
randomCNIP: query.randomCNIP || false,
|
||||
e_r: query.e_r || undefined,
|
||||
domain: query.domain || '',
|
||||
checkToken: query.checkToken || false,
|
||||
|
@ -3,6 +3,7 @@ const encrypt = require('./crypto')
|
||||
const CryptoJS = require('crypto-js')
|
||||
const { default: axios } = require('axios')
|
||||
const { PacProxyAgent } = require('pac-proxy-agent')
|
||||
const logger = require('./logger')
|
||||
const http = require('http')
|
||||
const https = require('https')
|
||||
const tunnel = require('tunnel')
|
||||
@ -160,8 +161,7 @@ const createRequest = (uri, data, options) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 变量声明和初始化
|
||||
const headers = options.headers ? { ...options.headers } : {}
|
||||
const ip = options.realIP || options.ip || ''
|
||||
|
||||
const ip = options.realIP || options.ip || (options.randomCNIP ? generateRandomChineseIP() : '')
|
||||
// IP头设置
|
||||
if (ip) {
|
||||
headers['X-Real-IP'] = ip
|
||||
@ -255,10 +255,10 @@ const createRequest = (uri, data, options) => {
|
||||
break
|
||||
|
||||
default:
|
||||
console.log('[ERR]', 'Unknown Crypto:', crypto)
|
||||
logger.error('Unknown Crypto:', crypto)
|
||||
break
|
||||
}
|
||||
// console.log(url);
|
||||
// logger.info(url);
|
||||
// settings创建
|
||||
let settings = {
|
||||
method: 'POST',
|
||||
@ -300,16 +300,16 @@ const createRequest = (uri, data, options) => {
|
||||
settings.httpAgent = agent
|
||||
settings.proxy = false
|
||||
} else {
|
||||
console.error('代理配置无效,不使用代理')
|
||||
logger.error('代理配置无效,不使用代理')
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('代理URL解析失败:', e.message)
|
||||
logger.error('代理URL解析失败:', e.message)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
settings.proxy = false
|
||||
}
|
||||
// console.log(settings.headers);
|
||||
// logger.info(settings.headers);
|
||||
axios(settings)
|
||||
.then((res) => {
|
||||
const body = res.data
|
||||
@ -348,14 +348,14 @@ const createRequest = (uri, data, options) => {
|
||||
if (answer.status === 200) {
|
||||
resolve(answer)
|
||||
} else {
|
||||
console.log('[ERR]', answer)
|
||||
logger.error(answer)
|
||||
reject(answer)
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
answer.status = 502
|
||||
answer.body = { code: 502, msg: err.message || err }
|
||||
console.log('[ERR]', answer)
|
||||
logger.error(answer)
|
||||
reject(answer)
|
||||
})
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user