Compare commits

...

2 Commits

Author SHA1 Message Date
dependabot[bot]
120981ced3
chore(packages): bump @types/node from 25.0.3 to 25.0.6
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.0.3 to 25.0.6.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.0.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-16 14:59:51 +00:00
f6fc452666
更新 README 以反映 Node.js 版本要求和 Docker 使用说明 (#80)
Co-authored-by: binaryify <binaryify@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-16 22:58:19 +08:00
4 changed files with 98 additions and 79 deletions

View File

@ -19,7 +19,7 @@
### 环境要求
- Node.js 14 及以上
- Node.js 18 及以上
- 推荐使用 pnpm 进行依赖管理
### 安装
@ -60,32 +60,44 @@ set PORT=4000 && node app.js # Windows
本项目支持通过 Docker 一键部署,无需手动安装 Node.js 或依赖。
### 1. 拉取镜像
> 注意: 在 docker 中运行的时候, 由于使用了 request 来发请求, 所以会检查几个 proxy 相关的环境变量(如下所列), 这些环境变量 会影响到 request 的代理, 详情请参考[request 的文档](https://github.com/request/request#proxies), 如果这些环境变量 指向的代理不可用, 那么就会造成错误, 所以在使用 docker 的时候一定要注意这些环境变量. 不过, 要是你在 query 中加上了 proxy 参数, 那么环境变量会被覆盖, 就会用你通过 proxy 参数提供的代理了.
从 Docker Hub 拉取最新版本镜像:
request 相关的环境变量
```bash
1. http_proxy
2. https_proxy
3. HTTP_PROXY
4. HTTPS_PROXY
5. no_proxy
6. NO_PROXY
```shell
docker pull moefurina/ncm-api:latest
docker run -d -p 3000:3000 --name ncm-api moefurina/ncm-api:latest
// 或者
docker run -d -p 3000:3000 moefurina/ncm-api:latest
// 去掉或者设置相关的环境变量
docker run -d -p 3000:3000 --name ncm-api -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= moefurina/ncm-api:latest
// 或者
docker run -d -p 3000:3000 -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= moefurina/ncm-api:latest
```
或指定版本(与 package.json 中版本号一致):
> 以下是自行 build docker 镜像方式
```bash
docker pull moefurina/ncm-api:4.29.0
```shell
$ git clone https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced && cd api-enhanced
$ sudo docker build . -t ncm-api
$ sudo docker run -d -p 3000:3000 ncm-api
```
### 2. 运行容器
```bash
docker run -d \
--name ncm-api \
-p 3000:3000 \
moefurina/ncm-api:latest
```
运行后访问 http://localhost:3000 即可使用 API。
## 3. 环境变量
| 变量名 | 默认值 | 说明 |

View File

@ -1,7 +1,7 @@
{
"name": "@neteasecloudmusicapienhanced/api",
"version": "4.29.20",
"description": "A revival project for NeteaseCloudMusicApi Node.js Services (Half Refactor & Enhanced)|| 网易云音乐 API 备份 + 增强 || 本项目自原版v4.28.0版本后开始自行维护",
"description": "全网最全的网易云音乐API接口 || A revival project for NeteaseCloudMusicApi Node.js Services (Half Refactor & Enhanced) || 网易云音乐 API 备份 + 增强 || 本项目自原版v4.28.0版本后开始自行维护",
"scripts": {
"dev": "nodemon app.js",
"start": "node app.js",
@ -73,7 +73,7 @@
"express": "^5.2.1",
"express-fileupload": "^1.5.2",
"md5": "^2.3.0",
"music-metadata": "^11.10.4",
"music-metadata": "^11.10.6",
"node-forge": "^1.3.3",
"pac-proxy-agent": "^7.2.0",
"qrcode": "^1.5.4",
@ -88,7 +88,7 @@
"@types/express": "^5.0.6",
"@types/express-fileupload": "^1.5.1",
"@types/mocha": "^10.0.10",
"@types/node": "25.0.3",
"@types/node": "25.0.9",
"@typescript-eslint/eslint-plugin": "8.46.3",
"@typescript-eslint/parser": "8.51.0",
"eslint": "9.39.0",

115
pnpm-lock.yaml generated
View File

@ -30,8 +30,8 @@ importers:
specifier: ^2.3.0
version: 2.3.0
music-metadata:
specifier: ^11.10.4
version: 11.10.4
specifier: ^11.10.6
version: 11.10.6
node-forge:
specifier: ^1.3.3
version: 1.3.3
@ -70,8 +70,8 @@ importers:
specifier: ^10.0.10
version: 10.0.10
'@types/node':
specifier: 25.0.3
version: 25.0.3
specifier: 25.0.9
version: 25.0.9
'@typescript-eslint/eslint-plugin':
specifier: 8.46.3
version: 8.46.3(@typescript-eslint/parser@8.51.0(eslint@9.39.0)(typescript@5.9.3))(eslint@9.39.0)(typescript@5.9.3)
@ -271,8 +271,8 @@ packages:
'@types/express-fileupload@1.5.1':
resolution: {integrity: sha512-DllImBVI1lCyjl2klky/TEwk60mbNebgXv1669h66g9TfptWSrEFq5a/raHSutaFzjSm1tmn9ypdNfu4jPSixQ==}
'@types/express-serve-static-core@5.1.0':
resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==}
'@types/express-serve-static-core@5.1.1':
resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==}
'@types/express@5.0.6':
resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==}
@ -286,8 +286,8 @@ packages:
'@types/mocha@10.0.10':
resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==}
'@types/node@25.0.3':
resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
'@types/node@25.0.9':
resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==}
'@types/qs@6.14.0':
resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
@ -539,8 +539,8 @@ packages:
resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
body-parser@2.2.1:
resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==}
body-parser@2.2.2:
resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
engines: {node: '>=18'}
brace-expansion@1.1.12:
@ -1134,8 +1134,8 @@ packages:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
file-type@21.2.0:
resolution: {integrity: sha512-vCYBgFOrJQLoTzDyAXAL/RFfKnXXpUYt4+tipVy26nJJhT7ftgGETf2tAQF59EEL61i3MrorV/PG6tf7LJK7eg==}
file-type@21.3.0:
resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==}
engines: {node: '>=20'}
fill-range@7.1.1:
@ -1369,8 +1369,8 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
iconv-lite@0.7.1:
resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==}
iconv-lite@0.7.2:
resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
engines: {node: '>=0.10.0'}
ieee754@1.2.1:
@ -1750,8 +1750,8 @@ packages:
multistream@4.1.0:
resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==}
music-metadata@11.10.4:
resolution: {integrity: sha512-W8ByTxUk3p2PHycZraD+XVOzho5zONRqP9XVDwK4kTDGwfDrAmsNXMxNgSii8bI/GDC86mtk5kwGh1Lv/imNlA==}
music-metadata@11.10.6:
resolution: {integrity: sha512-Wb1EigQ3/Z7zrQl0XP16ipxB+rN0J0CHUTbTRtVu9GViALYafb6xT5UGzIfszCG1lscmkutjHO2RYbJ9TFyslA==}
engines: {node: '>=18'}
nano-spawn@2.0.0:
@ -1779,8 +1779,8 @@ packages:
next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
node-abi@3.85.0:
resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==}
node-abi@3.86.0:
resolution: {integrity: sha512-sn9Et4N3ynsetj3spsZR729DVlGH6iBG4RiDMV7HEp3guyOW6W3S0unGpLDxT50mXortGUMax/ykUNQXdqc/Xg==}
engines: {node: '>=10'}
node-fetch@2.7.0:
@ -2170,8 +2170,9 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sax@1.4.3:
resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==}
sax@1.4.4:
resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
engines: {node: '>=11.0.0'}
secure-json-parse@2.7.0:
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
@ -2396,8 +2397,8 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
synckit@0.11.11:
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
synckit@0.11.12:
resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==}
engines: {node: ^14.18.0 || >=16.0.0}
tar-fs@2.1.4:
@ -2561,8 +2562,8 @@ packages:
which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
which-typed-array@1.1.19:
resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
which-typed-array@1.1.20:
resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==}
engines: {node: '>= 0.4'}
which@2.0.2:
@ -2570,6 +2571,9 @@ packages:
engines: {node: '>= 8'}
hasBin: true
win-guid@0.1.3:
resolution: {integrity: sha512-Ah25z4XnblBGFgrcVS5QK7qLkvsFFA35+G+AnHkELUPHXPYWFOSVNMuAxf1zW0B+4X911IBLD+TvB771om0gmg==}
word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
@ -2810,15 +2814,15 @@ snapshots:
'@types/body-parser@1.19.6':
dependencies:
'@types/connect': 3.4.38
'@types/node': 25.0.3
'@types/node': 25.0.9
'@types/busboy@1.5.4':
dependencies:
'@types/node': 25.0.3
'@types/node': 25.0.9
'@types/connect@3.4.38':
dependencies:
'@types/node': 25.0.3
'@types/node': 25.0.9
'@types/estree@1.0.8': {}
@ -2827,9 +2831,9 @@ snapshots:
'@types/busboy': 1.5.4
'@types/express': 5.0.6
'@types/express-serve-static-core@5.1.0':
'@types/express-serve-static-core@5.1.1':
dependencies:
'@types/node': 25.0.3
'@types/node': 25.0.9
'@types/qs': 6.14.0
'@types/range-parser': 1.2.7
'@types/send': 1.2.1
@ -2837,7 +2841,7 @@ snapshots:
'@types/express@5.0.6':
dependencies:
'@types/body-parser': 1.19.6
'@types/express-serve-static-core': 5.1.0
'@types/express-serve-static-core': 5.1.1
'@types/serve-static': 2.2.0
'@types/http-errors@2.0.5': {}
@ -2846,7 +2850,7 @@ snapshots:
'@types/mocha@10.0.10': {}
'@types/node@25.0.3':
'@types/node@25.0.9':
dependencies:
undici-types: 7.16.0
@ -2856,12 +2860,12 @@ snapshots:
'@types/send@1.2.1':
dependencies:
'@types/node': 25.0.3
'@types/node': 25.0.9
'@types/serve-static@2.2.0':
dependencies:
'@types/http-errors': 2.0.5
'@types/node': 25.0.3
'@types/node': 25.0.9
'@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.51.0(eslint@9.39.0)(typescript@5.9.3))(eslint@9.39.0)(typescript@5.9.3)':
dependencies:
@ -2894,8 +2898,8 @@ snapshots:
'@typescript-eslint/project-service@8.46.3(typescript@5.9.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3)
'@typescript-eslint/types': 8.51.0
'@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3)
'@typescript-eslint/types': 8.46.3
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
@ -3149,13 +3153,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
body-parser@2.2.1:
body-parser@2.2.2:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
debug: 4.4.3
http-errors: 2.0.1
iconv-lite: 0.7.1
iconv-lite: 0.7.2
on-finished: 2.4.1
qs: 6.14.1
raw-body: 3.0.2
@ -3567,7 +3571,7 @@ snapshots:
typed-array-byte-offset: 1.0.4
typed-array-length: 1.0.7
unbox-primitive: 1.1.0
which-typed-array: 1.1.19
which-typed-array: 1.1.20
es-define-property@1.0.1: {}
@ -3683,7 +3687,7 @@ snapshots:
eslint: 9.39.0
prettier: 3.7.4
prettier-linter-helpers: 1.0.1
synckit: 0.11.11
synckit: 0.11.12
optionalDependencies:
eslint-config-prettier: 10.1.8(eslint@9.39.0)
@ -3865,7 +3869,7 @@ snapshots:
express@5.2.1:
dependencies:
accepts: 2.0.0
body-parser: 2.2.1
body-parser: 2.2.2
content-disposition: 1.0.1
content-type: 1.0.5
cookie: 0.7.2
@ -3931,7 +3935,7 @@ snapshots:
dependencies:
flat-cache: 4.0.1
file-type@21.2.0:
file-type@21.3.0:
dependencies:
'@tokenizer/inflate': 0.4.1
strtok3: 10.3.4
@ -4196,7 +4200,7 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
iconv-lite@0.7.1:
iconv-lite@0.7.2:
dependencies:
safer-buffer: 2.1.2
@ -4362,7 +4366,7 @@ snapshots:
is-typed-array@1.1.15:
dependencies:
which-typed-array: 1.1.19
which-typed-array: 1.1.20
is-unicode-supported@0.1.0: {}
@ -4571,17 +4575,18 @@ snapshots:
once: 1.4.0
readable-stream: 3.6.2
music-metadata@11.10.4:
music-metadata@11.10.6:
dependencies:
'@borewit/text-codec': 0.2.1
'@tokenizer/token': 0.3.0
content-type: 1.0.5
debug: 4.4.3
file-type: 21.2.0
file-type: 21.3.0
media-typer: 1.1.0
strtok3: 10.3.4
token-types: 6.1.2
uint8array-extras: 1.5.0
win-guid: 0.1.3
transitivePeerDependencies:
- supports-color
@ -4599,7 +4604,7 @@ snapshots:
next-tick@1.1.0: {}
node-abi@3.85.0:
node-abi@3.86.0:
dependencies:
semver: 7.7.3
@ -4903,7 +4908,7 @@ snapshots:
minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 1.0.2
node-abi: 3.85.0
node-abi: 3.86.0
pump: 3.0.3
rc: 1.2.8
simple-get: 4.0.1
@ -4973,7 +4978,7 @@ snapshots:
dependencies:
bytes: 3.1.2
http-errors: 2.0.1
iconv-lite: 0.7.1
iconv-lite: 0.7.2
unpipe: 1.0.0
rc@1.2.8:
@ -5087,7 +5092,7 @@ snapshots:
safer-buffer@2.1.2: {}
sax@1.4.3: {}
sax@1.4.4: {}
secure-json-parse@2.7.0: {}
@ -5376,7 +5381,7 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
synckit@0.11.11:
synckit@0.11.12:
dependencies:
'@pkgr/core': 0.2.9
@ -5422,7 +5427,7 @@ snapshots:
dependencies:
gopd: 1.2.0
typedarray.prototype.slice: 1.0.5
which-typed-array: 1.1.19
which-typed-array: 1.1.20
ts-api-utils@2.4.0(typescript@5.9.3):
dependencies:
@ -5567,7 +5572,7 @@ snapshots:
isarray: 2.0.5
which-boxed-primitive: 1.1.1
which-collection: 1.0.2
which-typed-array: 1.1.19
which-typed-array: 1.1.20
which-collection@1.0.2:
dependencies:
@ -5578,7 +5583,7 @@ snapshots:
which-module@2.0.1: {}
which-typed-array@1.1.19:
which-typed-array@1.1.20:
dependencies:
available-typed-arrays: 1.0.7
call-bind: 1.0.8
@ -5592,6 +5597,8 @@ snapshots:
dependencies:
isexe: 2.0.0
win-guid@0.1.3: {}
word-wrap@1.2.5: {}
workerpool@9.3.4: {}
@ -5624,7 +5631,7 @@ snapshots:
xml2js@0.6.2:
dependencies:
sax: 1.4.3
sax: 1.4.4
xmlbuilder: 11.0.1
xml@1.0.1: {}

View File

@ -9,9 +9,9 @@ class AdvancedClientSignGenerator {
try {
const interfaces = os.networkInterfaces()
for (let interfaceName in interfaces) {
const networkInterface = interfaces[interfaceName]
for (let i = 0; i < networkInterface.length; i++) {
const alias = networkInterface[i]
const interfaceItem = interfaces[interfaceName]
for (let i = 0; i < interfaceItem.length; i++) {
const alias = interfaceItem[i]
// 排除内部地址和无效地址
if (
alias.mac &&
@ -166,4 +166,4 @@ class AdvancedClientSignGenerator {
}
}
module.exports = AdvancedClientSignGenerator
module.exports = AdvancedClientSignGenerator