#!/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))