Files
abot/test/music.py
2026-01-26 15:07:28 +08:00

143 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
网易云音乐点歌工具 - 字段提取版
功能:搜索歌曲 → 获取第一首 → 调用 /Song_V1 → 提取点歌所需字段
"""
import requests
import json
from urllib.parse import unquote
BASE_URL = "http://192.168.2.240:5000"
def search_and_extract_song(keyword: str = "学不会", level: str = "standard"):
"""
完整流程:
1. 调用 /Search 搜索歌曲
2. 取第一首歌曲
3. 调用 /Song_V1 获取播放链接等详情
4. 提取你需要的字段
返回示例:
{
"song_name": "学不会",
"singer_name": "林俊杰",
"play_url": "http://m802.music.126.net/...",
"pic_url": "https://p2.music.126.net/...jpg",
"data_url": "http://m802.music.126.net/...", # 与 play_url 相同
"lyric": "...",
"song_id": "108134",
"album_name": "学不会"
}
"""
try:
# Step 1: 搜索歌曲
search_url = f"{BASE_URL}/Search"
params = {"keywords": keyword}
resp = requests.get(search_url, params=params, timeout=10)
resp.raise_for_status()
search_data = resp.json()
if not search_data.get("success") or search_data.get("status") != 200:
return {"error": f"搜索失败: {search_data.get('message')}"}
songs = search_data.get("data", [])
if not songs:
return {"error": "没有找到相关歌曲"}
first_song = songs[0]
song_id = str(first_song.get("id", ""))
# Step 2: 获取歌曲详细信息(关键)
detail_url = f"{BASE_URL}/Song_V1"
detail_params = {
"url": song_id,
"level": level, # standard / exhigh / lossless
"type": "json"
}
detail_resp = requests.get(detail_url, params=detail_params, timeout=15)
detail_resp.raise_for_status()
detail_data = detail_resp.json()
if not detail_data.get("success") or detail_data.get("status") != 200:
return {"error": f"获取歌曲详情失败: {detail_data.get('message')}"}
song_info = detail_data.get("data", {})
# Step 3: 提取你需要的字段
result = {
"song_name": song_info.get("name", first_song.get("name", "")),
"singer_name": song_info.get("ar_name", first_song.get("artist_string", first_song.get("artists", ""))),
"play_url": song_info.get("url", ""),
"pic_url": song_info.get("pic", first_song.get("picUrl", "")),
"data_url": song_info.get("url", ""), # 你要求与 play_url 相同
"lyric": song_info.get("lyric", ""),
"song_id": song_info.get("id", song_id),
"album_name": song_info.get("al_name", first_song.get("album", "")),
"size": song_info.get("size", "")
}
# 清理空值
for key in list(result.keys()):
if result[key] == "":
del result[key]
return result
except requests.exceptions.RequestException as e:
return {"error": f"网络请求失败: {str(e)}"}
except Exception as e:
return {"error": f"未知错误: {str(e)}"}
def print_song_info(result):
"""美化打印结果"""
if "error" in result:
print(f"{result['error']}")
return
print("\n" + "=" * 60)
print("🎵 点歌信息提取成功")
print("=" * 60)
print(f"歌曲名称 : {result.get('song_name', '未知')}")
print(f"演唱歌手 : {result.get('singer_name', '未知')}")
print(f"专辑名称 : {result.get('album_name', '未知')}")
print(f"歌曲ID : {result.get('song_id', '未知')}")
if result.get("size"):
print(f"文件大小 : {result.get('size')}")
print(f"\n▶️ 播放地址 (play_url):")
print(result.get("play_url", ""))
print(f"\n🖼️ 封面图片 (pic_url):")
print(result.get("pic_url", ""))
print(f"\n📁 数据地址 (data_url):")
print(result.get("data_url", ""))
if result.get("lyric"):
print(f"\n📝 歌词长度: {len(result['lyric'])} 字符")
print("歌词预览:")
print(result['lyric'][:300] + "..." if len(result['lyric']) > 300 else result['lyric'])
# ====================== 主函数 ======================
if __name__ == "__main__":
print("网易云音乐点歌字段提取工具")
print("输入歌曲名称(回车使用默认“学不会”):")
keyword = input().strip()
if not keyword:
keyword = "学不会"
print(f"\n正在搜索: {keyword} ...\n")
result = search_and_extract_song(keyword=keyword, level="standard")
print_song_info(result)
# 如果你想直接得到字典用于你的点歌工具
# print("\n返回给点歌工具的字典")
# print(json.dumps(result, ensure_ascii=False, indent=2))