fix(workflows): update branch references and remove unused push triggers

feat: enhance eapi_decrypt.html with styled decode result display

fix: update qrlogin and qrlogin-nocookie to include platform parameter in QR code creation URL

chore: bump music-metadata and other dependencies in package.json and pnpm-lock.yaml

docs: update README with important project usage notes
This commit is contained in:
ElyPrism 2026-01-03 01:36:21 +08:00
parent 2d3f15f0e5
commit f2f78b2774
No known key found for this signature in database
8 changed files with 76 additions and 65 deletions

View File

@ -2,7 +2,7 @@ name: Publish Docker image
on:
push:
branches: [main, master]
branches: [main]
tags: ['v*']
workflow_dispatch:

View File

@ -2,11 +2,6 @@
name: Release
on:
push:
branches:
- main
tags:
- 'v*.*.*'
workflow_dispatch:
jobs:

View File

@ -6,6 +6,15 @@
本项目为网易云音乐第三方 Node.js API基于停更的原版 API 持续维护,支持丰富的音乐相关接口,适合自建服务、二次开发和多平台部署(如果原版诈尸, 我会及时同步 or 归档)。
> [!IMPORTANT]
>
> ## 注意
>
> - 本项目是一个高度去中心化的第三方 API其维护都由社区志愿者使用`Pull Request`完成。
> - 使用本项目时请务必遵守相关法律法规,遵守`MIT`协议, 尊重网易云音乐的服务条款。
> - 原作者项目 [Binaryify/NeteaseCloudMusicApi](https://github.com/binaryify/NeteaseCloudMusicApi) 并非完全停止维护, 你可以在 [NeteaseCloudMusicApi 的 NPMJS 页面](https://www.npmjs.com/package/NeteaseCloudMusicApi) 查看最新版本信息。
> - 感谢尊重和理解!
## 快速开始
### 环境要求

View File

@ -73,7 +73,7 @@
"express": "^5.2.1",
"express-fileupload": "^1.5.2",
"md5": "^2.3.0",
"music-metadata": "^11.10.3",
"music-metadata": "^11.10.4",
"node-forge": "^1.3.3",
"pac-proxy-agent": "^7.2.0",
"qrcode": "^1.5.4",

99
pnpm-lock.yaml generated
View File

@ -30,8 +30,8 @@ importers:
specifier: ^2.3.0
version: 2.3.0
music-metadata:
specifier: ^11.10.3
version: 11.10.3
specifier: ^11.10.4
version: 11.10.4
node-forge:
specifier: ^1.3.3
version: 1.3.3
@ -144,14 +144,11 @@ packages:
resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==}
engines: {node: '>=6.9.0'}
'@borewit/text-codec@0.1.1':
resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==}
'@borewit/text-codec@0.2.1':
resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==}
'@borewit/text-codec@0.2.0':
resolution: {integrity: sha512-X999CKBxGwX8wW+4gFibsbiNdwqmdQEXmUejIWaIqdrHBgS5ARIOOeyiQbHjP9G58xVEPcuvP6VwwH3A0OFTOA==}
'@eslint-community/eslint-utils@4.9.0':
resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@ -527,8 +524,8 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
basic-ftp@5.0.5:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
basic-ftp@5.1.0:
resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==}
engines: {node: '>=10.0.0'}
binary-extensions@2.3.0:
@ -1049,8 +1046,8 @@ packages:
espurify@1.8.1:
resolution: {integrity: sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==}
esquery@1.6.0:
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
esquery@1.7.0:
resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
engines: {node: '>=0.10'}
esrecurse@4.3.0:
@ -1744,8 +1741,8 @@ packages:
multistream@4.1.0:
resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==}
music-metadata@11.10.3:
resolution: {integrity: sha512-j0g/x4cNNZW6I5gdcPAY+GFkJY9WHTpkFDMBJKQLxJQyvSfQbXm57fTE3haGFFuOzCgtsTd4Plwc49Sn9RacDQ==}
music-metadata@11.10.4:
resolution: {integrity: sha512-W8ByTxUk3p2PHycZraD+XVOzho5zONRqP9XVDwK4kTDGwfDrAmsNXMxNgSii8bI/GDC86mtk5kwGh1Lv/imNlA==}
engines: {node: '>=18'}
nano-spawn@2.0.0:
@ -2009,8 +2006,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
prettier-linter-helpers@1.0.0:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
prettier-linter-helpers@1.0.1:
resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'}
prettier@3.6.2:
@ -2050,8 +2047,8 @@ packages:
engines: {node: '>=10.13.0'}
hasBin: true
qs@6.14.0:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
qs@6.14.1:
resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==}
engines: {node: '>=0.6'}
queue-microtask@1.2.3:
@ -2409,8 +2406,8 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
token-types@6.1.1:
resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==}
token-types@6.1.2:
resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
engines: {node: '>=14.16'}
touch@3.1.1:
@ -2424,8 +2421,8 @@ packages:
resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
engines: {node: '>= 0.4'}
ts-api-utils@2.1.0:
resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
ts-api-utils@2.4.0:
resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
@ -2671,11 +2668,9 @@ snapshots:
'@babel/helper-validator-identifier': 7.28.5
to-fast-properties: 2.0.0
'@borewit/text-codec@0.1.1': {}
'@borewit/text-codec@0.2.1': {}
'@borewit/text-codec@0.2.0': {}
'@eslint-community/eslint-utils@4.9.0(eslint@9.39.0)':
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.0)':
dependencies:
eslint: 9.39.0
eslint-visitor-keys: 3.4.3
@ -2787,7 +2782,7 @@ snapshots:
'@tokenizer/inflate@0.4.1':
dependencies:
debug: 4.4.3
token-types: 6.1.1
token-types: 6.1.2
transitivePeerDependencies:
- supports-color
@ -2863,7 +2858,7 @@ snapshots:
graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.9.3)
ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@ -2923,7 +2918,7 @@ snapshots:
'@typescript-eslint/utils': 8.46.2(eslint@9.39.0)(typescript@5.9.3)
debug: 4.4.3
eslint: 9.39.0
ts-api-utils: 2.1.0(typescript@5.9.3)
ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@ -2943,7 +2938,7 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.3
ts-api-utils: 2.1.0(typescript@5.9.3)
ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@ -2959,14 +2954,14 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.3
ts-api-utils: 2.1.0(typescript@5.9.3)
ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.46.2(eslint@9.39.0)(typescript@5.9.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0)
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.0)
'@typescript-eslint/scope-manager': 8.46.2
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
@ -3111,7 +3106,7 @@ snapshots:
base64-js@1.5.1: {}
basic-ftp@5.0.5: {}
basic-ftp@5.1.0: {}
binary-extensions@2.3.0: {}
@ -3131,7 +3126,7 @@ snapshots:
http-errors: 2.0.1
iconv-lite: 0.4.24
on-finished: 2.4.1
qs: 6.14.0
qs: 6.14.1
raw-body: 2.5.3
type-is: 1.6.18
unpipe: 1.0.0
@ -3146,7 +3141,7 @@ snapshots:
http-errors: 2.0.1
iconv-lite: 0.7.1
on-finished: 2.4.1
qs: 6.14.0
qs: 6.14.1
raw-body: 3.0.2
type-is: 2.0.1
transitivePeerDependencies:
@ -3671,7 +3666,7 @@ snapshots:
dependencies:
eslint: 9.39.0
prettier: 3.6.2
prettier-linter-helpers: 1.0.0
prettier-linter-helpers: 1.0.1
synckit: 0.11.11
optionalDependencies:
eslint-config-prettier: 10.1.8(eslint@9.39.0)
@ -3687,7 +3682,7 @@ snapshots:
eslint@9.39.0:
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0)
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.0)
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.2
@ -3707,7 +3702,7 @@ snapshots:
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
espree: 10.4.0
esquery: 1.6.0
esquery: 1.7.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
@ -3786,7 +3781,7 @@ snapshots:
dependencies:
core-js: 2.6.12
esquery@1.6.0:
esquery@1.7.0:
dependencies:
estraverse: 5.3.0
@ -3838,7 +3833,7 @@ snapshots:
parseurl: 1.3.3
path-to-regexp: 0.1.12
proxy-addr: 2.0.7
qs: 6.14.0
qs: 6.14.1
range-parser: 1.2.1
safe-buffer: 5.2.1
send: 0.19.2
@ -3873,7 +3868,7 @@ snapshots:
once: 1.4.0
parseurl: 1.3.3
proxy-addr: 2.0.7
qs: 6.14.0
qs: 6.14.1
range-parser: 1.2.1
router: 2.2.0
send: 1.2.1
@ -3920,7 +3915,7 @@ snapshots:
dependencies:
'@tokenizer/inflate': 0.4.1
strtok3: 10.3.4
token-types: 6.1.1
token-types: 6.1.2
uint8array-extras: 1.5.0
transitivePeerDependencies:
- supports-color
@ -4060,7 +4055,7 @@ snapshots:
get-uri@6.0.5:
dependencies:
basic-ftp: 5.0.5
basic-ftp: 5.1.0
data-uri-to-buffer: 6.0.2
debug: 4.4.3
transitivePeerDependencies:
@ -4556,16 +4551,16 @@ snapshots:
once: 1.4.0
readable-stream: 3.6.2
music-metadata@11.10.3:
music-metadata@11.10.4:
dependencies:
'@borewit/text-codec': 0.2.0
'@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
media-typer: 1.1.0
strtok3: 10.3.4
token-types: 6.1.1
token-types: 6.1.2
uint8array-extras: 1.5.0
transitivePeerDependencies:
- supports-color
@ -4897,7 +4892,7 @@ snapshots:
prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0:
prettier-linter-helpers@1.0.1:
dependencies:
fast-diff: 1.3.0
@ -4931,7 +4926,7 @@ snapshots:
pngjs: 5.0.0
yargs: 15.4.1
qs@6.14.0:
qs@6.14.1:
dependencies:
side-channel: 1.1.0
@ -5386,9 +5381,9 @@ snapshots:
toidentifier@1.0.1: {}
token-types@6.1.1:
token-types@6.1.2:
dependencies:
'@borewit/text-codec': 0.1.1
'@borewit/text-codec': 0.2.1
'@tokenizer/token': 0.3.0
ieee754: 1.2.1
@ -5402,7 +5397,7 @@ snapshots:
typedarray.prototype.slice: 1.0.5
which-typed-array: 1.1.19
ts-api-utils@2.1.0(typescript@5.9.3):
ts-api-utils@2.4.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3

