QQMusicApi icon indicating copy to clipboard operation
QQMusicApi copied to clipboard

关于搜索接口失效问题解决方案

Open EmilyEdna opened this issue 2 years ago • 3 comments

网页端接口搜索已经失效,并且网页端新接口不支持分页。 我通过抓取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 } } }

EmilyEdna avatar Jul 26 '22 07:07 EmilyEdna

search_type: 0:单曲 1:歌手 2:专辑 3:歌单 4:mv 7:歌词 8:用户

AffectionParadise avatar Jul 26 '22 11:07 AffectionParadise

我手动创建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;
  },
};

ccwant avatar Aug 11 '22 07:08 ccwant

我手动创建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搜索类型参数也不生效,始终返回歌曲数据

onceisy avatar Oct 28 '22 10:10 onceisy