首先:
你需要使用后台代理的方式,越过跨域请求问题
然后:
后端在请求数据时,返回数据如下:(提示 referer不合法)
此时的 referer为 "referer": "https://c.y.qq.com"
无意中把 referer改为 "referer": "https://c.y.qq.com/",发现能正常请求并返回数据
后端代码如下: (出问题的是最后一个getDisc函数,下面为正常能请求的音乐api),后面会整理一篇音乐api的文章。
import base64
import json
import requests
from django.http import JsonResponse,HttpResponse
# 定义一个请求头
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
"referer": "https://c.y.qq.com/",
"host": "c.y.qq.com",
}
headers2 = {
"user-agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
"referer": "http://dl.stream.qqmusic.qq.com/",
"host": "dl.stream.qqmusic.qq.com"
}
# Create your views here.
def getSliderImg(request):
url = "https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg?g_tk=976692372&inCharset=utf-8&outCharset=utf-8¬ice=0&format=json&plarform=h5&uin=0&needNewCode=1"
res = requests.get(url, params=None, headers=headers)
return JsonResponse(json.loads(res.text), safe=False,json_dumps_params={'ensure_ascii':False})
# 获得歌手列表
def getSingerList(request):
url = "https://c.y.qq.com/v8/fcg-bin/v8.fcg?g_tk=976692372&inCharset=utf-8&outCharset=utf-8¬ice=0&format=json&channel=singer&page=list&key=all_all_all&pagesize=100&pagenum=1&hostUin=0&needNewCode=0&platform=yqq"
res = requests.get(url, params=None, headers=headers)
print('12313123123')
return JsonResponse(json.loads(res.text), safe=False,json_dumps_params={'ensure_ascii':False})
# 获得歌手所有歌曲列表
def getSingerDetail(request):
singerId = request.GET.get('singerId')
url = "https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg?g_tk=5381&inCharset=utf-8&outCharset=utf-8¬ice=0&format=json&hostUin=0&needNewCode=0&platform=yqq&order=listen&begin=0&num=100&songstatus=1&singermid=" + singerId
res = requests.get(url, params=None, headers=headers)
return JsonResponse(json.loads(res.text), safe=False,json_dumps_params={'ensure_ascii':False})
# 获得歌曲的音频文件,放在audio标签中可以直接播放
def getSong(request):
url = "http://dl.stream.qqmusic.qq.com/C400001Qu4I30eVFYb.m4a?vkey=9CE5CEEC332B5ABFCBB1CA09E971B9FE373307709CD462AC1CD78953D28F5E4B73778BD553D6444B173CC4464A6529D412FCB1F15982A631&guid=7175649092&uin=0&fromtag=66"
res = requests.get(url, params=None, headers=headers2)
return HttpResponse(res.content)
# 获取对应歌曲的歌词
def getLyric(request):
songId = request.GET.get('songId')
url = "https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg?g_tk=5381&uin=0&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=h5&needNewCode=1&nobase64=1&musicid={}&songtype=0&_=1577718325581".format(songId)
res = requests.get(url, params=None, headers=headers2)
return JsonResponse(json.loads(res.text[18:-1]), safe=False,json_dumps_params={'ensure_ascii':True})
# 根据给定的歌单 disstid 获取某个推荐歌单的歌曲列表,这里给了一个固定值,下面的url是获取多个歌单的,里面有content_id的键,这个也就是disstid
# https://u.y.qq.com/cgi-bin/musicu.fcg?g_tk=5381&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&data=%7B%22recomPlaylist%22%3A%7B%22method%22%3A%22get_hot_recommend%22%2C%22param%22%3A%7B%22async%22%3A1%2C%22cmd%22%3A2%7D%2C%22module%22%3A%22playlist.HotRecommendServer%22%7D%7D&&callback=__jp0
def getDisc(request):
# disstid = request.GET.get('disstid')
url = "https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&new_format=1&disstid=7372500022&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0"
res = requests.get(url, params=None, headers=headers)
print(res.text)
return JsonResponse(json.loads(res.text), safe=False, json_dumps_params={'ensure_ascii': False})