Compare commits

...

3 Commits

Author SHA1 Message Date
20d3a1a7a5
feat: 新增获取免费听市场状态 2026-07-22 20:07:08 +08:00
4826c65042
feat: weapi支持checkToken 2026-07-22 19:40:12 +08:00
7822ab08d3
feat: 新增评论相关接口 2026-07-22 19:18:18 +08:00
16 changed files with 382 additions and 93 deletions

View File

@ -0,0 +1,13 @@
// 获取免费听时长状态
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
entrance: 'FREE_LISTEN_RN',
}
return request(
`/api/ad/homepage/free/tab/extend/v2`,
data,
createOption(query, 'xeapi'),
)
}

View File

@ -0,0 +1,13 @@
// 发送安全验证码
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
ctcode: query.ctcode || '86',
}
return request(
`/api/sms/captcha/safe/sent`,
data,
createOption(query, 'eapi'),
)
}

16
module/captcha_sent_v1.js Normal file
View File

@ -0,0 +1,16 @@
// 发送验证码
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
ctcode: query.ctcode || '86',
secrete: 'music_middleuser_pclogin',
cellphone: query.phone,
scene: '0',
}
return request(
`/api/middle/captcha/sent/v1`,
data,
createOption(query, 'eapi'),
)
}

View File

@ -6,5 +6,9 @@ module.exports = (query, request) => {
cellphone: query.phone, cellphone: query.phone,
countrycode: query.countrycode, countrycode: query.countrycode,
} }
return request(`/api/cellphone/existence/check`, data, createOption(query)) return request(
`/api/cellphone/existence/check`,
data,
createOption(query, 'eapi'),
)
} }

18
module/comment_add.js Normal file
View File

@ -0,0 +1,18 @@
const { resourceTypeMap } = require('../util/config.json')
// 发送评论
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
threadId: resourceTypeMap[query.type] + query.id,
content: query.content,
resourceType: '0',
expressionPicId: '-1',
bubbleId: '-1',
}
return request(
`/api/resource/comments/add`,
data,
createOption(query, 'xeapi', 'v3'),
)
}

15
module/comment_delete.js Normal file
View File

@ -0,0 +1,15 @@
const { resourceTypeMap } = require('../util/config.json')
// 删除评论
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
commentId: query.cid,
threadId: resourceTypeMap[query.type] + query.id,
}
return request(
`/api/resource/comments/delete`,
data,
createOption(query, 'xeapi'),
)
}

17
module/comment_reply.js Normal file
View File

@ -0,0 +1,17 @@
const { resourceTypeMap } = require('../util/config.json')
// 发送评论
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
threadId: resourceTypeMap[query.type] + query.id,
commentId: query.cid,
content: query.content,
resourceType: '0',
}
return request(
`/api/v1/resource/comments/reply`,
data,
createOption(query, 'xeapi', 'v3'),
)
}

14
module/device_kickoff.js Normal file
View File

@ -0,0 +1,14 @@
// 强制下线设备
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
key: query.deviceKey,
captcha: query.captcha || '',
}
return request(
`/api/middle/user/security/device/kickoff`,
data,
createOption(query, 'eapi'),
)
}

13
module/device_list.js Normal file
View File

@ -0,0 +1,13 @@
// 登录设备列表
const createOption = require('../util/option.js')
module.exports = (query, request) => {
const data = {
excStatus: '9',
}
return request(
`/api/middle/user/device/list`,
data,
createOption(query, 'eapi'),
)
}

View File

@ -14,6 +14,7 @@ module.exports = async (query, request) => {
? query.captcha ? query.captcha
: query.md5_password || CryptoJS.MD5(query.password).toString(), : query.md5_password || CryptoJS.MD5(query.password).toString(),
remember: 'true', remember: 'true',
secureCaptcha: query.sca || '',
} }
let result = await request( let result = await request(
`/api/w/login/cellphone`, `/api/w/login/cellphone`,

View File

@ -34,5 +34,24 @@ module.exports = async (query) => {
} }
} }
// 模块加载时自动获取一次 Token确保 request.js 使用时不为空
fetch()
.then((token) => {
_token = token
})
.catch(() => {
// 静默失败,后续请求时会重试
})
// 给 request.js 读取用 // 给 request.js 读取用
module.exports.getToken = () => _token module.exports.getToken = () => {
if (!_token) {
// 如果 Token 为空,异步触发获取
fetch()
.then((token) => {
_token = token
})
.catch(() => {})
}
return _token
}

