搜索API
这一步主要是通过歌曲名获取到歌曲的id以及标识符
搜索接口 https://u.y.qq.com/cgi-bin/musicu.fcg
请求头设置
Host: u.y.qq.com
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
请求参数
该接口接收JSON格式的POST数据,主要参数如下:
{
"comm": {
"ct": "19",
"cv": "1873",
"uin": "0"
},
"music.search.SearchCgiService": {
"method": "DoSearchForQQMusicDesktop",
"module": "music.search.SearchCgiService",
"param": {
"grp": 1,
"num_per_page": 40,
"page_num": 1,
"query": "歌手 - 歌曲名",
"search_type": 0
}
}
}
其中
music.search.SearchCgiService.param.query 填写歌曲名 推荐前面加上歌手以实现更精确的匹配
代码示例
import requests
import json
def search_song(keyword, page=1, page_size=40):
url = "https://u.y.qq.com/cgi-bin/musicu.fcg"
# 请求头
headers = {
"Host": "u.y.qq.com",
"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
"Content-Type": "application/json"
}
# POST 的 JSON 数据
payload = {
"comm": {
"ct": "19",
"cv": "1873",
"uin": "0"
},
"music.search.SearchCgiService": {
"method": "DoSearchForQQMusicDesktop",
"module": "music.search.SearchCgiService",
"param": {
"grp": 1,
"num_per_page": page_size,
"page_num": page,
"query": keyword,
"search_type": 0
}
}
}
# 发送 POST 请求
response = requests.post(
url,
headers=headers,
data=json.dumps(payload)
)
# 返回 JSON 结果
return response.json()
返回的格式如下:
{
"music.search.SearchCgiService": {
"data": {
"body": {
"song": {
"list": [
{
"name": "歌曲名",
"mid": "歌曲MID",
"id": "歌曲ID",
"singer": [
{
"name": "歌手名"
}
],
"album": {
"name": "专辑名"
}
}
]
}
}
}
}
}
我们需要使用的是歌曲 MID 以及歌曲 ID
示例提取:
first_song = (
result["music.search.SearchCgiService"]
["data"]
["body"]
["song"]
["list"][0]
)
song_mid = first_song["mid"]
song_id = first_song["id"]
print("歌曲 MID:", song_mid)
print("歌曲 ID :", song_id)
取原文加歌词
我们需要使用上一步获取到的 MID 和 ID 来获取原文以及歌词
歌词接口 https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg
请求头设置
Origin: https://y.qq.com
Referer: https://y.qq.com/n/ryqq/player
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36
该接口接收GET请求 参数如下
请求参数:
songmid: 歌曲的MID标识符musicid: 歌曲IDformat: 固定为jsong_tk: 固定为5381
songmid填写上一步获取到的MID;musicid填写上一步获取到的歌曲ID
代码示例
def get_lyric(song_mid, song_id):
url = "https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg"
# GET 请求参数
params = {
"songmid": song_mid,
"musicid": song_id,
"format": "json",
"g_tk": "5381"
}
# 请求头
headers = {
"Origin": "https://y.qq.com",
"Referer": "https://y.qq.com/n/ryqq/player",
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/102.0.5005.63 Safari/537.36"
)
}
response = requests.get(url, params=params, headers=headers)
data = response.json()
返回如以下格式:
{
"lyric": "Base64编码的歌词内容",
"trans": "Base64编码的翻译歌词内容(可能为空)"
}
该格式十分整洁 只需要获取lyric并解码Base64即可得到原文+时间戳 标准lrc格式
按需提取trans作为翻译+时间戳 同样是标准lrc格式