From f6fc452666ac6f8f91a954c3cad2d0da69f85bf6 Mon Sep 17 00:00:00 2001 From: ElyPrism Date: Fri, 16 Jan 2026 22:58:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README=20=E4=BB=A5?= =?UTF-8?q?=E5=8F=8D=E6=98=A0=20Node.js=20=E7=89=88=E6=9C=AC=E8=A6=81?= =?UTF-8?q?=E6=B1=82=E5=92=8C=20Docker=20=E4=BD=BF=E7=94=A8=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=20(#80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binaryify Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.MD | 48 ++++++++++++++--------- package.json | 4 +- pnpm-lock.yaml | 93 ++++++++++++++++++++++++--------------------- util/client-sign.js | 8 ++-- 4 files changed, 86 insertions(+), 67 deletions(-) diff --git a/README.MD b/README.MD index 91ba28b..3f16bc9 100644 --- a/README.MD +++ b/README.MD @@ -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. 环境变量 | 变量名 | 默认值 | 说明 | diff --git a/package.json b/package.json index 9e514b2..fcb2b88 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1863277..b77f2e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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 @@ -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==} @@ -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'} @@ -2827,7 +2831,7 @@ 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/qs': 6.14.0 @@ -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': {} @@ -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: {} diff --git a/util/client-sign.js b/util/client-sign.js index 43a30ff..c0ccb1f 100644 --- a/util/client-sign.js +++ b/util/client-sign.js @@ -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 \ No newline at end of file