View File

@ -1,6 +1,6 @@
{ {
"name": "@neteasecloudmusicapienhanced/api", "name": "@neteasecloudmusicapienhanced/api",
"version": "4.37.0", "version": "4.38.0",
"description": "全网最全的网易云音乐API接口 || 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": { "scripts": {
"dev": "nodemon app.js", "dev": "nodemon app.js",
@ -98,8 +98,8 @@
"@types/express-fileupload": "^1.5.1", "@types/express-fileupload": "^1.5.1",
"@types/mocha": "^10.0.10", "@types/mocha": "^10.0.10",
"@types/node": "25.9.2", "@types/node": "25.9.2",
"@typescript-eslint/eslint-plugin": "^8.64.0", "@typescript-eslint/eslint-plugin": "^8.65.0",
"@typescript-eslint/parser": "^8.64.0", "@typescript-eslint/parser": "^8.65.0",
"eslint": "^9.39.5", "eslint": "^9.39.5",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-html": "^8.1.4", "eslint-plugin-html": "^8.1.4",
@ -112,7 +112,7 @@
"nodemon": "^3.1.14", "nodemon": "^3.1.14",
"pkg": "^5.8.1", "pkg": "^5.8.1",
"power-assert": "^1.6.1", "power-assert": "^1.6.1",
"prettier": "^3.9.5", "prettier": "^3.9.6",
"typescript": "^5.9.3" "typescript": "^5.9.3"
}, },
"publishConfig": { "publishConfig": {

163
pnpm-lock.yaml generated
View File

@ -73,11 +73,11 @@ importers:
specifier: 25.9.2 specifier: 25.9.2
version: 25.9.2 version: 25.9.2
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.64.0 specifier: ^8.65.0
version: 8.64.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3) version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^8.64.0 specifier: ^8.65.0
version: 8.64.0(eslint@9.39.5)(typescript@5.9.3) version: 8.65.0(eslint@9.39.5)(typescript@5.9.3)
eslint: eslint:
specifier: ^9.39.5 specifier: ^9.39.5
version: 9.39.5 version: 9.39.5
@ -89,7 +89,7 @@ importers:
version: 8.1.4 version: 8.1.4
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.5.6 specifier: ^5.5.6
version: 5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5))(eslint@9.39.5)(prettier@3.9.5) version: 5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5))(eslint@9.39.5)(prettier@3.9.6)
globals: globals:
specifier: ^17.7.0 specifier: ^17.7.0
version: 17.7.0 version: 17.7.0
@ -115,8 +115,8 @@ importers:
specifier: ^1.6.1 specifier: ^1.6.1
version: 1.6.1 version: 1.6.1
prettier: prettier:
specifier: ^3.9.5 specifier: ^3.9.6
version: 3.9.5 version: 3.9.6
typescript: typescript:
specifier: ^5.9.3 specifier: ^5.9.3
version: 5.9.3 version: 5.9.3
@ -147,9 +147,9 @@ packages:
'@borewit/text-codec@0.2.2': '@borewit/text-codec@0.2.2':
resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==}
'@eslint-community/eslint-utils@4.9.1': '@eslint-community/eslint-utils@4.10.0':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} resolution: {integrity: sha512-rd6n9Sefya1R1Vd594TRwzeHq2VnmICbvh3jebyt1Hs/6OoCSYNVpjGRRsKSTwAq3SKl09w0AfRCU57hoDLmxg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^20.19.0 || ^22.13.0 || >=24}
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@ -301,63 +301,63 @@ packages:
'@types/serve-static@2.2.0': '@types/serve-static@2.2.0':
resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==}
'@typescript-eslint/eslint-plugin@8.64.0': '@typescript-eslint/eslint-plugin@8.65.0':
resolution: {integrity: sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==} resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.64.0 '@typescript-eslint/parser': ^8.65.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/parser@8.64.0': '@typescript-eslint/parser@8.65.0':
resolution: {integrity: sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==} resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/project-service@8.64.0': '@typescript-eslint/project-service@8.65.0':
resolution: {integrity: sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==} resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/scope-manager@8.64.0': '@typescript-eslint/scope-manager@8.65.0':
resolution: {integrity: sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==} resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.64.0': '@typescript-eslint/tsconfig-utils@8.65.0':
resolution: {integrity: sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==} resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/type-utils@8.64.0': '@typescript-eslint/type-utils@8.65.0':
resolution: {integrity: sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==} resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/types@8.64.0': '@typescript-eslint/types@8.65.0':
resolution: {integrity: sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==} resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.64.0': '@typescript-eslint/typescript-estree@8.65.0':
resolution: {integrity: sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==} resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/utils@8.64.0': '@typescript-eslint/utils@8.65.0':
resolution: {integrity: sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==} resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0' typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/visitor-keys@8.64.0': '@typescript-eslint/visitor-keys@8.65.0':
resolution: {integrity: sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==} resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@unblockneteasemusic/server@0.28.0': '@unblockneteasemusic/server@0.28.0':
@ -973,10 +973,6 @@ packages:
resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint-visitor-keys@4.2.1: eslint-visitor-keys@4.2.1:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -1833,8 +1829,8 @@ packages:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
own-keys@1.0.1: own-keys@1.0.2:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
p-is-promise@3.0.0: p-is-promise@3.0.0:
@ -2006,8 +2002,8 @@ packages:
resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
prettier@3.9.5: prettier@3.9.6:
resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==} resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@ -2687,10 +2683,10 @@ snapshots:
'@borewit/text-codec@0.2.2': {} '@borewit/text-codec@0.2.2': {}
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.5)': '@eslint-community/eslint-utils@4.10.0(eslint@9.39.5)':
dependencies: dependencies:
eslint: 9.39.5 eslint: 9.39.5
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 5.0.1
'@eslint-community/regexpp@4.12.2': {} '@eslint-community/regexpp@4.12.2': {}
@ -2867,14 +2863,14 @@ snapshots:
'@types/http-errors': 2.0.5 '@types/http-errors': 2.0.5
'@types/node': 25.9.2 '@types/node': 25.9.2
'@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3)': '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.64.0(eslint@9.39.5)(typescript@5.9.3) '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.64.0 '@typescript-eslint/scope-manager': 8.65.0
'@typescript-eslint/type-utils': 8.64.0(eslint@9.39.5)(typescript@5.9.3) '@typescript-eslint/type-utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3)
'@typescript-eslint/utils': 8.64.0(eslint@9.39.5)(typescript@5.9.3) '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.64.0 '@typescript-eslint/visitor-keys': 8.65.0
eslint: 9.39.5 eslint: 9.39.5
ignore: 7.0.6 ignore: 7.0.6
natural-compare: 1.4.0 natural-compare: 1.4.0
@ -2883,41 +2879,41 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.64.0(eslint@9.39.5)(typescript@5.9.3)': '@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.64.0 '@typescript-eslint/scope-manager': 8.65.0
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
'@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.64.0 '@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3 debug: 4.4.3
eslint: 9.39.5 eslint: 9.39.5
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.64.0(typescript@5.9.3)': '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3)
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
debug: 4.4.3 debug: 4.4.3
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.64.0': '@typescript-eslint/scope-manager@8.65.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
'@typescript-eslint/visitor-keys': 8.64.0 '@typescript-eslint/visitor-keys': 8.65.0
'@typescript-eslint/tsconfig-utils@8.64.0(typescript@5.9.3)': '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)':
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
'@typescript-eslint/type-utils@8.64.0(eslint@9.39.5)(typescript@5.9.3)': '@typescript-eslint/type-utils@8.65.0(eslint@9.39.5)(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
'@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3)
'@typescript-eslint/utils': 8.64.0(eslint@9.39.5)(typescript@5.9.3) '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3)
debug: 4.4.3 debug: 4.4.3
eslint: 9.39.5 eslint: 9.39.5
ts-api-utils: 2.5.0(typescript@5.9.3) ts-api-utils: 2.5.0(typescript@5.9.3)
@ -2925,14 +2921,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.64.0': {} '@typescript-eslint/types@8.65.0': {}
'@typescript-eslint/typescript-estree@8.64.0(typescript@5.9.3)': '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.64.0(typescript@5.9.3) '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3)
'@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3)
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
'@typescript-eslint/visitor-keys': 8.64.0 '@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3 debug: 4.4.3
minimatch: 10.2.5 minimatch: 10.2.5
semver: 7.8.5 semver: 7.8.5
@ -2942,20 +2938,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.64.0(eslint@9.39.5)(typescript@5.9.3)': '@typescript-eslint/utils@8.65.0(eslint@9.39.5)(typescript@5.9.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5) '@eslint-community/eslint-utils': 4.10.0(eslint@9.39.5)
'@typescript-eslint/scope-manager': 8.64.0 '@typescript-eslint/scope-manager': 8.65.0
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
'@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3)
eslint: 9.39.5 eslint: 9.39.5
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/visitor-keys@8.64.0': '@typescript-eslint/visitor-keys@8.65.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.64.0 '@typescript-eslint/types': 8.65.0
eslint-visitor-keys: 5.0.1 eslint-visitor-keys: 5.0.1
'@unblockneteasemusic/server@0.28.0': '@unblockneteasemusic/server@0.28.0':
@ -3527,7 +3523,7 @@ snapshots:
object-inspect: 1.13.4 object-inspect: 1.13.4
object-keys: 1.1.1 object-keys: 1.1.1
object.assign: 4.1.7 object.assign: 4.1.7
own-keys: 1.0.1 own-keys: 1.0.2
regexp.prototype.flags: 1.5.4 regexp.prototype.flags: 1.5.4
safe-array-concat: 1.1.4 safe-array-concat: 1.1.4
safe-push-apply: 1.0.0 safe-push-apply: 1.0.0
@ -3656,10 +3652,10 @@ snapshots:
dependencies: dependencies:
htmlparser2: 10.1.0 htmlparser2: 10.1.0
eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5))(eslint@9.39.5)(prettier@3.9.5): eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@9.39.5))(eslint@9.39.5)(prettier@3.9.6):
dependencies: dependencies:
eslint: 9.39.5 eslint: 9.39.5
prettier: 3.9.5 prettier: 3.9.6
prettier-linter-helpers: 1.0.1 prettier-linter-helpers: 1.0.1
synckit: 0.11.13 synckit: 0.11.13
optionalDependencies: optionalDependencies:
@ -3670,15 +3666,13 @@ snapshots:
esrecurse: 4.3.0 esrecurse: 4.3.0
estraverse: 5.3.0 estraverse: 5.3.0
eslint-visitor-keys@3.4.3: {}
eslint-visitor-keys@4.2.1: {} eslint-visitor-keys@4.2.1: {}
eslint-visitor-keys@5.0.1: {} eslint-visitor-keys@5.0.1: {}
eslint@9.39.5: eslint@9.39.5:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5) '@eslint-community/eslint-utils': 4.10.0(eslint@9.39.5)
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.2 '@eslint/config-array': 0.21.2
'@eslint/config-helpers': 0.4.2 '@eslint/config-helpers': 0.4.2
@ -4662,8 +4656,9 @@ snapshots:
type-check: 0.4.0 type-check: 0.4.0
word-wrap: 1.2.5 word-wrap: 1.2.5
own-keys@1.0.1: own-keys@1.0.2:
dependencies: dependencies:
call-bound: 1.0.4
get-intrinsic: 1.3.0 get-intrinsic: 1.3.0
object-keys: 1.1.1 object-keys: 1.1.1
safe-push-apply: 1.0.0 safe-push-apply: 1.0.0
@ -4899,7 +4894,7 @@ snapshots:
dependencies: dependencies:
fast-diff: 1.3.0 fast-diff: 1.3.0
prettier@3.9.5: {} prettier@3.9.6: {}
process-nextick-args@2.0.1: {} process-nextick-args@2.0.1: {}

