通过QQ音乐接口获取数据+可用播放源

5,136 阅读2分钟
原文链接: zhuanlan.zhihu.com

最近正在学习做一个web移动音乐播放器,因为不想做数据库存放数据,所以就学着在QQ音乐的接口获取一些数据

出现其他数据正常,但是无法播放的朋友可以试试这个

昨天找到两个有用的播放源,希望可以给志同道合的朋友一些帮助

这里是使用的songmid 
url: `http://isure.stream.qqmusic.qq.com/C100${musicData.songmid}.m4a?fromtag=32`        
url: `http://thirdparty.gtimg.com/C100${musicData.songmid}.m4a?fromtag=38`

获取歌单数据:

url: c.y.qq.com/splcloud/fc…

//songList.js
export function getDiscList() {
    const url = '/api/getDiscList'
    const data = Object.assign({}, commonParams, {
        platform: 'yqq',
        hostUin: 0,
        sin: 0,
        ein: 29,
        sortId: 5,
        needNewCode: 0,
        categoryId: 10000000,
        rnd: Math.random(),
        format: 'json'
    })

    return axios.get(url, {
        params: data
    }).then((res) => {
        return Promise.resolve(res.data)
    })
}

webpack.dev.conf.js
// 通过axios代理获取
/**
* 通过axios,从真实的QQ音乐的地址发送一个http请求,同时修改一个headers,正确响应,
* 并将内容返回到前端界面
* @param  {[type]}   req     [require]
* @param  {String}   res    [response]
* @param  {Function} params: req.query  [参数]
* @return {[type]}           [description]
*/
apiRoutes.get('/api/getDiscList', function(req, res) {
     var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
     axios.get(url, {
         headers: {
             referer: 'https://c.y.qq.com/',
             host: 'c.y.qq.com'
         },
         params: req.query
     }).then((response) => {
        // 将数据返回给前端
         res.json(response.data)
     }).catch((e) => {
        console.log(e)
     })
})

获取轮播图数据:

url: c.y.qq.com/musichall/f…

export function getRecommend() {
    const url = 'https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg'
    const data = Object.assign({}, commonParams, {
        platform: 'h5',
        uin: 0,
        needNewCode: 1
    })
    return jsonp(url, data, options)
}

获取歌词数据:

url: c.y.qq.com/lyric/fcgi-…

export function getDiscList() {
    const url = '/api/getDiscList'
    const data = Object.assign({}, commonParams, {
        platform: 'yqq',
        hostUin: 0,
        sin: 0,
        ein: 29,
        sortId: 5,
        needNewCode: 0,
        categoryId: 10000000,
        rnd: Math.random(),
        format: 'jsonp'
    })

    return axios.get(url, {
        params: data
    }).then((res) => {
        return Promise.resolve(res.data)
    })
}
// webpack.dev.conf.js
apiRoutes.get('/api/lyric', function(req, res) {
   var url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg'
   axios.get(url, {
         headers: {
            referer: 'https://c.y.qq.com',
            host: 'c.y.qq.com'
        },
        params: req.query
   }).then((response) => {
         var ret = response.data
         if (typeof ret === 'string') {
             var reg = /^\w+\(({[^()]+})\)$/
             var matches = ret.match(reg)
                 if (matches) {
                    ret = JSON.parse(matches[1])
                 }
        }
        res.json(ret)
   }).catch((e) => {
         console.log(e)
  })
})

获取歌手信息:

url: szc.y.qq.com/v8/fcg-bin/…

export function getSingerList() {
    const url = 'https://c.y.qq.com/v8/fcg-bin/v8.fcg'
    const data = Object.assign({}, commonParams, {
        channel: 'singer',
        page: 'list',
        key: 'all_all_all',
        pagesize: 100,
        pagenum: 1,
        hostUin: 0,
        needNewCode: 0,
        platform: 'yqq',
        g_tk: 2001751543
    })
    return jsonp(url, data, options)
}

获取歌曲详情:

url: c.y.qq.com/v8/fcg-bin/…

export function getSingerDetail(singerId) {
    const url = 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg'

    const data = Object.assign({}, commonParams, {
        hostUin: 0,
        needNewCode: 0,
        order: 'listen',
        platform: 'h5page',
        begin: 0,
        num: 100,
        songstatus: 1,
        singermid: singerId,
        g_tk: 2001751543
    })
    return jsonp(url, data, options)
}

获取排行榜数据(抓取移动端):

url: c.y.qq.com/v8/fcg-bin/…

获取歌单歌曲列表:

url: c.y.qq.com/qzone/fcg-b…

获取榜单详情(移动端):

url: c.y.qq.com/v8/fcg-bin/…