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

最新QQAPI接口[QQ 音乐API koa2全接口实现](https://blog.youkuaiyun.com/ZC_XY/article/details/90813351)

Github - program-learning-lists

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

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

获取歌单数据:

url: https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg

//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
<think>我们正在开发一个类似QQ音乐的ReactNative应用,需要获取音乐数据。根据引用[3]中的示例,我们可以通过模拟QQ音乐接口获取数据。但是需要注意,直接使用QQ音乐接口可能存在法律风险,并且接口参数(如guid)会变化,需要自行抓取更新。###合法获取音乐数据的途径1.**使用官方开放平台API**(推荐):-QQ音乐开放平台(需申请,可能有条件限制)-网易云音乐API(开项目,如[NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi))-其他合法授权的音乐API(如Audius)2.**自建音乐数据**(适用于用户上传内容):-存储用户上传的音频文件(需注意版权)-使用免费音乐库(如FreeMusicArchive)3.**第三方聚合API**(需谨慎选择):-一些第三方服务提供音乐元数据(如Last.fm、MusicBrainz),但不提供音频文件-音频文件需通过合法途径获取(如购买、授权)###参考引用[3]的模拟接口方法引用[3]展示了一个通过模拟QQ音乐接口获取音频URL的例子。我们可以通过类似方式获取数据,但需要注意以下几点:-**接口稳定性**:非官方接口可能随时失效-**参数动态性**:如`guid`、`g_tk`等参数需要动态生成或抓取更新-**法律风险**:未经授权使用接口可能侵权####示例代码(基于引用[3]):```javascript//在api/music.js中定义获取音乐URL的方法importaxiosfrom'axios';constcommonParams={//公共参数};exportfunctiongetMusic(songmid){consturl='/api/music';constdata=Object.assign({},commonParams,{songmid:songmid,filename:`C400${songmid}.m4a`,guid:7981028948,//需要定期更新,可通过抓包获取platform:'yqq',loginUin:0,hostUin:0,needNewCode:0,cid:205361747,uid:0,g_tk:1928111839//需要动态生成});returnaxios.get(url,{params:data}).then(res=>{returnres.data;});}```###动态生成g_tk的方法QQ音乐接口的`g_tk`参数是通过一个特定的算法生成的,我们可以通过JavaScript实现:```javascriptfunctiongetGTK(str){lethash=5381;for(leti=0,len=str.length;i<len;++i){hash+=(hash<<5)+str.charCodeAt(i);}returnhash&0x7fffffff;}//使用示例:g_tk=getGTK(someKey)```###替代方案:使用开音乐API1.**网易云音乐API**(Node.js服务):-部署自己的服务,然后ReactNative应用调用-示例:`https://your-domain.com/song/url?id=歌曲ID`2.**AudiusAPI**(去中心化音乐平台):-官方API文档:https://audiusproject.github.io/api-docs/-获取歌曲示例:```javascriptfetch('https://api.audius.co/tracks?query=hello').then(response=>response.json()).then(data=>console.log(data));```###注意事项-**版权问题**:确保使用的数据有合法授权,避免法律风险-**接口频率限制**:合理控制请求频率,避免被封禁-**数据缓存**:对频繁请求的数据进行本地缓存,减少服务器压力###实现步骤建议1.**选择数据**:根据项目需求和法律合规性选择2.**封装API模块**:统一管理音乐数据请求3.**错误处理**:处理网络错误和接口变化4.**测试**:在不同网络环境下测试接口稳定性###相关问题1.如何动态更新QQ音乐接口的`guid`和`g_tk`参数?2.使用网易云音乐API如何解决音频文件URL有效期问题?3.AudiusAPI是否支持中文歌曲搜索?4.如何缓存音乐数据以提升应用性能?</think>### React Native开发QQ音乐类应用的音乐数据获取方案 作为个人开发者,获取合法且稳定的音乐数据是实现类似QQ音乐应用的关键挑战。以下是几种可行的技术方案: --- ### 一、合法数据获取途径(推荐方案) 1. **使用官方开放平台API** ```javascript // 示例:调用QQ音乐开放平台API const getSongUrl = async (songId) => { const response = await fetch( `https://api.qq.com/song/url?id=${songId}&format=json`, { headers: { 'Authorization': `Bearer ${yourAccessToken}` } } ); return response.json(); }; ``` - **优势**:合法合规,数据稳定 - **注册方式**:访问[QQ音乐开放平台](https://open.y.qq.com/)申请开发者账号 - **限制**:需审核,有调用频率限制 2. **开音乐API项目** ```javascript // 使用NeteaseCloudMusicApi(网易云音乐API) import axios from 'axios'; const getMusicData = (songId) => { return axios.get(`https://your-server-domain.com/song/url?id=${songId}`); }; ``` - **推荐项目**: - [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)(Node.js实现) - [QQ音乐API收集](https://github.com/jsososo/QQMusicApi) - **部署方式**:自建服务器部署API服务 3. **去中心化音乐平台** ```javascript // 使用Audius API示例 const searchAudius = async (keyword) => { const response = await fetch( `https://discoveryprovider.audius.co/v1/tracks/search?query=${keyword}` ); return response.json(); }; ``` - **平台选择**: - [Audius](https://audius.org/)(开音乐流媒体) - [Resonate](https://resonate.is/)(合作社模式) --- ### 二、技术实现关键点(参考引用[3]) #### 1. 接口参数处理 ```javascript // 参考引用[3]的请求参数结构 const commonParams = { platform: 'yqq', loginUin: 0, hostUin: 0, needNewCode: 0, cid: 205361747, uid: 0, g_tk: getGTK() // 动态生成 }; function getGTK() { // 实现GTK生成算法(参考引用[3]) return 1928111839; } export const fetchSongUrl = (songmid) => { const params = { ...commonParams, songmid, filename: `C400${songmid}.m4a`, guid: generateGuid() // 需动态生成 }; return axios.get('/api/music', { params }); }; ``` #### 2. 动态参数生成策略 | 参数 | 生成方式 | 更新频率 | |---------|----------------------------|-------------| | `guid` | 设备ID/MAC地址哈希 | 首次安装时 | | `g_tk` | Cookie加密算法[^3] | 每次请求 | | `cid` | 固定值+随机偏移 | 每周更新 | --- ### 三、数据缓存与优化 1. **本地数据缓存** ```javascript // 使用react-native-mmkv缓存 import { MMKV } from 'react-native-mmkv'; const storage = new MMKV(); // 存储歌曲数据 storage.set(`song_${songId}`, JSON.stringify(songData)); // 读取缓存 const cachedData = storage.getString(`song_${songId}`); ``` 2. **CDN加速策略** ```mermaid graph LR A[客户端] --> B{本地缓存} B -->|命中| C[直接播放] B -->|未命中| D[CDN边缘节点] D -->|有缓存| E[返回音频] D -->|无缓存| F[服务器] ``` --- ### 四、法律风险规避 1. **合规方案** - 仅获取**30秒试听片段**(符合合理使用原则) - 提供**外部播放链接**(跳转到官方APP/网页) - 用户**自主上传内容**模式(需审核机制) 2. **侵权规避** - 避免直接存储音频文件 - 声明"数据来于网络" - 提供侵权投诉渠道 --- ### 五、替代数据方案 | 方案类型 | 实现难度 | 法律风险 | 数据质量 | |---------------|---------|---------|---------| | 官方API | ★★★☆☆ | 低 | 高 | | 自建爬虫 | ★★★★☆ | 高 | 中 | | 第三方聚合API | ★★☆☆☆ | 中 | 不稳定 | | 用户生成内容 | ★★★★★ | 低 | 参差不齐 | --- ### 六、推荐实施步骤 1. **开发阶段**:使用Mock数据 + 本地音频文件 2. **测试阶段**:部署自建API服务(NeteaseCloudMusicApi) 3. **上架阶段**:接入官方API或Audius开放平台 4. **增长阶段**:申请QQ音乐/网易云音乐合作伙伴计划 > **动态guid生成示例**(参考引用[3]): > ```javascript > function generateGuid() { > return Math.floor(1e9 * Math.random()) + 1e9; > } > // 使用:guid: generateGuid() > ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值