feat: 游客登录机制完善

This commit is contained in:
binaryify 2024-04-30 15:14:32 +08:00
parent eb92cef0b2
commit 780f30f0b1
15 changed files with 24693 additions and 20 deletions

View File

@ -1,6 +1,10 @@
# 更新日志 # 更新日志
### 4.17.0 | 2024.04.29 ### 4.18.0 | 2024.04.30
# song/url 参数问题修复 - 补充游客 deviceid,防止都指向相同账户,避免网络拥堵提示问题
- ip 设置问题修复
### 4.17.1 | 2024.04.29
- song/url 参数问题修复
### 4.17.0 | 2024.04.29 ### 4.17.0 | 2024.04.29
- ua 更新 - ua 更新

24641
data/deviceid.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,11 @@
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const { register_anonimous } = require('./main') const { register_anonimous } = require('./main')
const { cookieToJson } = require('./util/index') const { cookieToJson, generateRandomChineseIP } = require('./util/index')
const tmpPath = require('os').tmpdir() const tmpPath = require('os').tmpdir()
async function generateConfig() { async function generateConfig() {
global.cnIp = generateRandomChineseIP()
try { try {
const res = await register_anonimous() const res = await register_anonimous()
const cookie = res.body.cookie const cookie = res.body.cookie

View File

@ -1,7 +1,17 @@
const CryptoJS = require('crypto-js') 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 ID_XOR_KEY_1 = '3go8&$833h0k(2)2' const deviceidList = deviceidText.split('\n')
function getRandomFromList(list) {
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++) {
@ -16,7 +26,8 @@ function cloudmusic_dll_encode_id(some_id) {
module.exports = async (query, request) => { module.exports = async (query, request) => {
query.cookie.os = 'iOS' query.cookie.os = 'iOS'
const deviceId = `NMUSIC` const deviceId = getRandomFromList(deviceidList)
global.deviceId = deviceId
const encodedId = CryptoJS.enc.Base64.stringify( const encodedId = CryptoJS.enc.Base64.stringify(
CryptoJS.enc.Utf8.parse( CryptoJS.enc.Utf8.parse(
`${deviceId} ${cloudmusic_dll_encode_id(deviceId)}`, `${deviceId} ${cloudmusic_dll_encode_id(deviceId)}`,

View File

@ -1,5 +1,4 @@
// 相似歌手 // 相似歌手
const config = require('../util/config.json')
module.exports = (query, request) => { module.exports = (query, request) => {
const data = { const data = {
artistid: query.id, artistid: query.id,

View File

@ -1,6 +1,6 @@
{ {
"name": "NeteaseCloudMusicApi", "name": "NeteaseCloudMusicApi",
"version": "4.17.1", "version": "4.18.0",
"description": "网易云音乐 NodeJS 版 API", "description": "网易云音乐 NodeJS 版 API",
"scripts": { "scripts": {
"start": "node app.js", "start": "node app.js",

View File

@ -227,6 +227,9 @@ async function consturctServer(moduleDefs) {
if (ip.substr(0, 7) == '::ffff:') { if (ip.substr(0, 7) == '::ffff:') {
ip = ip.substr(7) ip = ip.substr(7)
} }
if (ip == '::1') {
ip = global.cnIp
}
// console.log(ip) // console.log(ip)
obj[3] = { obj[3] = {
...obj[3], ...obj[3],

View File

@ -8,6 +8,8 @@ if (!fs.existsSync(path.resolve(tmpPath, 'anonymous_token'))) {
} }
const serverMod = require('./server') const serverMod = require('./server')
before(async () => { before(async () => {
const generateConfig = require('./generateConfig')
await generateConfig()
app = await serverMod.serveNcmApi({}) app = await serverMod.serveNcmApi({})
if (app.server && app.server.address) { if (app.server && app.server.address) {

View File

@ -1,12 +1,11 @@
const assert = require('assert') const assert = require('assert')
const { default: axios } = require('axios') const { default: axios } = require('axios')
const host = global.host || 'http://localhost:3000' const host = global.host || 'http://localhost:3000'
const config = require('../util/config.json')
describe('测试获取歌手专辑列表是否正常', () => { describe('测试获取歌手专辑列表是否正常', () => {
it('数据的 code 应该为200', (done) => { it('数据的 code 应该为200', (done) => {
const qs = { const qs = {
id: 32311, id: 32311,
realIP: '116.25.146.177', realIP: global.cnIp,
} }
axios axios

View File

@ -1,12 +1,11 @@
const assert = require('assert') const assert = require('assert')
const { default: axios } = require('axios') const { default: axios } = require('axios')
const host = global.host || 'http://localhost:3000' const host = global.host || 'http://localhost:3000'
const config = require('../util/config.json')
describe('测试获取评论是否正常', () => { describe('测试获取评论是否正常', () => {
it('数据的 code 应该为200', (done) => { it('数据的 code 应该为200', (done) => {
const qs = { const qs = {
id: 32311, id: 32311,
realIP: '116.25.146.177', realIP: global.cnIp,
} }
axios axios

View File

@ -1,12 +1,11 @@
const assert = require('assert') const assert = require('assert')
const { default: axios } = require('axios') const { default: axios } = require('axios')
const host = global.host || 'http://localhost:3000' const host = global.host || 'http://localhost:3000'
const config = require('../util/config.json')
describe('测试获取歌词是否正常', () => { describe('测试获取歌词是否正常', () => {
it('数据应该有 lrc 字段', (done) => { it('数据应该有 lrc 字段', (done) => {
const qs = { const qs = {
id: 347230, id: 347230,
realIP: '116.25.146.177', realIP: global.cnIp,
} }
axios axios

View File

@ -1,13 +1,12 @@
const assert = require('assert') const assert = require('assert')
const { default: axios } = require('axios') const { default: axios } = require('axios')
const host = global.host || 'http://localhost:3000' const host = global.host || 'http://localhost:3000'
const config = require('../util/config.json')
describe('测试获取歌曲是否正常', () => { describe('测试获取歌曲是否正常', () => {
it('歌曲的 url 不应该为空', (done) => { it('歌曲的 url 不应该为空', (done) => {
const qs = { const qs = {
id: 464315036, id: 464315036,
br: 999000, br: 999000,
realIP: '116.25.146.177', realIP: global.cnIp,
} }
axios axios

View File

@ -1,13 +1,12 @@
const assert = require('assert') const assert = require('assert')
const { default: axios } = require('axios') const { default: axios } = require('axios')
const host = global.host || 'http://localhost:3000' const host = global.host || 'http://localhost:3000'
const config = require('../util/config.json')
describe('测试搜索是否正常', () => { describe('测试搜索是否正常', () => {
it('获取到的数据的 name 应该和搜索关键词一致', (done) => { it('获取到的数据的 name 应该和搜索关键词一致', (done) => {
const qs = { const qs = {
keywords: '海阔天空', keywords: '海阔天空',
type: 1, type: 1,
realIP: '116.25.146.177', realIP: global.cnIp,
} }
axios axios
.get(`${host}/search`, { .get(`${host}/search`, {

View File

@ -29,4 +29,21 @@ module.exports = {
) )
return random return random
}, },
generateRandomChineseIP() {
const chinaIPPrefixes = ['116.25', '116.76', '116.77', '116.78']
const randomPrefix =
chinaIPPrefixes[Math.floor(Math.random() * chinaIPPrefixes.length)]
return `${randomPrefix}.${generateIPSegment()}.${generateIPSegment()}}`
},
}
// 生成一个随机整数
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
}
// 生成一个随机IP地址段
function generateIPSegment() {
return getRandomInt(1, 255)
} }

View File

@ -105,7 +105,7 @@ const createRequest = (method, url, data = {}, options) => {
const csrfToken = cookie['__csrf'] || '' const csrfToken = cookie['__csrf'] || ''
const header = { const header = {
osver: cookie.osver || '17.4.1', //系统版本 osver: cookie.osver || '17.4.1', //系统版本
deviceId: cookie.deviceId || '', //encrypt.base64.encode(imei + '\t02:00:00:00:00:00\t5106025eb79a5247\t70ffbaac7') deviceId: cookie.deviceId || global.deviceId,
appver: cookie.appver || iosAppVersion, // app版本 appver: cookie.appver || iosAppVersion, // app版本
versioncode: cookie.versioncode || '140', //版本号 versioncode: cookie.versioncode || '140', //版本号
mobilename: cookie.mobilename || '', //设备model mobilename: cookie.mobilename || '', //设备model
@ -113,7 +113,7 @@ const createRequest = (method, url, data = {}, options) => {
resolution: cookie.resolution || '1920x1080', //设备分辨率 resolution: cookie.resolution || '1920x1080', //设备分辨率
__csrf: csrfToken, __csrf: csrfToken,
os: cookie.os || 'ios', os: cookie.os || 'ios',
channel: cookie.channel, channel: cookie.channel || '',
requestId: `${Date.now()}_${Math.floor(Math.random() * 1000) requestId: `${Date.now()}_${Math.floor(Math.random() * 1000)
.toString() .toString()
.padStart(4, '0')}`, .padStart(4, '0')}`,