View File

@ -8,6 +8,19 @@
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
</head>
<style>
.decode-result {
white-space: pre-wrap;
word-break: break-all;
background-color: #f0f0f0;
padding: 10px;
border-radius: 5px;
margin-top: 10px;
height: 300px;
overflow: auto;
}
</style>
<body>
<div id="app" class="p-5 flex flex-col">
<h1 class="text-2xl font-bold mb-5">eapi 参数和返回内容解析</h1>
@ -23,7 +36,7 @@
</div>
<div>
<p>解密结果:
<pre>{{ JSON.stringify(JSON.parse(result), null, 2) }}</pre>
<pre class="decode-result">{{ JSON.stringify(JSON.parse(result), null, 2) }}</pre>
</p>
</div>
@ -39,7 +52,6 @@
<script src="https://fastly.jsdelivr.net/npm/vue@3"></script>
<script>
const logger = require('../util/logger.js')
const app = Vue.createApp({
data() {
return {
@ -62,7 +74,7 @@
}
})
this.result = JSON.stringify(res.data.data)
logger.info(res.data);
console.log(res.data);
} catch (error) {
console.error(error)
alert(error?.response?.data?.message || '解密失败,数据格式错误')

View File

@ -24,7 +24,7 @@
})
const key = res.data.data.unikey
const res2 = await axios({
url: `/login/qr/create?key=${key}&qrimg=true&timestamp=${Date.now()}`,
url: `/login/qr/create?key=${key}&platform=web&qrimg=true&timestamp=${Date.now()}`,
})
document.querySelector('#qrImg').src = res2.data.data.qrimg

View File

@ -23,7 +23,7 @@
})
const key = res.data.data.unikey
const res2 = await axios({
url: `/login/qr/create?key=${key}&qrimg=true&timestamp=${Date.now()}&ua=pc`,
url: `/login/qr/create?key=${key}&platform=web&qrimg=true&timestamp=${Date.now()}&ua=pc`,
})
document.querySelector('#qrImg').src = res2.data.data.qrimg