通过歌曲名获取QQ音乐原文+翻译歌词

搜索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: 歌曲ID
  • format: 固定为json
  • g_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格式

上一篇 PNG/JPG在线转换WebP:原理、实现与前端源码详解
下一篇 Open Claw爆火?AI跟风焦虑?我们该做什么?
丙氨酸

丙氨酸管理员

与其等春来 不如追花去

本月创作热力图

AeroCore图片
文章目录