网易云api
搜索:
http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=(输入音乐名称)&type=1&offset=0&total=true&limit=20
limit:返回数据条数(每页获取的数量),默认为20,可以自行更改
offset:偏移量(翻页),offset需要是limit的倍数
type:搜索的类型
type=1 单曲
type=10 专辑
type=100 歌手
type=1000 歌单
type=1002 用户
type=1004 MV
type=1006 歌词
type=1009 主播电台
评论
http://music.163.com/api/v1/resource/comments/R_SO_4_{歌曲ID}?limit=20&offset=0
歌单
https://music.163.com/api/playlist/detail?id={歌单ID}
用户信息
https://music.163.com/api/v1/user/detail/{用户ID}
歌词
https://music.163.com/api/song/lyric?id={歌曲ID}&lv=1&kv=1&tv=-1
歌手专辑
http://music.163.com/api/artist/albums/{歌手ID}?id={歌手ID}&offset=0&total=true&limit=10
专辑信息
http://music.163.com/api/album/{专辑ID}?ext=true&id={专辑ID}&offset=0&total=true&limit=10
歌曲信息
http://music.163.com/api/song/detail/?id={歌曲ID}&ids=%5B{歌曲ID}%5D
MV
http://music.163.com/api/mv/detail?id={MV的ID}&type=mp4
首先需要在QT项目的.pro文件里加入network模块:QT +=network
一、请求:
QNetworkAccessManager* manager;
创建网络访问管理器 。
void MainWindow::on_pushButton_Searching_clicked()
{
if(ui->textEdit_Searchtext->toPlainText()==""){
return;
}
QNetworkRequest r;
QString s = ui->textEdit_Searchtext->toPlainText();
QString str = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={"+s+"}&type=1&offset=0&total=true&limit=4";
r.setUrl(str);
manager->get(r);
}
这里s是搜索的关键词。
QNetworkRequest保存通过网络发送请求所需的信息。
使用QNetworkAccessManager发送get请求。
二、解析返回的信息
首先在QNetworkAccessManager的get()完成后,会触发finished信号
将其与解析函数链接,这样一旦完成请求就会立即触发解析函数。
connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(databack(QNetworkReply *)));
void MainWindow::databack(QNetworkReply *reply){
//读取所有信息
searchInfo=reply->readAll();
//错误信息
QJsonParseError err;
//将返回的文本信息转换为json文档对象
QJsonDocument json_recv = QJsonDocument::fromJson(searchInfo,&err);
//判断是否符合语法
if(err.error != QJsonParseError::NoError){
qDebug() <<"格式错误"<< err.errorString();
return;
}
QJsonObject totalObject = json_recv.object();
// 列出json里所有的key
QStringList keys = totalObject.keys();
//如果keys包含"result"
if(keys.contains("result")){
//就将带 result 的内容提取后转换为对象
QJsonObject resultObject = totalObject["result"].toObject();
//保存result所有key
QStringList resultKeys = resultObject.keys();
//如果key为songs
if(resultKeys.contains("songs")){
QJsonArray array = resultObject["songs"].toArray();
//获取歌曲中的信息
for(auto i : array){
QJsonObject object = i.toObject();
musicId = object["id"].toInt(); // 音乐id
musicDuration = object["duration"].toInt(); // 音乐长度
musicName = object["name"].toString(); // 音乐名
mvId = object["mvid"].toInt(); // mvid
QStringList artistsKeys = object.keys();
if(artistsKeys.contains("artists")){
QJsonArray artistsArray = object["artists"].toArray();
for(auto j : artistsArray){
QJsonObject object2 = j.toObject();
singerName = object2["name"].toString(); // 歌手名
}
}
//包含专辑
if(artistsKeys.contains("album")){
QJsonObject albumObjct = object["album"].toObject();
albumName = albumObjct["name"].toString(); // 专辑名
}
//音乐的url地址
QString Musicurl =
QString("https://music.163.com/song/media/outer/url?id=%0").arg(musicId);
MusicList.append(Musicurl);
MusicDurationList.append(musicDuration);
ui->listWidget_Musiclist->addItem(QString::number(musicId)+
" 音乐名:"+musicName+
" 歌手名:"+singerName+
" 总时长:"+QString::number(musicDuration)+
" 专辑名:"+albumName);
}
}
}
}
如果我们以:"http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={
杀死那个石家庄人}&type=1&offset=0&total=true&limit=1" 执行请求。
会得到文本信息:
"{\"result\":{\"songs\":[{\"id\":386844,\"name\":\"\xE6\x9D\x80\xE6\xAD\xBB\xE9\x82\xA3\xE4\xB8\xAA\xE7\x9F\xB3\xE5\xAE\xB6\xE5\xBA\x84\xE4\xBA\xBA\",\"artists\":[{\"id\":13223,\"name\":\"\xE4\xB8\x87\xE8\x83\xBD\xE9\x9D\x92\xE5\xB9\xB4\xE6\x97\x85\xE5\xBA\x97\",\"picUrl\":null,\"alias\":[],\"albumSize\":0,\"picId\":0,\"fansGroup\":null,\"img1v1Url\":\"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg\",\"img1v1\":0,\"trans\":null}],\"album\":{\"id\":38306,\"name\":\"\xE4\xB8\x87\xE8\x83\xBD\xE9\x9D\x92\xE5\xB9\xB4\xE6\x97\x85\xE5\xBA\x97 \xE5\x90\x8C\xE5\x90\x8D\xE4\xB8\x93\xE8\xBE\x91\",\"artist\":{\"id\":0,\"name\":\"\",\"picUrl\":null,\"alias\":[],\"albumSize\":0,\"picId\":0,\"fansGroup\":null,\"img1v1Url\":\"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg\",\"img1v1\":0,\"trans\":null},\"publishTime\":1289491200000,\"size\":8,\"copyrightId\":-1,\"status\":1,\"picId\":108851651165850,\"mark\":0},\"duration\":344253,\"copyrightId\":0,\"status\":0,\"alias\":[],\"rtype\":0,\"ftype\":0,\"mvid\":384356,\"fee\":8,\"rUrl\":null,\"mark\":17179877376}],\"songCount\":300},\"code\":200}"
转换为json对象后:
QJsonObject({"code":200,"result":{"songCount":300,"songs":[{"album":{"artist":{"albumSize":0,"alias":[],"fansGroup":null,"id":0,"img1v1":0,"img1v1Url":"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"","picId":0,"picUrl":null,"trans":null},"copyrightId":-1,"id":38306,"mark":0,"name":"万能青年旅店 同名专辑","picId":108851651165850,"publishTime":1289491200000,"size":8,"status":1},"alias":[],"artists":[{"albumSize":0,"alias":[],"fansGroup":null,"id":13223,"img1v1":0,"img1v1Url":"http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"万能青年旅店","picId":0,"picUrl":null,"trans":null}],"copyrightId":0,"duration":344253,"fee":8,"ftype":0,"id":386844,"mark":17179877376,"mvid":384356,"name":"杀死那个石家庄人","rUrl":null,"rtype":0,"status":0}]}})
其中"code" "result" 就是是其中的keys
(在 json 文本中 ,{}里面是QJsonObject对象, []里面是QJsonArray)
我们需要的是result,便将result中所有的内容提取出来。
得到:
QJsonObject({"songCount":300,"songs":[{"album":{"artist":{"albumSize":0,"alias":[],"fansGroup":null,"id":0,"img1v1":0,"img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"","picId":0,"picUrl":null,"trans":null},"copyrightId":-1,"id":38306,"mark":0,"name":"万能青年旅店 同名专辑","picId":108851651165850,"publishTime":1289491200000,"size":8,"status":1},"alias":[],"artists":[{"albumSize":0,"alias":[],"fansGroup":null,"id":13223,"img1v1":0,"img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","name":"万能青年旅店","picId":0,"picUrl":null,"trans":null}],"copyrightId":0,"duration":344253,"fee":8,"ftype":0,"id":386844,"mark":17179877376,"mvid":384356,"name":"杀死那个石家庄人","rUrl":null,"rtype":0,"status":0}]})
其中"songCount" "songs"就是result中的keys。
而在result中,我们需要的所有歌曲信息就在"songs"里。
注意[]里面使用QJsonArray存储。
"songs"里可能包含了多个搜索结果的音乐,这时候需要遍历,逐一处理。
最后是播放,使用QT的multimedia模块以url播放
QString Musicurl =QString("https://music.163.com/song/media/outer/url?id=%0").arg(musicId);
需要用到"songs"里的"id"。