QQMusicApi
QQMusicApi copied to clipboard
关于搜索接口失效问题解决方案
网页端接口搜索已经失效,并且网页端新接口不支持分页。
我通过抓取PC端,已经得到新的查询接口,作者有空了可以合并一下。
Post https://u.y.qq.com/cgi-bin/musicu.fcg
参数 都是必传参 0表示单曲
{
"music.search.SearchCgiService": {
"method": "DoSearchForQQMusicDesktop",
"module": "music.search.SearchCgiService",
"param": {
"num_per_page": 40,
"page_num": 1,
"query": "关键字",
"search_type": 0
}
}
}
返回参数如下格式
{
"code": 0,
"ts": 1658817542772,
"start_ts": 1658817542471,
"traceid": "32fc9be500f60f7f",
"music.search.SearchCgiService": {
"code": 0,
"data": {
"body": {
"album": {
"list": []
},
"gedantip": {
"tab": 0,
"tip": ""
},
"mv": {
"list": []
},
"qc": [],
"singer": {
"list": []
},
"song": {
"list": [{
"act": 3,
"action": {
"alert": 2,
"icon2": 0,
"icons": 8527740,
"msgdown": 0,
"msgfav": 0,
"msgid": 14,
"msgpay": 6,
"msgshare": 0,
"switch": 16889603,
"switch2": 0
},
"album": {
"id": 16949818,
"mid": "001MyK3Y47zLur",
"name": "一路生花",
"pmid": "001MyK3Y47zLur_2",
"subtitle": "",
"time_public": "",
"title": "一路生花"
},
"bpm": 0,
"content": "",
"desc": "",
"desc_hilight": "",
"docid": "1695769931182733885",
"eq": 0,
"es": "",
"file": {
"b_30s": 0,
"e_30s": 0,
"hires_bitdepth": 0,
"hires_sample": 0,
"media_mid": "001y6GqB07XIjq",
"size_128mp3": 4101213,
"size_192aac": 6210094,
"size_192ogg": 5762396,
"size_24aac": 0,
"size_320mp3": 10252736,
"size_360ra": [],
"size_48aac": 1567732,
"size_96aac": 3163265,
"size_96ogg": 2879468,
"size_ape": 0,
"size_dolby": 0,
"size_dts": 0,
"size_flac": 28321807,
"size_hires": 0,
"size_try": 0,
"try_begin": 0,
"try_end": 0,
"url": ""
},
"fnote": 4009,
"genre": 0,
"grp": [],
"hotness": {
"desc": "",
"icon_url": "",
"jump_type": 0,
"jump_url": ""
},
"href3": "",
"id": 294095266,
"index_album": 1,
"index_cd": 0,
"interval": 256,
"isonly": 0,
"ksong": {
"id": 16082835,
"mid": "002MUs7K19WbJV"
},
"label": "0",
"language": 0,
"lyric": "",
"lyric_hilight": "",
"mid": "004AxmlM3YihD2",
"mv": {
"id": 1906658,
"name": "",
"title": "",
"vid": "n0041y2al9o",
"vt": 0
},
"name": "一路生花",
"newStatus": 2,
"ov": 0,
"pay": {
"pay_down": 1,
"pay_month": 1,
"pay_play": 0,
"pay_status": 0,
"price_album": 0,
"price_track": 200,
"time_free": 0
},
"protect": 11,
"sa": 2048,
"singer": [{
"id": 1387449,
"mid": "003k64X11As4qX",
"name": "温奕心",
"pmid": "",
"title": "温奕心",
"type": 1,
"uin": 0
}],
"status": 0,
"subtitle": "",
"tag": 11,
"tid": 0,
"time_public": "20210119",
"title": "一路生花",
"title_hilight": "一路生花",
"type": 0,
"url": "",
"version": 0,
"volume": {
"gain": 8.35,
"lra": 9.622,
"peak": 0.984
},
"vs": [
"",
"",
""
]
}]
},
"songlist": {
"list": []
},
"user": {
"list": []
},
"zhida": {
"list": [{
"album_list": {
"items": []
},
"custom_info": {
"extra_desc": "129人关注",
"icon_type": "1",
"ifpicurl": "https://y.qq.com/music/common/upload/t_user_profile/4064592.png",
"is_follow": "0",
"mid": "003zxmMH1rHkdW",
"parent_ids": "7086165",
"ticket": "0",
"tribe": "0"
},
"desciption": "歌曲:1 ",
"docid": "1:7086165",
"id": "7086165",
"jumpurl": "",
"mid": "",
"pic": "http://y.gtimg.cn/music/photo_new/T001R150x150M000003zxmMH1rHkdW_2.jpg",
"publish_date": "",
"title": "+1",
"track_list": {
"items": []
},
"type": 1,
"vid": "",
"video_type": 0
}]
}
},
"code": 0,
"meta": {
"cid": "",
"curpage": 1,
"dir": "L",
"display_order": [],
"ein": 1,
"estimate_sum": 17571940,
"expid": "11725008,11837001,11900001,1366006,1546001,1604001,1619001,1625001,1808001,2013001,2066002,2287001,2483003,2628001,2646002,2712001,2975004,3070001,3071001",
"is_filter": 0,
"next_page_start": {},
"nextpage": 2,
"perpage": 1,
"query": "1",
"result_trustworthy": 1,
"ret": 0,
"searchid": "",
"sid": "",
"sin": 0,
"sum": 1044,
"tab_list": [
100,
0,
4,
3,
2,
1,
15,
101,
7,
8
],
"uid": "",
"v": 0
},
"ver": 0
}
}
}
search_type: 0:单曲 1:歌手 2:专辑 3:歌单 4:mv 7:歌词 8:用户
我手动创建search.js并把它放到routes中,并兼容之前的参数,比较粗糙,但可用
export default {
// 搜索
"/": async ({ req, res, request, cache }) => {
let {
pageNo = 1,
pageSize = 20,
key,
t = 0, // 0:单曲,2:歌单,7:歌词,8:专辑,9:歌手,12:mv
raw,
} = req.query;
let total = 0;
if (!key) {
return res.send({
result: 500,
errMsg: "关键词不能为空",
});
}
const cacheKey = `search_${key}_${pageNo}_${pageSize}_${t}`;
const cacheData = cache.get(cacheKey);
if (cacheData) {
res && res.send(cacheData);
return cacheData;
}
const url = "https://u.y.qq.com/cgi-bin/musicu.fcg";
// 0:单曲
// 1:歌手
// 2:专辑
// 3:歌单
// 4:mv
// 7:歌词
// 8:用户
let data: any = {
"music.search.SearchCgiService": {
method: "DoSearchForQQMusicDesktop",
module: "music.search.SearchCgiService",
param: {
num_per_page: pageSize,
page_num: pageNo,
query: key,
search_type: t,
},
},
};
const result = await request({
url,
method: "post",
data,
headers: {
Referer: "https://y.qq.com",
},
});
if (Number(raw)) {
return res.send(result);
}
console.log("结果", result);
// 下面是数据格式的美化
const { keyword, sum, perpage, curpage } =
result["music.search.SearchCgiService"].data.meta;
const searchResult: any =
result["music.search.SearchCgiService"].data.body.song.list || [];
// (keyMap[t] ? result.data[keyMap[t]] : result.data) || [];
const list = searchResult.map((item) => ({
singer: item.singer, // 、
name: item.title,
songid: item.id,
songmid: item.mid,
songname: item.title,
albumid: item.album.id,
albummid: item.album.mid,
albumname: item.album.name,
interval: item.interval,
strMediaMid: item.file.media_mid,
size128: item.file.size_128mp3,
size320: item.file.size_320mp3,
sizeape: item.file.size_ape,
sizeflac: item.file.size_flac,
}));
pageNo = curpage;
pageSize = perpage;
total = sum;
const resData = {
result: 100,
data: {
list,
pageNo,
pageSize,
total,
key: keyword || key,
t,
},
// header: req.header(),
// req: JSON.parse(JSON.stringify(req)),
};
cache.set(cacheKey, resData, 120);
res.send && res.send(resData);
return resData;
},
};
我手动创建search.js并把它放到routes中,并兼容之前的参数,比较粗糙,但可用
export default { // 搜索 "/": async ({ req, res, request, cache }) => { let { pageNo = 1, pageSize = 20, key, t = 0, // 0:单曲,2:歌单,7:歌词,8:专辑,9:歌手,12:mv raw, } = req.query; let total = 0; if (!key) { return res.send({ result: 500, errMsg: "关键词不能为空", }); } const cacheKey = `search_${key}_${pageNo}_${pageSize}_${t}`; const cacheData = cache.get(cacheKey); if (cacheData) { res && res.send(cacheData); return cacheData; } const url = "https://u.y.qq.com/cgi-bin/musicu.fcg"; // 0:单曲 // 1:歌手 // 2:专辑 // 3:歌单 // 4:mv // 7:歌词 // 8:用户 let data: any = { "music.search.SearchCgiService": { method: "DoSearchForQQMusicDesktop", module: "music.search.SearchCgiService", param: { num_per_page: pageSize, page_num: pageNo, query: key, search_type: t, }, }, }; const result = await request({ url, method: "post", data, headers: { Referer: "https://y.qq.com", }, }); if (Number(raw)) { return res.send(result); } console.log("结果", result); // 下面是数据格式的美化 const { keyword, sum, perpage, curpage } = result["music.search.SearchCgiService"].data.meta; const searchResult: any = result["music.search.SearchCgiService"].data.body.song.list || []; // (keyMap[t] ? result.data[keyMap[t]] : result.data) || []; const list = searchResult.map((item) => ({ singer: item.singer, // 、 name: item.title, songid: item.id, songmid: item.mid, songname: item.title, albumid: item.album.id, albummid: item.album.mid, albumname: item.album.name, interval: item.interval, strMediaMid: item.file.media_mid, size128: item.file.size_128mp3, size320: item.file.size_320mp3, sizeape: item.file.size_ape, sizeflac: item.file.size_flac, })); pageNo = curpage; pageSize = perpage; total = sum; const resData = { result: 100, data: { list, pageNo, pageSize, total, key: keyword || key, t, }, // header: req.header(), // req: JSON.parse(JSON.stringify(req)), }; cache.set(cacheKey, resData, 120); res.send && res.send(resData); return resData; }, };
分页参数不生效,t搜索类型参数也不生效,始终返回歌曲数据