From 4f4aa134d53704932b9fe0e09b7170f2a2451731 Mon Sep 17 00:00:00 2001 From: ImFurina <222616389+MoeFurina@users.noreply.github.com> Date: Sun, 7 Sep 2025 12:58:58 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3,?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=BD=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: binaryify --- module/captcha_sent.js | 1 + module/login_cellphone.js | 2 +- module/login_qr_create.js | 17 ++++++++++++++--- module/playlist_category_list.js | 11 +++++++++++ module/playlist_catlist.js | 2 +- module/playlist_subscribe.js | 10 +++++++--- module/register_anonimous.js | 15 ++++++--------- module/register_cellphone.js | 3 ++- module/toplist_detail_v2.js | 6 ++++++ module/user_detail_new.js | 20 ++++++++++++++++++++ package.json | 2 +- 11 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 module/playlist_category_list.js create mode 100644 module/toplist_detail_v2.js create mode 100644 module/user_detail_new.js diff --git a/module/captcha_sent.js b/module/captcha_sent.js index 32988a4..fdf7231 100644 --- a/module/captcha_sent.js +++ b/module/captcha_sent.js @@ -4,6 +4,7 @@ const createOption = require('../util/option.js') module.exports = (query, request) => { const data = { ctcode: query.ctcode || '86', + secrete: 'music_middleuser_pclogin', cellphone: query.phone, } return request(`/api/sms/captcha/sent`, data, createOption(query, 'weapi')) diff --git a/module/login_cellphone.js b/module/login_cellphone.js index 7702161..bdc4f0d 100644 --- a/module/login_cellphone.js +++ b/module/login_cellphone.js @@ -13,7 +13,7 @@ module.exports = async (query, request) => { [query.captcha ? 'captcha' : 'password']: query.captcha ? query.captcha : query.md5_password || CryptoJS.MD5(query.password).toString(), - rememberLogin: 'true', + remember: 'true', } let result = await request( `/api/w/login/cellphone`, diff --git a/module/login_qr_create.js b/module/login_qr_create.js index 20db974..d94cbec 100644 --- a/module/login_qr_create.js +++ b/module/login_qr_create.js @@ -1,9 +1,20 @@ const QRCode = require('qrcode') +const { generateChainId } = require('../util/index') -const createOption = require('../util/option.js') -module.exports = (query, request) => { +module.exports = (query) => { return new Promise(async (resolve) => { - const url = `https://music.163.com/login?codekey=${query.key}` + const platform = query.platform || 'pc' + const cookie = query.cookie || '' + + // 构建基础URL + let url = `https://music.163.com/login?codekey=${query.key}` + + // 如果是web平台,则添加chainId参数 + + if (platform === 'web') { + const chainId = generateChainId(cookie) + url += `&chainId=${chainId}` + } return resolve({ code: 200, status: 200, diff --git a/module/playlist_category_list.js b/module/playlist_category_list.js new file mode 100644 index 0000000..0c2c965 --- /dev/null +++ b/module/playlist_category_list.js @@ -0,0 +1,11 @@ +// 歌单分类列表 + +const createOption = require('../util/option.js') +module.exports = (query, request) => { + const data = { + cat: query.cat || '全部', + limit: query.limit || 24, + newStyle: true, + } + return request(`/api/playlist/category/list`, data, createOption(query)) +} diff --git a/module/playlist_catlist.js b/module/playlist_catlist.js index 0f48b25..409ecdb 100644 --- a/module/playlist_catlist.js +++ b/module/playlist_catlist.js @@ -2,5 +2,5 @@ const createOption = require('../util/option.js') module.exports = (query, request) => { - return request(`/api/playlist/catalogue`, {}, createOption(query, 'weapi')) + return request(`/api/playlist/catalogue`, {}, createOption(query, 'eapi')) } diff --git a/module/playlist_subscribe.js b/module/playlist_subscribe.js index 1349329..062027f 100644 --- a/module/playlist_subscribe.js +++ b/module/playlist_subscribe.js @@ -1,10 +1,14 @@ // 收藏与取消收藏歌单 - +const { APP_CONF } = require('../util/config.json') const createOption = require('../util/option.js') module.exports = (query, request) => { - query.t = query.t == 1 ? 'subscribe' : 'unsubscribe' + const path = query.t == 1 ? 'subscribe' : 'unsubscribe' const data = { id: query.id, + ...(query.t === 1 + ? { checkToken: query.checkToken || APP_CONF.checkToken } + : {}), } - return request(`/api/playlist/${query.t}`, data, createOption(query, 'weapi')) + query.checkToken = true // 强制开启checkToken + return request(`/api/playlist/${path}`, data, createOption(query, 'eapi')) } diff --git a/module/register_anonimous.js b/module/register_anonimous.js index ed9774c..48c773c 100644 --- a/module/register_anonimous.js +++ b/module/register_anonimous.js @@ -2,17 +2,13 @@ const CryptoJS = require('crypto-js') const path = require('path') const fs = require('fs') const ID_XOR_KEY_1 = '3go8&$8*3*3h0k(2)2' -const deviceidText = fs.readFileSync( - path.resolve(__dirname, '../data/deviceid.txt'), - 'utf-8', -) const createOption = require('../util/option.js') -const deviceidList = deviceidText.split('\n') +const { generateDeviceId } = require('../util/index') -function getRandomFromList(list) { - return list[Math.floor(Math.random() * list.length)] -} +// function getRandomFromList(list) { +// return list[Math.floor(Math.random() * list.length)] +// } function cloudmusic_dll_encode_id(some_id) { let xoredString = '' for (let i = 0; i < some_id.length; i++) { @@ -26,7 +22,8 @@ function cloudmusic_dll_encode_id(some_id) { } module.exports = async (query, request) => { - const deviceId = getRandomFromList(deviceidList) + const deviceId = generateDeviceId() + console.log(`[register_anonimous] deviceId: ${deviceId}`) global.deviceId = deviceId const encodedId = CryptoJS.enc.Base64.stringify( CryptoJS.enc.Utf8.parse( diff --git a/module/register_cellphone.js b/module/register_cellphone.js index 174b92a..967672c 100644 --- a/module/register_cellphone.js +++ b/module/register_cellphone.js @@ -9,6 +9,7 @@ module.exports = (query, request) => { password: CryptoJS.MD5(query.password).toString(), nickname: query.nickname, countrycode: query.countrycode || '86', + force: 'false', } - return request(`/api/register/cellphone`, data, createOption(query)) + return request(`/api/w/register/cellphone`, data, createOption(query)) } diff --git a/module/toplist_detail_v2.js b/module/toplist_detail_v2.js new file mode 100644 index 0000000..e947b7b --- /dev/null +++ b/module/toplist_detail_v2.js @@ -0,0 +1,6 @@ +// 所有榜单内容摘要v2 + +const createOption = require('../util/option.js') +module.exports = (query, request) => { + return request(`/api/toplist/detail/v2`, {}, createOption(query, 'weapi')) +} diff --git a/module/user_detail_new.js b/module/user_detail_new.js new file mode 100644 index 0000000..ff319c1 --- /dev/null +++ b/module/user_detail_new.js @@ -0,0 +1,20 @@ +// 用户详情 + +const createOption = require('../util/option.js') +module.exports = async (query, request) => { + const data = { + all: 'true', + userId: query.uid, + } + const res = await request( + `/api/w/v1/user/detail/${query.uid}`, + data, + createOption(query, 'eapi'), + ) + // const result = JSON.stringify(res).replace( + // /avatarImgId_str/g, + // "avatarImgIdStr" + // ); + // return JSON.parse(result); + return res +} diff --git a/package.json b/package.json index af26e46..bfed121 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@neteaseapireborn/api", - "version": "4.28.29", + "version": "4.29.0", "description": "为停更的网易云音乐 NodeJs API 提供持续的维护!", "scripts": { "start": "node app.js",