@neteasecloudmusicapienhanced/api 4.29.20 → 4.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.MD +46 -16
- package/interface.d.ts +2 -0
- package/module/musician_vip_tasks.js +11 -0
- package/package.json +15 -15
- package/public/api.html +115 -49
- package/public/audio_match_demo/afp.js +2 -3
- package/public/audio_match_demo/index.html +213 -44
- package/public/avatar_update.html +296 -43
- package/public/cloud.html +148 -41
- package/public/docs/home.md +8 -0
- package/public/docs/index.html +3 -3
- package/public/eapi_decrypt.html +176 -26
- package/public/home.html +1 -2
- package/public/index.html +18 -18
- package/public/listen_together_host.html +305 -77
- package/public/login.html +190 -18
- package/public/playlist_cover_update.html +278 -31
- package/public/playlist_import.html +381 -226
- package/public/qrlogin-nocookie.html +170 -43
- package/public/qrlogin.html +170 -42
- package/public/unblock_test.html +95 -35
- package/public/voice_upload.html +257 -59
- package/server.js +1 -1
- package/util/client-sign.js +3 -3
package/public/eapi_decrypt.html
CHANGED
|
@@ -1,37 +1,181 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="
|
|
3
|
-
|
|
2
|
+
<html lang="zh">
|
|
4
3
|
<head>
|
|
5
4
|
<meta charset="UTF-8">
|
|
6
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
6
|
<title>eapi 参数和返回内容解析</title>
|
|
8
|
-
<
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
body {
|
|
15
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
background: #f5f5f5;
|
|
18
|
+
padding: 20px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.container {
|
|
22
|
+
max-width: 900px;
|
|
23
|
+
margin: 0 auto;
|
|
24
|
+
background: white;
|
|
25
|
+
border-radius: 12px;
|
|
26
|
+
padding: 32px;
|
|
27
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
h1 {
|
|
31
|
+
font-size: 24px;
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
color: #333;
|
|
34
|
+
margin-bottom: 24px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.form-group {
|
|
38
|
+
margin-bottom: 24px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
label {
|
|
42
|
+
display: block;
|
|
43
|
+
font-size: 14px;
|
|
44
|
+
font-weight: 500;
|
|
45
|
+
color: #555;
|
|
46
|
+
margin-bottom: 8px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
textarea {
|
|
50
|
+
width: 100%;
|
|
51
|
+
padding: 12px;
|
|
52
|
+
border: 1px solid #ddd;
|
|
53
|
+
border-radius: 6px;
|
|
54
|
+
font-family: 'Courier New', monospace;
|
|
55
|
+
font-size: 13px;
|
|
56
|
+
resize: vertical;
|
|
57
|
+
min-height: 200px;
|
|
58
|
+
outline: none;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
textarea:focus {
|
|
62
|
+
border-color: #333;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.radio-group {
|
|
66
|
+
display: flex;
|
|
67
|
+
gap: 24px;
|
|
68
|
+
margin-bottom: 24px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.radio-item {
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
gap: 8px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.radio-item input[type="radio"] {
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.radio-item label {
|
|
82
|
+
margin: 0;
|
|
83
|
+
cursor: pointer;
|
|
84
|
+
font-size: 14px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
button {
|
|
88
|
+
background: #333;
|
|
89
|
+
color: white;
|
|
90
|
+
padding: 12px 28px;
|
|
91
|
+
border: none;
|
|
92
|
+
border-radius: 6px;
|
|
93
|
+
font-size: 15px;
|
|
94
|
+
font-weight: 500;
|
|
95
|
+
cursor: pointer;
|
|
96
|
+
transition: background 0.2s ease;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
button:hover {
|
|
100
|
+
background: #555;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.result-section {
|
|
104
|
+
margin-top: 24px;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.result-section label {
|
|
108
|
+
margin-bottom: 12px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.decode-result {
|
|
112
|
+
white-space: pre-wrap;
|
|
113
|
+
word-break: break-all;
|
|
114
|
+
background: #f9f9f9;
|
|
115
|
+
padding: 16px;
|
|
116
|
+
border-radius: 6px;
|
|
117
|
+
border: 1px solid #eee;
|
|
118
|
+
min-height: 200px;
|
|
119
|
+
max-height: 400px;
|
|
120
|
+
overflow: auto;
|
|
121
|
+
font-family: 'Courier New', monospace;
|
|
122
|
+
font-size: 13px;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.example-section {
|
|
126
|
+
margin-top: 32px;
|
|
127
|
+
padding-top: 24px;
|
|
128
|
+
border-top: 1px solid #eee;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.example-section h2 {
|
|
132
|
+
font-size: 18px;
|
|
133
|
+
font-weight: 600;
|
|
134
|
+
color: #333;
|
|
135
|
+
margin-bottom: 16px;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.example-section img {
|
|
139
|
+
max-width: 100%;
|
|
140
|
+
height: auto;
|
|
141
|
+
border-radius: 6px;
|
|
142
|
+
margin-bottom: 16px;
|
|
143
|
+
border: 1px solid #eee;
|
|
144
|
+
}
|
|
145
|
+
</style>
|
|
9
146
|
</head>
|
|
10
147
|
|
|
11
148
|
<body>
|
|
12
|
-
<div id="app" class="
|
|
13
|
-
<h1
|
|
14
|
-
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<div class="mt-3">
|
|
19
|
-
<input type="radio" id="format" name="format" v-model="isReq" value="true">
|
|
20
|
-
<label for="format" class="ml-2">请求数据request params(针对请求数据的 params)</label>
|
|
21
|
-
<input type="radio" id="noFormat" name="format" v-model="isReq" value="false" class="ml-5">
|
|
22
|
-
<label for="noFormat" class="ml-2">返回数据 response 二进制数据(针对返回内容解析)</label>
|
|
149
|
+
<div id="app" class="container">
|
|
150
|
+
<h1>eapi 参数和返回内容解析</h1>
|
|
151
|
+
|
|
152
|
+
<div class="form-group">
|
|
153
|
+
<label for="hexString">十六进制字符串</label>
|
|
154
|
+
<textarea id="hexString" v-model="hexString" rows="10"></textarea>
|
|
23
155
|
</div>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<
|
|
27
|
-
|
|
156
|
+
|
|
157
|
+
<div class="radio-group">
|
|
158
|
+
<div class="radio-item">
|
|
159
|
+
<input type="radio" id="req" name="format" v-model="isReq" value="true">
|
|
160
|
+
<label for="req">请求数据 request params</label>
|
|
161
|
+
</div>
|
|
162
|
+
<div class="radio-item">
|
|
163
|
+
<input type="radio" id="resp" name="format" v-model="isReq" value="false">
|
|
164
|
+
<label for="resp">返回数据 response 二进制数据</label>
|
|
165
|
+
</div>
|
|
28
166
|
</div>
|
|
29
167
|
|
|
168
|
+
<button @click="decrypt">解密</button>
|
|
169
|
+
|
|
170
|
+
<div class="result-section">
|
|
171
|
+
<label>解密结果:</label>
|
|
172
|
+
<pre class="decode-result">{{ formatResult(result) }}</pre>
|
|
173
|
+
</div>
|
|
30
174
|
|
|
31
|
-
<div>
|
|
32
|
-
<
|
|
33
|
-
<img src="/static/eapi_params.png" />
|
|
34
|
-
<img src="/static/eapi_response.png" />
|
|
175
|
+
<div class="example-section">
|
|
176
|
+
<h2>使用示例</h2>
|
|
177
|
+
<img src="/static/eapi_params.png" alt="请求示例" />
|
|
178
|
+
<img src="/static/eapi_response.png" alt="响应示例" />
|
|
35
179
|
</div>
|
|
36
180
|
</div>
|
|
37
181
|
|
|
@@ -39,7 +183,6 @@
|
|
|
39
183
|
<script src="https://fastly.jsdelivr.net/npm/vue@3"></script>
|
|
40
184
|
|
|
41
185
|
<script>
|
|
42
|
-
const logger = require('../util/logger.js')
|
|
43
186
|
const app = Vue.createApp({
|
|
44
187
|
data() {
|
|
45
188
|
return {
|
|
@@ -52,6 +195,13 @@
|
|
|
52
195
|
this.decrypt()
|
|
53
196
|
},
|
|
54
197
|
methods: {
|
|
198
|
+
formatResult(result) {
|
|
199
|
+
try {
|
|
200
|
+
return JSON.stringify(JSON.parse(result), null, 2)
|
|
201
|
+
} catch (e) {
|
|
202
|
+
return result
|
|
203
|
+
}
|
|
204
|
+
},
|
|
55
205
|
async decrypt() {
|
|
56
206
|
try {
|
|
57
207
|
const res = await axios({
|
|
@@ -62,10 +212,10 @@
|
|
|
62
212
|
}
|
|
63
213
|
})
|
|
64
214
|
this.result = JSON.stringify(res.data.data)
|
|
65
|
-
|
|
215
|
+
console.log(res.data);
|
|
66
216
|
} catch (error) {
|
|
67
217
|
console.error(error)
|
|
68
|
-
alert(error?.response?.data?.message || '
|
|
218
|
+
alert(error?.response?.data?.message || '解密失败,数据格式错误')
|
|
69
219
|
}
|
|
70
220
|
}
|
|
71
221
|
}
|
|
@@ -74,4 +224,4 @@
|
|
|
74
224
|
</script>
|
|
75
225
|
</body>
|
|
76
226
|
|
|
77
|
-
</html>
|
|
227
|
+
</html>
|
package/public/home.html
CHANGED
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
</div>
|
|
13
13
|
<script src="https://fastly.jsdelivr.net/npm/axios@0.26.1/dist/axios.min.js"></script>
|
|
14
14
|
<script>
|
|
15
|
-
const logger = require('../util/logger.js')
|
|
16
15
|
async function main() {
|
|
17
16
|
const res = await axios({
|
|
18
17
|
url: `/homepage/block/page`,
|
|
@@ -22,7 +21,7 @@
|
|
|
22
21
|
method: 'post',
|
|
23
22
|
})
|
|
24
23
|
let cursor = ''
|
|
25
|
-
|
|
24
|
+
console.info(res.data.data)
|
|
26
25
|
if (res.data.data.hasMore) {
|
|
27
26
|
cursor = res.data.data.cursor
|
|
28
27
|
const res2 = await axios({
|
package/public/index.html
CHANGED
|
@@ -7,33 +7,33 @@
|
|
|
7
7
|
<title>网易云音乐 API Enhanced</title>
|
|
8
8
|
<style>
|
|
9
9
|
:root {
|
|
10
|
-
--fg: #
|
|
11
|
-
--muted: #
|
|
12
|
-
--border: #
|
|
13
|
-
--bg: #
|
|
14
|
-
--panel: #
|
|
15
|
-
--accent: #
|
|
10
|
+
--fg: #333;
|
|
11
|
+
--muted: #666;
|
|
12
|
+
--border: #ddd;
|
|
13
|
+
--bg: #f5f5f5;
|
|
14
|
+
--panel: #ffffff;
|
|
15
|
+
--accent: #333;
|
|
16
16
|
}
|
|
17
17
|
* { box-sizing: border-box; }
|
|
18
18
|
html, body { height: 100%; }
|
|
19
|
-
body { margin: 0; font-family:
|
|
19
|
+
body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--fg); background: var(--bg); line-height: 1.6; }
|
|
20
20
|
.container { max-width: 960px; margin: 40px auto; padding: 0 20px; }
|
|
21
21
|
header.site-header { margin-bottom: 24px; }
|
|
22
|
-
header.site-header h1 { font-size: 28px; font-weight:
|
|
23
|
-
.badge { display: inline-block; margin-left: 8px; padding:
|
|
24
|
-
.sub { margin-top:
|
|
25
|
-
.block { background: var(--panel); border: 1px solid var(--border); border-radius:
|
|
26
|
-
.block h2 { margin: 0 0
|
|
22
|
+
header.site-header h1 { font-size: 28px; font-weight: 600; margin: 0; }
|
|
23
|
+
.badge { display: inline-block; margin-left: 8px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 12px; font-size: 12px; color: var(--muted); }
|
|
24
|
+
.sub { margin-top: 8px; color: var(--muted); font-size: 14px; }
|
|
25
|
+
.block { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 20px; margin-bottom: 16px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); }
|
|
26
|
+
.block h2 { margin: 0 0 12px; font-size: 18px; font-weight: 600; }
|
|
27
27
|
.kvs { display: grid; grid-template-columns: 140px 1fr; gap: 8px 16px; align-items: center; }
|
|
28
28
|
.kvs div:first-child { color: var(--muted); }
|
|
29
29
|
ul.links { list-style: none; padding: 0; margin: 0; }
|
|
30
|
-
ul.links li { margin:
|
|
31
|
-
ul.links a { color: var(--fg); text-decoration: none; border-bottom: 1px dotted var(--border); }
|
|
30
|
+
ul.links li { margin: 8px 0; }
|
|
31
|
+
ul.links a { color: var(--fg); text-decoration: none; border-bottom: 1px dotted var(--border); transition: all 0.2s ease; }
|
|
32
32
|
ul.links a:hover { color: var(--accent); border-bottom-color: var(--accent); }
|
|
33
|
-
pre { margin: 0; background: #
|
|
34
|
-
code { font-family:
|
|
35
|
-
footer.site-footer { margin-top: 24px; padding-top: 12px; border-top: 1px solid var(--border); color: var(--muted); }
|
|
36
|
-
footer.site-footer a { color: var(--fg); text-decoration: none; }
|
|
33
|
+
pre { margin: 0; background: #f9f9f9; border: 1px solid var(--border); border-radius: 6px; padding: 12px; overflow: auto; }
|
|
34
|
+
code { font-family: 'Courier New', monospace; font-size: 13px; }
|
|
35
|
+
footer.site-footer { margin-top: 24px; padding-top: 12px; border-top: 1px solid var(--border); color: var(--muted); text-align: center; }
|
|
36
|
+
footer.site-footer a { color: var(--fg); text-decoration: none; transition: color 0.2s ease; }
|
|
37
37
|
footer.site-footer a:hover { color: var(--accent); }
|
|
38
38
|
</style>
|
|
39
39
|
</head>
|