View File

@ -283,7 +283,9 @@ AI 生成的图,仅供娱乐()
`md5_password`: md5 加密后的密码,传入后 `password` 参数将失效 `md5_password`: md5 加密后的密码,传入后 `password` 参数将失效
`captcha`: 验证码,使用 [`/captcha/sent`](#发送验证码)接口传入手机号获取验证码,调用此接口传入验证码,可使用验证码登录,传入后 `password` 参数将失效 `captcha`: 验证码,使用 `/captcha/sent``/captcha/sent/v1`接口传入手机号获取验证码,调用此接口传入验证码,可使用验证码登录,传入后 `password` 参数将失效
`sca`: 网易易盾滑块验证token, 获取方式未知
**接口地址 :** `/login/cellphone` **接口地址 :** `/login/cellphone`
@ -397,6 +399,19 @@ body {
**调用例子 :** `/captcha/sent?phone=13xxx` **调用例子 :** `/captcha/sent?phone=13xxx`
### 新版发送验证码
说明 : 调用此接口 ,传入手机号码, 可发送验证码
**必选参数 :** `phone`: 手机号码
**可选参数 :**
`ctcode`: 国家区号,默认 86 即中国
**接口地址 :** `/captcha/sent/v1`
**调用例子 :** `/captcha/sent/v1?phone=13xxx`
### 验证验证码 ### 验证验证码
说明 : 调用此接口 ,传入手机号码和验证码, 可校验验证码是否正确 说明 : 调用此接口 ,传入手机号码和验证码, 可校验验证码是否正确
@ -5495,6 +5510,14 @@ let data = encodeURIComponent(
**调用例子 :** `/ad/listening/rights/gain` **调用例子 :** `/ad/listening/rights/gain`
### 获取免费听时长状态
说明 : 登录后调用此接口, 获取免费听剩余时长
**接口地址 :** `/ad/listening/rights`
**调用例子 :** `/ad/listening/rights`
### 云小编 - 获取用户详情 ### 云小编 - 获取用户详情
说明: 登录后调用此接口, 获取云小编用户详情 说明: 登录后调用此接口, 获取云小编用户详情
@ -5581,6 +5604,129 @@ let data = encodeURIComponent(
**调用例子:** `/rep/ugc/user/collect-vip?activityId=5001` **调用例子:** `/rep/ugc/user/collect-vip?activityId=5001`
### 发送/删除评论
说明 : 调用此接口,可发送评论或者删除评论
1. 发送评论
**必选参数**
`type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
```
0: 歌曲
1: mv
2: 歌单
3: 专辑
4: 电台
5: 视频
6: 动态
```
`id`: 对应资源 id
`content`: 要发送的内容
**调用例子** : `/comment/add?type=1&id=5436712&content=test` (往广岛之恋 mv 发送评论: test)
2. 回复评论
**必选参数**
`type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
```
0: 歌曲
1: mv
2: 歌单
3: 专辑
4: 电台
5: 视频
6: 动态
```
`id`: 对应资源 id
`cid`: 评论 id
`content`: 要发送的内容
**调用例子** : `/comment/add?type=1&id=5436712&cid=1535550516319&content=test` (往广岛之恋 mv 回复test评论: test)
3. 删除评论
**必选参数**
`type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
```
0: 歌曲
1: mv
2: 歌单
3: 专辑
4: 电台节目
5: 视频
6: 动态
7: 电台
```
`id`: 对应资源 id
`cid`: 评论 id
**调用例子** : `/comment?type=1&id=5436712&cid=1535550516319` (在广岛之恋 mv 删除评论)
### 获取在线设备列表
说明: 登录后调用此接口, 获取在线设备列表
**接口地址:** `/device/list`
**调用例子:** `/device/list`
### 发送安全验证码
说明: 登录后调用此接口, 传入手机号, 可发送安全验证码
**必选参数 :** `phone`: 手机号
**接口地址 :** `/captcha/safe/sent`
**调用例子 :** `/captcha/safe/sent?phone=13XXXXXXXXX`
### 强制下线设备
说明: 登录后调用此接口, 传入设备 id, 可强制下线设备的登录会话
**必选参数 :** `key`: 设备的 `deviceKey`, 可通过 `/device/list` 获取
`captcha`: 安全验证码, 可通过 `/captcha/safe/sent` 获取
**接口地址 :** `/device/kickoff`
**调用例子 :** `/device/kickoff?key=00ALDFGEXXXXXXXXXXXXXXXXX&captcha=1234`
## 离线访问此文档 ## 离线访问此文档
此文档同时也是 Progressive Web Apps(PWA), 加入了 serviceWorker, 可离线访问 此文档同时也是 Progressive Web Apps(PWA), 加入了 serviceWorker, 可离线访问

View File

@ -11,6 +11,7 @@
}, },
"APP_CONF": { "APP_CONF": {
"apiDomain": "https://interface.music.163.com", "apiDomain": "https://interface.music.163.com",
"eapiDomain": "https://interfacepc.music.163.com",
"xeapiDomain": "https://interface3.music.163.com", "xeapiDomain": "https://interface3.music.163.com",
"domain": "https://music.163.com", "domain": "https://music.163.com",
"clDomian": "https://clientlog.music.163.com", "clDomian": "https://clientlog.music.163.com",

View File

@ -112,7 +112,7 @@ const userAgentMap = {
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
}, },
api: { api: {
pc: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Chrome/91.0.4472.164 NeteaseMusicDesktop/3.0.18.203152', pc: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Chrome/91.0.4472.164 NeteaseMusicDesktop/3.1.29.205117',
android: android:
'NeteaseMusic/9.1.65.240927161425(9001065);Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)', 'NeteaseMusic/9.1.65.240927161425(9001065);Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)',
iphone: 'NeteaseMusic 9.0.90/5038 (iPhone; iOS 16.2; zh_CN)', iphone: 'NeteaseMusic 9.0.90/5038 (iPhone; iOS 16.2; zh_CN)',
@ -122,6 +122,7 @@ const userAgentMap = {
// 预先定义常量 // 预先定义常量
const DOMAIN = APP_CONF.domain const DOMAIN = APP_CONF.domain
const API_DOMAIN = APP_CONF.apiDomain const API_DOMAIN = APP_CONF.apiDomain
const EAPI_DOMAIN = APP_CONF.eapiDomain
const XEAPI_DOMAIN = APP_CONF.xeapiDomain const XEAPI_DOMAIN = APP_CONF.xeapiDomain
const ENCRYPT_RESPONSE = APP_CONF.encryptResponse const ENCRYPT_RESPONSE = APP_CONF.encryptResponse
const SPECIAL_STATUS_CODES = new Set([201, 302, 400, 502, 800, 801, 802, 803]) const SPECIAL_STATUS_CODES = new Set([201, 302, 400, 502, 800, 801, 802, 803])
@ -242,6 +243,9 @@ const createRequest = (uri, data, options) => {
headers['Referer'] = options.domain || DOMAIN headers['Referer'] = options.domain || DOMAIN
headers['User-Agent'] = options.ua || chooseUserAgent('weapi') headers['User-Agent'] = options.ua || chooseUserAgent('weapi')
data.csrf_token = csrfToken data.csrf_token = csrfToken
if (options.checkToken) {
headers['X-antiCheatToken'] = token
}
encryptData = encrypt.weapi(data) encryptData = encrypt.weapi(data)
url = (options.domain || DOMAIN) + '/weapi/' + uri.substr(5) url = (options.domain || DOMAIN) + '/weapi/' + uri.substr(5)
break break
@ -342,7 +346,7 @@ const createRequest = (uri, data, options) => {
data.header = header data.header = header
encryptData = encrypt.eapi(uri, data) encryptData = encrypt.eapi(uri, data)
url = (options.domain || API_DOMAIN) + '/eapi/' + uri.substr(5) url = (options.domain || EAPI_DOMAIN) + '/eapi/' + uri.substr(5)
} else if (crypto === 'api') { } else if (crypto === 'api') {
url = (options.domain || API_DOMAIN) + uri url = (options.domain || API_DOMAIN) + uri
encryptData = data encryptData = data