forked from TaroXin/WangyiyunAPI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
api.js
411 lines (323 loc) · 12.5 KB
/
api.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
/**
* 网易云 api 主文件入口
*/
// 初始化 express
var app = require('express')();
// 初始化 superagent 模块
var request = require('superagent');
// 加载 cheerio 模块
var cheerio = require('cheerio');
function checkId(id){
return /^[0-9]+$/.test(id);
}
// 网易云音乐推荐列表接口
app.get('/recommend_list', function(req, res){
// 定义请求 url
var requestUrl = 'http://music.163.com/discover';
// 初始化返回对象
var resObj = {
code: 200,
message: "加载成功",
data: []
};
// 使用 superagent 访问 discover 页面
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 请求成功
var dom = _response.text;
// 使用 cheerio 加载 dom
var $ = cheerio.load(dom);
// 定义我们要返回的数组
var recommendLst = [];
// 获得 .m-cvrlst 的 ul 元素
$('.m-cvrlst').eq(0).find('li').each(function(index, element){
// 获得 a 链接
var cvrLink = $(element).find('.u-cover').find('a');
// 获得 cover 歌单封面
var cover = $(element).find('.u-cover').find('img').attr('src');
// 组织单个推荐歌单对象结构
var recommendItem = {
id: cvrLink.attr('data-res-id'),
title: cvrLink.attr('title'),
href: 'http://music.163.com' + cvrLink.attr('href'),
type: cvrLink.attr('data-res-type'),
cover: cover
};
// 将单个对象放在数组中
recommendLst.push(recommendItem);
});
// 替换返回对象
resObj.data = recommendLst;
} else {
resObj.code = 404;
resObj.message = "获取API出现问题";
console.error('Get data error !');
}
// 响应数据
res.send( resObj );
});
});
// 网易云音乐根据歌单ID获得歌单详细列表的接口
app.get('/play_list/:playlistId', function(req, res){
// 获得歌单ID
var playlistId = req.params.playlistId;
// 定义请求 url
var requestUrl = 'http://music.163.com/playlist?id=' + playlistId;
// 定义返回对象
var resObj = {
code: 200,
message: "加载成功",
data: {}
};
if (checkId(playlistId)) {
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 定义歌单对象
var playlist = {
id: playlistId
};
// 成功返回 HTML, decodeEntities 指定不把中文字符转为 unicode 字符
// 如果不指定 decodeEntities 为 false , 例如 " 会解析为 "
var $ = cheerio.load(_response.text,{decodeEntities: false});
// 获得歌单 dom
var dom = $('#m-playlist');
// 歌单标题
playlist.title = dom.find('.tit').text();
// 歌单拥有者
playlist.owner = dom.find('.user').find('.name').text();
// 创建时间
playlist.create_time = dom.find('.user').find('.time').text();
// 歌单被收藏数量
playlist.collection_count = dom.find('#content-operation').find('.u-btni-fav').attr('data-count');
// 分享数量
playlist.share_count = dom.find('#content-operation').find('.u-btni-share').attr('data-count');
// 评论数量
playlist.comment_count = dom.find('#content-operation').find('#cnt_comment_count').html();
// 标签
playlist.tags = [];
dom.find('.tags').eq(0).find('.u-tag').each(function(index, element){
playlist.tags.push($(element).text());
});
// 歌单描述
playlist.desc = dom.find('#album-desc-more').html();
// 歌曲总数量
playlist.song_count = dom.find('#playlist-track-count').text();
// 播放总数量
playlist.play_count = dom.find('#play-count').text();
resObj.data = playlist;
} else {
resObj.code = 404 ;
resObj.message = "获取API出现问题";
console.error('Get data error!');
}
res.send( resObj );
});
} else {
resObj.code = 404 ;
resObj.message = "参数异常";
res.send( resObj );
}
});
// 网易云音乐根据歌单ID获得歌单所有歌曲的接口
app.get('/song_list/:playlistId', function(req, res){
// 获得歌单ID
var playlistId = req.params.playlistId;
// 定义请求 url
var requestUrl = 'http://music.163.com/playlist?id=' + playlistId;
// 定义返回对象
var resObj = {
code: 200,
message: "加载成功",
data: {}
};
if (checkId(playlistId)) {
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 成功返回 HTML
var $ = cheerio.load(_response.text,{decodeEntities: false});
// 获得歌单 dom
var dom = $('#m-playlist');
resObj.data = JSON.parse( dom.find('#song-list-pre-cache').find('textarea').html() );
} else {
resObj.code = 404 ;
resObj.message = "获取API出现问题";
console.error('Get data error!');
}
res.send( resObj );
});
} else {
resObj.code = 404 ;
resObj.message = "参数异常";
res.send( resObj );
}
});
// 获得网易云音乐主页banner
app.get('/banner_list', function(req, res){
var requestUrl = 'http://music.163.com/discover';
// 定义返回对象
var resObj = {
code: 200,
message: "加载成功",
data: {}
};
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 成功返回 HTML
var $ = cheerio.load(_response.text,{decodeEntities: false});
// 获得歌单 dom
var bannerScript = $('script').eq(2);
var bannerString = bannerScript.html().replace(/(^\s+)|(\s+$)/g,"").replace(/[\r\n]/g, "");
bannerString = bannerString.substr(bannerString.indexOf("["), bannerString.length - 2);
bannerString = eval(bannerString);
for (var i = 0; i < bannerString.length; i++) {
if (bannerString[i].url.indexOf("http") != 0) {
bannerString[i].url = "http://music.163.com" + bannerString[i].url;
}
}
resObj.data = bannerString;
} else {
resObj.code = 404 ;
resObj.message = "获取API出现问题";
console.error('Get data error!');
}
res.send( resObj );
});
});
// 获取网易云音乐排行榜
app.get('/top_list', function(req, res){
var requestUrl = 'http://music.163.com/discover/toplist';
// 定义返回对象
var resObj = {
code: 200,
message: "加载成功",
data: {}
};
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 成功返回 HTML
var $ = cheerio.load(_response.text,{decodeEntities: false});
// 定义返回对象
var topList = [];
var topListDom = $('#toplist').find('.n-minelst');
// 分析云音乐特色榜
var topListItem0 = {
title: topListDom.find('h2').eq(0).text(),
items: []
};
var topListItem0Ul = topListDom.find('ul').eq(0).find('li');
topListItem0Ul.each(function(index, element){
var item = {
cover: $(element).find('img').attr('src'),
name: $(element).find('.name').text(),
href: 'http://music.163.com' + $(element).find('.avatar').attr('href'),
update_time: $(element).find('.s-fc4').text()
};
topListItem0.items.push(item);
});
// 分析云音乐全球媒体榜
var topListItem1 = {
title: topListDom.find('h2').eq(1).text(),
items: []
};
var topListItem1Ul = topListDom.find('ul').eq(1).find('li');
topListItem1Ul.each(function(index, element){
var item = {
cover: $(element).find('img').attr('src'),
name: $(element).find('.name').text(),
href: 'http://music.163.com' + $(element).find('.avatar').attr('href'),
update_time: $(element).find('.s-fc4').text()
};
topListItem1.items.push(item);
});
topList.push(topListItem0);
topList.push(topListItem1);
// 获得歌单 dom
resObj.data = topList;
} else {
resObj.code = 404 ;
resObj.message = "获取API出现问题";
console.error('Get data error!');
}
res.send( resObj );
});
});
// 根据歌曲 ID 获取歌曲详细信息
app.get('/song/:songId', function(req, res){
// 获得歌曲ID
var songId = req.params.songId;
// 定义请求 url
var requestUrl = 'http://music.163.com/api/song/detail/?id=' + songId + '&ids=[' + songId + ']';
// 定义返回对象
var resObj = {
code: 200,
message: "加载成功",
data: {}
};
if (checkId(songId)) {
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 返回所有内容
resObj.data = JSON.parse(_response.text).songs;
} else {
resObj.code = 404 ;
resObj.message = "获取API出现问题";
console.error('Get data error!');
}
res.send( resObj );
});
} else {
resObj.code = 404 ;
resObj.message = "参数异常";
res.send( resObj );
}
});
// 根据歌曲ID获得歌曲歌词
app.get('/lrc/:songId', function(req, res){
// 获得歌曲ID
var songId = req.params.songId;
// 定义请求 url
var requestUrl = 'http://music.163.com/api/song/lyric?os=pc&id=' + songId + '&lv=-1&kv=-1&tv=-1';
// 定义返回对象
var resObj = {
code: 200,
message: "加载成功",
data: {}
};
if (checkId(songId)) {
request.get(requestUrl)
.end(function(err, _response){
if (!err) {
// 返回所有内容
var wyres = JSON.parse(_response.text);
if (wyres.code === 200) {
delete wyres.code;
resObj.data = wyres;
} else {
resObj.code = wyres.code;
resObj.message = "获取API出现问题";
}
} else {
resObj.code = 404 ;
resObj.message = "获取API出现问题";
console.error('Get data error!');
}
res.send( resObj );
});
} else {
resObj.code = 404 ;
resObj.message = "参数异常";
res.send( resObj );
}
});
var host = (process.env.VCAP_APP_HOST || 'localhost');
var port = (process.env.VCAP_APP_PORT || 3000);
var server = app.listen(port, host, function(){
var port = server.address().port;
console.log('WangyiyunAPI Server listening at http://' + host + ':' + port);
});