perf: 新增接口, 修复登录问题

Co-Authored-By: binaryify <binaryify@gmail.com>
This commit is contained in:
ImFurina 2025-09-07 12:58:58 +08:00
parent 365450c26e
commit 4f4aa134d5
11 changed files with 70 additions and 19 deletions

View File

@ -4,6 +4,7 @@ const createOption = require('../util/option.js')
module.exports = (query, request) => { module.exports = (query, request) => {
const data = { const data = {
ctcode: query.ctcode || '86', ctcode: query.ctcode || '86',
secrete: 'music_middleuser_pclogin',
cellphone: query.phone, cellphone: query.phone,
} }
return request(`/api/sms/captcha/sent`, data, createOption(query, 'weapi')) return request(`/api/sms/captcha/sent`, data, createOption(query, 'weapi'))

View File

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

View File

@ -1,9 +1,20 @@
const QRCode = require('qrcode') const QRCode = require('qrcode')
const { generateChainId } = require('../util/index')
const createOption = require('../util/option.js') module.exports = (query) => {
module.exports = (query, request) => {
return new Promise(async (resolve) => { 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({ return resolve({
code: 200, code: 200,
status: 200, status: 200,

View File

@ -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))
}

View File

@ -2,5 +2,5 @@
const createOption = require('../util/option.js') const createOption = require('../util/option.js')
module.exports = (query, request) => { module.exports = (query, request) => {
return request(`/api/playlist/catalogue`, {}, createOption(query, 'weapi')) return request(`/api/playlist/catalogue`, {}, createOption(query, 'eapi'))
} }

View File

@ -1,10 +1,14 @@
// 收藏与取消收藏歌单 // 收藏与取消收藏歌单
const { APP_CONF } = require('../util/config.json')
const createOption = require('../util/option.js') const createOption = require('../util/option.js')
module.exports = (query, request) => { module.exports = (query, request) => {
query.t = query.t == 1 ? 'subscribe' : 'unsubscribe' const path = query.t == 1 ? 'subscribe' : 'unsubscribe'
const data = { const data = {
id: query.id, 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'))
} }

View File

@ -2,17 +2,13 @@ const CryptoJS = require('crypto-js')
const path = require('path') const path = require('path')
const fs = require('fs') const fs = require('fs')
const ID_XOR_KEY_1 = '3go8&$8*3*3h0k(2)2' 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 createOption = require('../util/option.js')
const deviceidList = deviceidText.split('\n') const { generateDeviceId } = require('../util/index')
function getRandomFromList(list) { // function getRandomFromList(list) {
return list[Math.floor(Math.random() * list.length)] // return list[Math.floor(Math.random() * list.length)]
} // }
function cloudmusic_dll_encode_id(some_id) { function cloudmusic_dll_encode_id(some_id) {
let xoredString = '' let xoredString = ''
for (let i = 0; i < some_id.length; i++) { 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) => { module.exports = async (query, request) => {
const deviceId = getRandomFromList(deviceidList) const deviceId = generateDeviceId()
console.log(`[register_anonimous] deviceId: ${deviceId}`)
global.deviceId = deviceId global.deviceId = deviceId
const encodedId = CryptoJS.enc.Base64.stringify( const encodedId = CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse( CryptoJS.enc.Utf8.parse(

View File

@ -9,6 +9,7 @@ module.exports = (query, request) => {
password: CryptoJS.MD5(query.password).toString(), password: CryptoJS.MD5(query.password).toString(),
nickname: query.nickname, nickname: query.nickname,
countrycode: query.countrycode || '86', countrycode: query.countrycode || '86',
force: 'false',
} }
return request(`/api/register/cellphone`, data, createOption(query)) return request(`/api/w/register/cellphone`, data, createOption(query))
} }

View File

@ -0,0 +1,6 @@
// 所有榜单内容摘要v2
const createOption = require('../util/option.js')
module.exports = (query, request) => {
return request(`/api/toplist/detail/v2`, {}, createOption(query, 'weapi'))
}

20
module/user_detail_new.js Normal file
View File

@ -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
}

View File

@ -1,6 +1,6 @@
{ {
"name": "@neteaseapireborn/api", "name": "@neteaseapireborn/api",
"version": "4.28.29", "version": "4.29.0",
"description": "为停更的网易云音乐 NodeJs API 提供持续的维护!", "description": "为停更的网易云音乐 NodeJs API 提供持续的维护!",
"scripts": { "scripts": {
"start": "node app.js", "start": "node app.js",