From d78a20ea1126df1983832423d60f75b112d98367 Mon Sep 17 00:00:00 2001 From: ImFurina <222616389+MoeFurina@users.noreply.github.com> Date: Wed, 8 Oct 2025 11:40:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(randomCNIP):=20=E6=B7=BB=E5=8A=A0=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E4=B8=AD=E5=9B=BDIP=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interface.d.ts | 1 + package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++----------- public/docs/home.md | 4 ++++ server.js | 2 +- util/index.js | 5 ++++- util/option.js | 1 + util/request.js | 18 +++++++++--------- 8 files changed, 32 insertions(+), 23 deletions(-) diff --git a/interface.d.ts b/interface.d.ts index 8f6cfbc..4f271cb 100644 --- a/interface.d.ts +++ b/interface.d.ts @@ -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 { diff --git a/package.json b/package.json index 8786b81..10fe5b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@neteaseapireborn/api", - "version": "4.29.8", + "version": "4.29.9", "description": "为停更的网易云音乐 NodeJs API 提供持续的维护!", "scripts": { "start": "node app.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99d6a30..27984bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: diff --git a/public/docs/home.md b/public/docs/home.md index 7a35b03..7450868 100644 --- a/public/docs/home.md +++ b/public/docs/home.md @@ -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 则为有下一页 diff --git a/server.js b/server.js index ad8499f..b51491e 100644 --- a/server.js +++ b/server.js @@ -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() diff --git a/util/index.js b/util/index.js index a66814c..2115eba 100644 --- a/util/index.js +++ b/util/index.js @@ -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) { diff --git a/util/option.js b/util/option.js index 7d7c8e8..a4c2615 100644 --- a/util/option.js +++ b/util/option.js @@ -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, diff --git a/util/request.js b/util/request.js index 79cc543..4cbb497 100644 --- a/util/request.js +++ b/util/request.js @@ -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) }) })