ci: update Node.js requirement and improve code consistency

Updated the README to require Node.js 18+ and added Docker usage instructions. Refactored util/client-sign.js for consistent code style and improved variable naming. Fixed the login_cellphone module to use 'weapi' in createOption. Removed deprecated code from server.js and improved CORS header formatting. Minor fix in util/request.js for user agent selection.

Co-Authored-By: binaryify <binaryify@gmail.com>
This commit is contained in:
ElyPrism 2026-01-16 22:35:16 +08:00
parent 5fc9346e0e
commit 805d0bccc5
No known key found for this signature in database
6 changed files with 213 additions and 180 deletions

View File

@ -22,7 +22,7 @@
## 环境要求 ## 环境要求
需要 NodeJS 14+ 环境 需要 NodeJS 18+ 环境
## 安装 ## 安装
@ -70,6 +70,45 @@ npx NeteaseCloudMusicApi@latest
使用此命令,可直接启动服务,无需下载或者 clone 项目 使用此命令,可直接启动服务,无需下载或者 clone 项目
## Docker 容器运行
> 注意: 在 docker 中运行的时候, 由于使用了 request 来发请求, 所以会检查几个 proxy 相关的环境变量(如下所列), 这些环境变量 会影响到 request 的代理, 详情请参考[request 的文档](https://github.com/request/request#proxies), 如果这些环境变量 指向的代理不可用, 那么就会造成错误, 所以在使用 docker 的时候一定要注意这些环境变量. 不过, 要是你在 query 中加上了 proxy 参数, 那么环境变量会被覆盖, 就会用你通过 proxy 参数提供的代理了.
request 相关的环境变量
1. http_proxy
2. https_proxy
3. HTTP_PROXY
4. HTTPS_PROXY
5. no_proxy
6. NO_PROXY
```shell
docker pull binaryify/netease_cloud_music_api
docker run -d -p 3000:3000 --name netease_cloud_music_api binaryify/netease_cloud_music_api
// 或者
docker run -d -p 3000:3000 binaryify/netease_cloud_music_api
// 去掉或者设置相关的环境变量
docker run -d -p 3000:3000 --name netease_cloud_music_api -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= binaryify/netease_cloud_music_api
// 或者
docker run -d -p 3000:3000 -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= binaryify/netease_cloud_music_api
```
> 以下是自行 build docker 镜像方式
```
$ git clone https://gitlab.com/Binaryify/neteasecloudmusicapi.git && cd NeteaseCloudMusicApi
$ sudo docker build . -t netease-music-api
$ sudo docker run -d -p 3000:3000 netease-music-api
## Vercel 部署 ## Vercel 部署
v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器 v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器

View File

@ -18,7 +18,7 @@ module.exports = async (query, request) => {
let result = await request( let result = await request(
`/api/w/login/cellphone`, `/api/w/login/cellphone`,
data, data,
createOption(query), createOption(query, 'weapi'),
) )
if (result.body.code === 200) { if (result.body.code === 200) {

View File

@ -1,6 +1,6 @@
{ {
"name": "NeteaseCloudMusicApi", "name": "NeteaseCloudMusicApi",
"version": "4.28.0", "version": "4.28.1",
"description": "网易云音乐 NodeJS 版 API", "description": "网易云音乐 NodeJS 版 API",
"scripts": { "scripts": {
"start": "node app.js", "start": "node app.js",
@ -69,11 +69,11 @@
"axios": "^1.13.2", "axios": "^1.13.2",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"express": "^4.21.2", "express": "^4.22.1",
"express-fileupload": "^1.5.2", "express-fileupload": "^1.5.2",
"md5": "^2.3.0", "md5": "^2.3.0",
"music-metadata": "^7.14.0", "music-metadata": "^7.14.0",
"node-forge": "^1.3.1", "node-forge": "^1.3.3",
"pac-proxy-agent": "^7.2.0", "pac-proxy-agent": "^7.2.0",
"qrcode": "^1.5.4", "qrcode": "^1.5.4",
"safe-decode-uri-component": "^1.2.1", "safe-decode-uri-component": "^1.2.1",

217
pnpm-lock.yaml generated
View File

@ -21,8 +21,8 @@ importers:
specifier: ^17.2.3 specifier: ^17.2.3
version: 17.2.3 version: 17.2.3
express: express:
specifier: ^4.21.2 specifier: ^4.22.1
version: 4.21.2 version: 4.22.1
express-fileupload: express-fileupload:
specifier: ^1.5.2 specifier: ^1.5.2
version: 1.5.2 version: 1.5.2
@ -33,8 +33,8 @@ importers:
specifier: ^7.14.0 specifier: ^7.14.0
version: 7.14.0 version: 7.14.0
node-forge: node-forge:
specifier: ^1.3.1 specifier: ^1.3.3
version: 1.3.1 version: 1.3.3
pac-proxy-agent: pac-proxy-agent:
specifier: ^7.2.0 specifier: ^7.2.0
version: 7.2.0 version: 7.2.0
@ -188,8 +188,8 @@ packages:
'@types/express-fileupload@1.5.1': '@types/express-fileupload@1.5.1':
resolution: {integrity: sha512-DllImBVI1lCyjl2klky/TEwk60mbNebgXv1669h66g9TfptWSrEFq5a/raHSutaFzjSm1tmn9ypdNfu4jPSixQ==} resolution: {integrity: sha512-DllImBVI1lCyjl2klky/TEwk60mbNebgXv1669h66g9TfptWSrEFq5a/raHSutaFzjSm1tmn9ypdNfu4jPSixQ==}
'@types/express-serve-static-core@4.19.7': '@types/express-serve-static-core@4.19.8':
resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==}
'@types/express@4.17.25': '@types/express@4.17.25':
resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==}
@ -421,8 +421,8 @@ packages:
base64-js@1.5.1: base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
basic-ftp@5.0.5: basic-ftp@5.1.0:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
binary-extensions@2.3.0: binary-extensions@2.3.0:
@ -432,8 +432,8 @@ packages:
bl@4.1.0: bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
body-parser@1.20.3: body-parser@1.20.4:
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
brace-expansion@1.1.12: brace-expansion@1.1.12:
@ -580,11 +580,11 @@ packages:
convert-source-map@1.9.0: convert-source-map@1.9.0:
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
cookie-signature@1.0.6: cookie-signature@1.0.7:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==}
cookie@0.7.1: cookie@0.7.2:
resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
core-js@2.6.12: core-js@2.6.12:
@ -767,10 +767,6 @@ packages:
empower@1.3.1: empower@1.3.1:
resolution: {integrity: sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==} resolution: {integrity: sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==}
encodeurl@1.0.2:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
encodeurl@2.0.0: encodeurl@2.0.0:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@ -782,8 +778,8 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
es-abstract@1.24.0: es-abstract@1.24.1:
resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
es-define-property@1.0.1: es-define-property@1.0.1:
@ -942,8 +938,8 @@ packages:
espurify@1.8.1: espurify@1.8.1:
resolution: {integrity: sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==} resolution: {integrity: sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==}
esquery@1.6.0: esquery@1.7.0:
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
esrecurse@4.3.0: esrecurse@4.3.0:
@ -989,8 +985,8 @@ packages:
resolution: {integrity: sha512-wxUJn2vTHvj/kZCVmc5/bJO15C7aSMyHeuXYY3geKpeKibaAoQGcEv5+sM6nHS2T7VF+QHS4hTWPiY2mKofEdg==} resolution: {integrity: sha512-wxUJn2vTHvj/kZCVmc5/bJO15C7aSMyHeuXYY3geKpeKibaAoQGcEv5+sM6nHS2T7VF+QHS4hTWPiY2mKofEdg==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
express@4.21.2: express@4.22.1:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==}
engines: {node: '>= 0.10.0'} engines: {node: '>= 0.10.0'}
ext@1.7.0: ext@1.7.0:
@ -1019,8 +1015,8 @@ packages:
fast-safe-stringify@2.1.1: fast-safe-stringify@2.1.1:
resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
fastq@1.19.1: fastq@1.20.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
file-entry-cache@6.0.1: file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
@ -1034,8 +1030,8 @@ packages:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'} engines: {node: '>=8'}
finalhandler@1.3.1: finalhandler@1.3.2:
resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
find-up@4.1.0: find-up@4.1.0:
@ -1073,8 +1069,8 @@ packages:
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
form-data@4.0.4: form-data@4.0.5:
resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
forwarded@0.2.0: forwarded@0.2.0:
@ -1224,8 +1220,8 @@ packages:
htmlparser2@8.0.2: htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
http-errors@2.0.0: http-errors@2.0.1:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
@ -1651,8 +1647,8 @@ packages:
next-tick@1.1.0: next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
node-abi@3.85.0: node-abi@3.86.0:
resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} resolution: {integrity: sha512-sn9Et4N3ynsetj3spsZR729DVlGH6iBG4RiDMV7HEp3guyOW6W3S0unGpLDxT50mXortGUMax/ykUNQXdqc/Xg==}
engines: {node: '>=10'} engines: {node: '>=10'}
node-fetch@2.7.0: node-fetch@2.7.0:
@ -1664,8 +1660,8 @@ packages:
encoding: encoding:
optional: true optional: true
node-forge@1.3.1: node-forge@1.3.3:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==}
engines: {node: '>= 6.13.0'} engines: {node: '>= 6.13.0'}
node-windows@1.0.0-beta.8: node-windows@1.0.0-beta.8:
@ -1876,8 +1872,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
prettier-linter-helpers@1.0.0: prettier-linter-helpers@1.0.1:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
prettier@2.7.1: prettier@2.7.1:
@ -1918,8 +1914,8 @@ packages:
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
hasBin: true hasBin: true
qs@6.13.0: qs@6.14.1:
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==}
engines: {node: '>=0.6'} engines: {node: '>=0.6'}
queue-microtask@1.2.3: queue-microtask@1.2.3:
@ -1935,8 +1931,8 @@ packages:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
raw-body@2.5.2: raw-body@2.5.3:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
rc@1.2.8: rc@1.2.8:
@ -2036,8 +2032,9 @@ packages:
safer-buffer@2.1.2: safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sax@1.4.3: sax@1.4.4:
resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
engines: {node: '>=11.0.0'}
secure-json-parse@2.7.0: secure-json-parse@2.7.0:
resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
@ -2047,15 +2044,15 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
send@0.19.0: send@0.19.2:
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
serialize-javascript@6.0.0: serialize-javascript@6.0.0:
resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
serve-static@1.16.2: serve-static@1.16.3:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
set-blocking@2.0.0: set-blocking@2.0.0:
@ -2162,8 +2159,8 @@ packages:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'} engines: {node: '>= 10.x'}
statuses@2.0.1: statuses@2.0.2:
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
stop-iteration-iterator@1.1.0: stop-iteration-iterator@1.1.0:
@ -2416,8 +2413,8 @@ packages:
which-module@2.0.1: which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
which-typed-array@1.1.19: which-typed-array@1.1.20:
resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
which@2.0.2: which@2.0.2:
@ -2571,7 +2568,7 @@ snapshots:
'@nodelib/fs.walk@1.2.8': '@nodelib/fs.walk@1.2.8':
dependencies: dependencies:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1 fastq: 1.20.1
'@tokenizer/token@0.3.0': {} '@tokenizer/token@0.3.0': {}
@ -2595,7 +2592,7 @@ snapshots:
'@types/busboy': 1.5.4 '@types/busboy': 1.5.4
'@types/express': 4.17.25 '@types/express': 4.17.25
'@types/express-serve-static-core@4.19.7': '@types/express-serve-static-core@4.19.8':
dependencies: dependencies:
'@types/node': 16.11.19 '@types/node': 16.11.19
'@types/qs': 6.14.0 '@types/qs': 6.14.0
@ -2605,7 +2602,7 @@ snapshots:
'@types/express@4.17.25': '@types/express@4.17.25':
dependencies: dependencies:
'@types/body-parser': 1.19.6 '@types/body-parser': 1.19.6
'@types/express-serve-static-core': 4.19.7 '@types/express-serve-static-core': 4.19.8
'@types/qs': 6.14.0 '@types/qs': 6.14.0
'@types/serve-static': 1.15.10 '@types/serve-static': 1.15.10
@ -2807,7 +2804,7 @@ snapshots:
array-buffer-byte-length: 1.0.2 array-buffer-byte-length: 1.0.2
call-bind: 1.0.8 call-bind: 1.0.8
define-properties: 1.2.1 define-properties: 1.2.1
es-abstract: 1.24.0 es-abstract: 1.24.1
es-errors: 1.3.0 es-errors: 1.3.0
get-intrinsic: 1.3.0 get-intrinsic: 1.3.0
is-array-buffer: 3.0.5 is-array-buffer: 3.0.5
@ -2833,7 +2830,7 @@ snapshots:
axios@1.13.2: axios@1.13.2:
dependencies: dependencies:
follow-redirects: 1.15.11 follow-redirects: 1.15.11
form-data: 4.0.4 form-data: 4.0.5
proxy-from-env: 1.1.0 proxy-from-env: 1.1.0
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
@ -2842,7 +2839,7 @@ snapshots:
base64-js@1.5.1: {} base64-js@1.5.1: {}
basic-ftp@5.0.5: {} basic-ftp@5.1.0: {}
binary-extensions@2.3.0: {} binary-extensions@2.3.0: {}
@ -2852,18 +2849,18 @@ snapshots:
inherits: 2.0.4 inherits: 2.0.4
readable-stream: 3.6.2 readable-stream: 3.6.2
body-parser@1.20.3: body-parser@1.20.4:
dependencies: dependencies:
bytes: 3.1.2 bytes: 3.1.2
content-type: 1.0.5 content-type: 1.0.5
debug: 2.6.9 debug: 2.6.9
depd: 2.0.0 depd: 2.0.0
destroy: 1.2.0 destroy: 1.2.0
http-errors: 2.0.0 http-errors: 2.0.1
iconv-lite: 0.4.24 iconv-lite: 0.4.24
on-finished: 2.4.1 on-finished: 2.4.1
qs: 6.13.0 qs: 6.14.1
raw-body: 2.5.2 raw-body: 2.5.3
type-is: 1.6.18 type-is: 1.6.18
unpipe: 1.0.0 unpipe: 1.0.0
transitivePeerDependencies: transitivePeerDependencies:
@ -3025,9 +3022,9 @@ snapshots:
convert-source-map@1.9.0: {} convert-source-map@1.9.0: {}
cookie-signature@1.0.6: {} cookie-signature@1.0.7: {}
cookie@0.7.1: {} cookie@0.7.2: {}
core-js@2.6.12: {} core-js@2.6.12: {}
@ -3202,8 +3199,6 @@ snapshots:
core-js: 2.6.12 core-js: 2.6.12
empower-core: 1.2.0 empower-core: 1.2.0
encodeurl@1.0.2: {}
encodeurl@2.0.0: {} encodeurl@2.0.0: {}
end-of-stream@1.4.5: end-of-stream@1.4.5:
@ -3212,7 +3207,7 @@ snapshots:
entities@4.5.0: {} entities@4.5.0: {}
es-abstract@1.24.0: es-abstract@1.24.1:
dependencies: dependencies:
array-buffer-byte-length: 1.0.2 array-buffer-byte-length: 1.0.2
arraybuffer.prototype.slice: 1.0.4 arraybuffer.prototype.slice: 1.0.4
@ -3267,7 +3262,7 @@ snapshots:
typed-array-byte-offset: 1.0.4 typed-array-byte-offset: 1.0.4
typed-array-length: 1.0.7 typed-array-length: 1.0.7
unbox-primitive: 1.1.0 unbox-primitive: 1.1.0
which-typed-array: 1.1.19 which-typed-array: 1.1.20
es-define-property@1.0.1: {} es-define-property@1.0.1: {}
@ -3382,7 +3377,7 @@ snapshots:
dependencies: dependencies:
eslint: 8.7.0 eslint: 8.7.0
prettier: 2.7.1 prettier: 2.7.1
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.1
optionalDependencies: optionalDependencies:
eslint-config-prettier: 8.5.0(eslint@8.7.0) eslint-config-prettier: 8.5.0(eslint@8.7.0)
@ -3419,7 +3414,7 @@ snapshots:
eslint-utils: 3.0.0(eslint@8.7.0) eslint-utils: 3.0.0(eslint@8.7.0)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
espree: 9.6.1 espree: 9.6.1
esquery: 1.6.0 esquery: 1.7.0
esutils: 2.0.3 esutils: 2.0.3
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1 file-entry-cache: 6.0.1
@ -3507,7 +3502,7 @@ snapshots:
dependencies: dependencies:
core-js: 2.6.12 core-js: 2.6.12
esquery@1.6.0: esquery@1.7.0:
dependencies: dependencies:
estraverse: 5.3.0 estraverse: 5.3.0
@ -3550,36 +3545,36 @@ snapshots:
dependencies: dependencies:
busboy: 1.6.0 busboy: 1.6.0
express@4.21.2: express@4.22.1:
dependencies: dependencies:
accepts: 1.3.8 accepts: 1.3.8
array-flatten: 1.1.1 array-flatten: 1.1.1
body-parser: 1.20.3 body-parser: 1.20.4
content-disposition: 0.5.4 content-disposition: 0.5.4
content-type: 1.0.5 content-type: 1.0.5
cookie: 0.7.1 cookie: 0.7.2
cookie-signature: 1.0.6 cookie-signature: 1.0.7
debug: 2.6.9 debug: 2.6.9
depd: 2.0.0 depd: 2.0.0
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
etag: 1.8.1 etag: 1.8.1
finalhandler: 1.3.1 finalhandler: 1.3.2
fresh: 0.5.2 fresh: 0.5.2
http-errors: 2.0.0 http-errors: 2.0.1
merge-descriptors: 1.0.3 merge-descriptors: 1.0.3
methods: 1.1.2 methods: 1.1.2
on-finished: 2.4.1 on-finished: 2.4.1
parseurl: 1.3.3 parseurl: 1.3.3
path-to-regexp: 0.1.12 path-to-regexp: 0.1.12
proxy-addr: 2.0.7 proxy-addr: 2.0.7
qs: 6.13.0 qs: 6.14.1
range-parser: 1.2.1 range-parser: 1.2.1
safe-buffer: 5.2.1 safe-buffer: 5.2.1
send: 0.19.0 send: 0.19.2
serve-static: 1.16.2 serve-static: 1.16.3
setprototypeof: 1.2.0 setprototypeof: 1.2.0
statuses: 2.0.1 statuses: 2.0.2
type-is: 1.6.18 type-is: 1.6.18
utils-merge: 1.0.1 utils-merge: 1.0.1
vary: 1.1.2 vary: 1.1.2
@ -3610,7 +3605,7 @@ snapshots:
fast-safe-stringify@2.1.1: {} fast-safe-stringify@2.1.1: {}
fastq@1.19.1: fastq@1.20.1:
dependencies: dependencies:
reusify: 1.1.0 reusify: 1.1.0
@ -3628,14 +3623,14 @@ snapshots:
dependencies: dependencies:
to-regex-range: 5.0.1 to-regex-range: 5.0.1
finalhandler@1.3.1: finalhandler@1.3.2:
dependencies: dependencies:
debug: 2.6.9 debug: 2.6.9
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
on-finished: 2.4.1 on-finished: 2.4.1
parseurl: 1.3.3 parseurl: 1.3.3
statuses: 2.0.1 statuses: 2.0.2
unpipe: 1.0.0 unpipe: 1.0.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3668,7 +3663,7 @@ snapshots:
dependencies: dependencies:
is-callable: 1.2.7 is-callable: 1.2.7
form-data@4.0.4: form-data@4.0.5:
dependencies: dependencies:
asynckit: 0.4.0 asynckit: 0.4.0
combined-stream: 1.0.8 combined-stream: 1.0.8
@ -3746,7 +3741,7 @@ snapshots:
get-uri@6.0.5: get-uri@6.0.5:
dependencies: dependencies:
basic-ftp: 5.0.5 basic-ftp: 5.1.0
data-uri-to-buffer: 6.0.2 data-uri-to-buffer: 6.0.2
debug: 4.4.3(supports-color@9.4.0) debug: 4.4.3(supports-color@9.4.0)
transitivePeerDependencies: transitivePeerDependencies:
@ -3837,12 +3832,12 @@ snapshots:
domutils: 3.2.2 domutils: 3.2.2
entities: 4.5.0 entities: 4.5.0
http-errors@2.0.0: http-errors@2.0.1:
dependencies: dependencies:
depd: 2.0.0 depd: 2.0.0
inherits: 2.0.4 inherits: 2.0.4
setprototypeof: 1.2.0 setprototypeof: 1.2.0
statuses: 2.0.1 statuses: 2.0.2
toidentifier: 1.0.1 toidentifier: 1.0.1
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
@ -4035,7 +4030,7 @@ snapshots:
is-typed-array@1.1.15: is-typed-array@1.1.15:
dependencies: dependencies:
which-typed-array: 1.1.19 which-typed-array: 1.1.20
is-unicode-supported@0.1.0: {} is-unicode-supported@0.1.0: {}
@ -4270,7 +4265,7 @@ snapshots:
next-tick@1.1.0: {} next-tick@1.1.0: {}
node-abi@3.85.0: node-abi@3.86.0:
dependencies: dependencies:
semver: 7.7.3 semver: 7.7.3
@ -4278,7 +4273,7 @@ snapshots:
dependencies: dependencies:
whatwg-url: 5.0.0 whatwg-url: 5.0.0
node-forge@1.3.1: {} node-forge@1.3.3: {}
node-windows@1.0.0-beta.8: node-windows@1.0.0-beta.8:
dependencies: dependencies:
@ -4556,7 +4551,7 @@ snapshots:
minimist: 1.2.8 minimist: 1.2.8
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
napi-build-utils: 1.0.2 napi-build-utils: 1.0.2
node-abi: 3.85.0 node-abi: 3.86.0
pump: 3.0.3 pump: 3.0.3
rc: 1.2.8 rc: 1.2.8
simple-get: 4.0.1 simple-get: 4.0.1
@ -4567,7 +4562,7 @@ snapshots:
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0: prettier-linter-helpers@1.0.1:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
@ -4601,7 +4596,7 @@ snapshots:
pngjs: 5.0.0 pngjs: 5.0.0
yargs: 15.4.1 yargs: 15.4.1
qs@6.13.0: qs@6.14.1:
dependencies: dependencies:
side-channel: 1.1.0 side-channel: 1.1.0
@ -4615,10 +4610,10 @@ snapshots:
range-parser@1.2.1: {} range-parser@1.2.1: {}
raw-body@2.5.2: raw-body@2.5.3:
dependencies: dependencies:
bytes: 3.1.2 bytes: 3.1.2
http-errors: 2.0.0 http-errors: 2.0.1
iconv-lite: 0.4.24 iconv-lite: 0.4.24
unpipe: 1.0.0 unpipe: 1.0.0
@ -4665,7 +4660,7 @@ snapshots:
dependencies: dependencies:
call-bind: 1.0.8 call-bind: 1.0.8
define-properties: 1.2.1 define-properties: 1.2.1
es-abstract: 1.24.0 es-abstract: 1.24.1
es-errors: 1.3.0 es-errors: 1.3.0
es-object-atoms: 1.1.1 es-object-atoms: 1.1.1
get-intrinsic: 1.3.0 get-intrinsic: 1.3.0
@ -4743,27 +4738,27 @@ snapshots:
safer-buffer@2.1.2: {} safer-buffer@2.1.2: {}
sax@1.4.3: {} sax@1.4.4: {}
secure-json-parse@2.7.0: {} secure-json-parse@2.7.0: {}
semver@7.7.3: {} semver@7.7.3: {}
send@0.19.0: send@0.19.2:
dependencies: dependencies:
debug: 2.6.9 debug: 2.6.9
depd: 2.0.0 depd: 2.0.0
destroy: 1.2.0 destroy: 1.2.0
encodeurl: 1.0.2 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
etag: 1.8.1 etag: 1.8.1
fresh: 0.5.2 fresh: 0.5.2
http-errors: 2.0.0 http-errors: 2.0.1
mime: 1.6.0 mime: 1.6.0
ms: 2.1.3 ms: 2.1.3
on-finished: 2.4.1 on-finished: 2.4.1
range-parser: 1.2.1 range-parser: 1.2.1
statuses: 2.0.1 statuses: 2.0.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4771,12 +4766,12 @@ snapshots:
dependencies: dependencies:
randombytes: 2.1.0 randombytes: 2.1.0
serve-static@1.16.2: serve-static@1.16.3:
dependencies: dependencies:
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
parseurl: 1.3.3 parseurl: 1.3.3
send: 0.19.0 send: 0.19.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -4908,7 +4903,7 @@ snapshots:
split2@4.2.0: {} split2@4.2.0: {}
statuses@2.0.1: {} statuses@2.0.2: {}
stop-iteration-iterator@1.1.0: stop-iteration-iterator@1.1.0:
dependencies: dependencies:
@ -4943,7 +4938,7 @@ snapshots:
call-bound: 1.0.4 call-bound: 1.0.4
define-data-property: 1.1.4 define-data-property: 1.1.4
define-properties: 1.2.1 define-properties: 1.2.1
es-abstract: 1.24.0 es-abstract: 1.24.1
es-object-atoms: 1.1.1 es-object-atoms: 1.1.1
has-property-descriptors: 1.0.2 has-property-descriptors: 1.0.2
@ -5047,7 +5042,7 @@ snapshots:
dependencies: dependencies:
gopd: 1.2.0 gopd: 1.2.0
typedarray.prototype.slice: 1.0.5 typedarray.prototype.slice: 1.0.5
which-typed-array: 1.1.19 which-typed-array: 1.1.20
tslib@1.14.1: {} tslib@1.14.1: {}
@ -5122,7 +5117,7 @@ snapshots:
dependencies: dependencies:
call-bind: 1.0.8 call-bind: 1.0.8
define-properties: 1.2.1 define-properties: 1.2.1
es-abstract: 1.24.0 es-abstract: 1.24.1
es-errors: 1.3.0 es-errors: 1.3.0
get-proto: 1.0.1 get-proto: 1.0.1
math-intrinsics: 1.1.0 math-intrinsics: 1.1.0
@ -5189,7 +5184,7 @@ snapshots:
isarray: 2.0.5 isarray: 2.0.5
which-boxed-primitive: 1.1.1 which-boxed-primitive: 1.1.1
which-collection: 1.0.2 which-collection: 1.0.2
which-typed-array: 1.1.19 which-typed-array: 1.1.20
which-collection@1.0.2: which-collection@1.0.2:
dependencies: dependencies:
@ -5200,7 +5195,7 @@ snapshots:
which-module@2.0.1: {} which-module@2.0.1: {}
which-typed-array@1.1.19: which-typed-array@1.1.20:
dependencies: dependencies:
available-typed-arrays: 1.0.7 available-typed-arrays: 1.0.7
call-bind: 1.0.8 call-bind: 1.0.8
@ -5234,7 +5229,7 @@ snapshots:
xml2js@0.6.2: xml2js@0.6.2:
dependencies: dependencies:
sax: 1.4.3 sax: 1.4.4
xmlbuilder: 11.0.1 xmlbuilder: 11.0.1
xml@1.0.1: {} xml@1.0.1: {}

View File

@ -1,5 +1,5 @@
const crypto = require("crypto"); const crypto = require('crypto')
const os = require("os"); const os = require('os')
class AdvancedClientSignGenerator { class AdvancedClientSignGenerator {
/** /**
@ -7,25 +7,25 @@ class AdvancedClientSignGenerator {
*/ */
static getRealMacAddress() { static getRealMacAddress() {
try { try {
const interfaces = os.networkInterfaces(); const interfaces = os.networkInterfaces()
for (let interfaceName in interfaces) { for (let interfaceName in interfaces) {
const interface = interfaces[interfaceName]; const interfaceItem = interfaces[interfaceName]
for (let i = 0; i < interface.length; i++) { for (let i = 0; i < interfaceItem.length; i++) {
const alias = interface[i]; const alias = interfaceItem[i]
// 排除内部地址和无效地址 // 排除内部地址和无效地址
if ( if (
alias.mac && alias.mac &&
alias.mac !== "00:00:00:00:00:00" && alias.mac !== '00:00:00:00:00:00' &&
!alias.internal !alias.internal
) { ) {
return alias.mac.toUpperCase(); return alias.mac.toUpperCase()
} }
} }
} }
return null; return null
} catch (error) { } catch (error) {
console.warn("获取MAC地址失败:", error.message); console.warn('获取MAC地址失败:', error.message)
return null; return null
} }
} }
@ -33,108 +33,108 @@ class AdvancedClientSignGenerator {
* 生成随机MAC地址 * 生成随机MAC地址
*/ */
static generateRandomMac() { static generateRandomMac() {
const chars = "0123456789ABCDEF"; const chars = '0123456789ABCDEF'
let mac = ""; let mac = ''
for (let i = 0; i < 6; i++) { for (let i = 0; i < 6; i++) {
if (i > 0) mac += ":"; if (i > 0) mac += ':'
mac += mac +=
chars[Math.floor(Math.random() * 16)] + chars[Math.floor(Math.random() * 16)] +
chars[Math.floor(Math.random() * 16)]; chars[Math.floor(Math.random() * 16)]
} }
// 确保第一个字节是单播地址最低位为0 // 确保第一个字节是单播地址最低位为0
const firstByte = parseInt(mac.substring(0, 2), 16); const firstByte = parseInt(mac.substring(0, 2), 16)
const unicastFirstByte = (firstByte & 0xfe) const unicastFirstByte = (firstByte & 0xfe)
.toString(16) .toString(16)
.padStart(2, "0") .padStart(2, '0')
.toUpperCase(); .toUpperCase()
return unicastFirstByte + mac.substring(2); return unicastFirstByte + mac.substring(2)
} }
/** /**
* 获取MAC地址优先真实否则随机 * 获取MAC地址优先真实否则随机
*/ */
static getMacAddress() { static getMacAddress() {
const realMac = this.getRealMacAddress(); const realMac = this.getRealMacAddress()
if (realMac) { if (realMac) {
return realMac; return realMac
} }
console.warn("无法获取真实MAC地址使用随机生成"); console.warn('无法获取真实MAC地址使用随机生成')
return this.generateRandomMac(); return this.generateRandomMac()
} }
/** /**
* 字符串转HEX编码 * 字符串转HEX编码
*/ */
static stringToHex(str) { static stringToHex(str) {
return Buffer.from(str, "utf8").toString("hex").toUpperCase(); return Buffer.from(str, 'utf8').toString('hex').toUpperCase()
} }
/** /**
* SHA-256哈希 * SHA-256哈希
*/ */
static sha256(data) { static sha256(data) {
return crypto.createHash("sha256").update(data, "utf8").digest("hex"); return crypto.createHash('sha256').update(data, 'utf8').digest('hex')
} }
/** /**
* 生成随机设备ID * 生成随机设备ID
*/ */
static generateRandomDeviceId() { static generateRandomDeviceId() {
const partLengths = [4, 4, 4, 4, 4, 4, 4, 5]; // 各部分长度 const partLengths = [4, 4, 4, 4, 4, 4, 4, 5] // 各部分长度
const chars = "0123456789ABCDEF"; const chars = '0123456789ABCDEF'
const parts = partLengths.map((length) => { const parts = partLengths.map((length) => {
let part = ""; let part = ''
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
part += chars[Math.floor(Math.random() * 16)]; part += chars[Math.floor(Math.random() * 16)]
} }
return part; return part
}); })
return parts.join("_"); return parts.join('_')
} }
/** /**
* 生成随机clientSign优先使用真实MAC否则随机 * 生成随机clientSign优先使用真实MAC否则随机
*/ */
static generateRandomClientSign(secretKey = "") { static generateRandomClientSign(secretKey = '') {
// 获取MAC地址优先真实否则随机 // 获取MAC地址优先真实否则随机
const macAddress = this.getMacAddress(); const macAddress = this.getMacAddress()
// 生成随机设备ID // 生成随机设备ID
const deviceId = this.generateRandomDeviceId(); const deviceId = this.generateRandomDeviceId()
// 转换设备ID为HEX // 转换设备ID为HEX
const hexDeviceId = this.stringToHex(deviceId); const hexDeviceId = this.stringToHex(deviceId)
// 构造签名字符串 // 构造签名字符串
const signString = `${macAddress}@@@${hexDeviceId}`; const signString = `${macAddress}@@@${hexDeviceId}`
// 生成哈希 // 生成哈希
const hash = this.sha256(signString + secretKey); const hash = this.sha256(signString + secretKey)
return `${signString}@@@@@@${hash}`; return `${signString}@@@@@@${hash}`
} }
/** /**
* 批量生成多个随机签名 * 批量生成多个随机签名
*/ */
static generateMultipleRandomSigns(count, secretKey = "") { static generateMultipleRandomSigns(count, secretKey = '') {
const signs = []; const signs = []
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
signs.push(this.generateRandomClientSign(secretKey)); signs.push(this.generateRandomClientSign(secretKey))
} }
return signs; return signs
} }
/** /**
* 使用指定参数生成签名 * 使用指定参数生成签名
*/ */
static generateWithCustomDeviceId(macAddress, deviceId, secretKey = "") { static generateWithCustomDeviceId(macAddress, deviceId, secretKey = '') {
const hexDeviceId = this.stringToHex(deviceId); const hexDeviceId = this.stringToHex(deviceId)
const signString = `${macAddress}@@@${hexDeviceId}`; const signString = `${macAddress}@@@${hexDeviceId}`
const hash = this.sha256(signString + secretKey); const hash = this.sha256(signString + secretKey)
return `${signString}@@@@@@${hash}`; return `${signString}@@@@@@${hash}`
} }
/** /**
@ -142,28 +142,28 @@ class AdvancedClientSignGenerator {
*/ */
static validateClientSign(clientSign) { static validateClientSign(clientSign) {
try { try {
const parts = clientSign.split("@@@@@@"); const parts = clientSign.split('@@@@@@')
if (parts.length !== 2) return false; if (parts.length !== 2) return false
const [infoPart, hash] = parts; const [infoPart, hash] = parts
const infoParts = infoPart.split("@@@"); const infoParts = infoPart.split('@@@')
if (infoParts.length !== 2) return false; if (infoParts.length !== 2) return false
const [mac, hexDeviceId] = infoParts; const [mac, hexDeviceId] = infoParts
// 验证MAC地址格式 // 验证MAC地址格式
const macRegex = /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/; const macRegex = /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/
if (!macRegex.test(mac)) return false; if (!macRegex.test(mac)) return false
// 验证哈希格式 // 验证哈希格式
const hashRegex = /^[0-9a-f]{64}$/; const hashRegex = /^[0-9a-f]{64}$/
if (!hashRegex.test(hash)) return false; if (!hashRegex.test(hash)) return false
return true; return true
} catch (error) { } catch (error) {
return false; return false
} }
} }
} }
module.exports = AdvancedClientSignGenerator; module.exports = AdvancedClientSignGenerator

View File

@ -100,7 +100,7 @@ const SPECIAL_STATUS_CODES = new Set([201, 302, 400, 502, 800, 801, 802, 803])
// chooseUserAgent函数 // chooseUserAgent函数
const chooseUserAgent = (crypto, uaType = 'pc') => { const chooseUserAgent = (crypto, uaType = 'pc') => {
return userAgentMap[crypto]?.[uaType] || '' return (userAgentMap[crypto] && userAgentMap[crypto][uaType]) || ''
} }
// cookie处理 // cookie处理
@ -152,8 +152,7 @@ const createHeaderCookie = (header) => {
const generateRequestId = () => { const generateRequestId = () => {
return `${now()}_${floor(random() * 1000) return `${now()}_${floor(random() * 1000)
.toString() .toString()
.padStart(4, "0")}`; .padStart(4, '0')}`
} }
const createRequest = (uri, data, options) => { const createRequest = (uri, data, options) => {