下列代码无法下载mp3音乐,请高手指点!
下列代码无法下载mp3音乐,请高手指点!万分感谢!!!(由于是新手,不喜勿喷,全当路过。)
主要是 def get_kuwo_music(self):部分
import os
import tkinter as tk
from tkinter import ttk, messagebox as mes_box
import webbrowser
import PySimpleGUI as Sg
import requests
from retrying import retry
class SetUI:
def __init__(self, weight=1000, height=600):
self.ui_weight = weight
self.ui_height = height
self.title = "好课优选·音乐破解软件"
self.ui_root = tk.Tk(className=self.title)
self.ui_url = tk.StringVar()
self.ui_var = tk.IntVar()
self.ui_var.set(1)
self.show_result = None
self.song_num = None
self.response_data = None
self.song_url = None
self.song_name = None
self.song_author = None
def set_ui(self):
"""构建界面"""
frame_1 = tk.Frame(self.ui_root)
frame_2 = tk.Frame(self.ui_root)
frame_3 = tk.Frame(self.ui_root)
frame_4 = tk.Frame(self.ui_root)
# 菜单
ui_menu = tk.Menu(self.ui_root)
self.ui_root.config(menu=ui_menu)
file_menu = tk.Menu(ui_menu, tearoff=0)
ui_menu.add_cascade(label='菜单', menu=file_menu)
file_menu.add_command(label='使用说明', command=lambda: webbrowser.open('https://www.baidu.com'))
file_menu.add_command(label='关于作者', command=lambda: webbrowser.open('https://www.baidu.com'))
file_menu.add_command(label='退出', command=self.ui_root.quit)
# 控件内容设置
choice_passageway = tk.Label(frame_1, text='请选择音乐搜索通道:', padx=10, pady=10)
passageway_button_1 = tk.Radiobutton(frame_1, text='酷我', variable=self.ui_var, value=1, width=10, height=3)
passageway_button_2 = tk.Radiobutton(frame_1, text='网易云', variable=self.ui_var, value=2, width=10, height=3)
passageway_button_3 = tk.Radiobutton(frame_1, text='QQ音乐', variable=self.ui_var, value=3, width=10, height=3)
passageway_button_4 = tk.Radiobutton(frame_1, text='酷狗', variable=self.ui_var, value=4, width=10, height=3)
input_link = tk.Label(frame_2, text='请输入歌曲名或歌手:')
entry_style = tk.Entry(frame_2, textvariable=self.ui_url, highlightcolor='Fuchsia', highlightthickness=1, width=35)
label2 = tk.Label(frame_2, text="")
play_button = tk.Button(frame_2, text='搜索', font=('楷体', 11), fg='Purple', width=2, height=1, command=self.get_kuwo_music)
label3 = tk.Label(frame_2, text="")
# 表格样式
columns = ("序号", "歌手", "歌曲", "专辑")
self.show_result = ttk.Treeview(frame_3, height=20, show="headings", columns=columns)
# 下载
download_button = tk.Button(frame_4, text='下载', font=('楷体', 11), fg='Purple', width=6, height=1, padx=5, pady=5, command=self.download_music)
# 控件布局
frame_1.pack()
frame_2.pack()
frame_3.pack()
frame_4.pack()
choice_passageway.grid(row=0, column=0)
passageway_button_1.grid(row=0, column=1)
passageway_button_2.grid(row=0, column=2)
passageway_button_3.grid(row=0, column=3)
passageway_button_4.grid(row=0, column=4)
input_link.grid(row=0, column=0)
entry_style.grid(row=0, column=1)
label2.grid(row=0, column=2)
play_button.grid(row=0, column=3, ipadx=10, ipady=10)
label3.grid(row=0, column=4)
self.show_result.grid(row=0, column=4)
download_button.grid(row=0, column=5)
# 设置表头
self.show_result.heading("序号", text="序号")
self.show_result.heading("歌手", text="歌手")
self.show_result.heading("歌曲", text="歌曲")
self.show_result.heading("专辑", text="专辑")
# 设置列
self.show_result.column("序号", width=100, anchor='center')
self.show_result.column("歌手", width=200, anchor='center')
self.show_result.column("歌曲", width=200, anchor='center')
self.show_result.column("专辑", width=300, anchor='center')
# 鼠标点击
self.show_result.bind('<ButtonRelease-1>', self.get_song_url)
@retry(stop_max_attempt_number=5)
def get_kuwo_music(self):
"""搜索酷我音乐(仅实现酷我,其他通道可自行扩展)"""
# 清空treeview表格数据
for item in self.show_result.get_children():
self.show_result.delete(item)
headers = {
'accept': 'application/json,text/plain,*/*',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'Connection': 'keep-alive',
'csrf': 'HH3GHIQ0RYM',
#'Referer': 'http://www.',
'Referer':'http://www.',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',
#'cookie': '_ga=GA1.2.150251374.1775911325; _gid=GA1.2.1036068870.1775911325; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1775962810,1775963266,1775978949,1775980328; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1775980328; HMACCOUNT=6C051FAE07DABF5F; _ga_ETPBRPM9ML=GS2.2.s1775978949$o3$g1$t1775980346$j42$l0$h0; Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324=YWBKP6wM6b7cC5mMeES6riryNfCbDiZR'
'cookie':'_ga=GA1.2.150251374.1775911325; _gid=GA1.2.1036068870.1775911325; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1775978949,1775980328,1775999664,1776082346; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1776082346; HMACCOUNT=6C051FAE07DABF5F; _gat=1; Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324=c7CpPeX8w6k236NXNfD5nQWeWpDYNjGF; _ga_ETPBRPM9ML=GS2.2.s1776082346$o5$g1$t1776082378$j28$l0$h0'
}
search_input = self.ui_url.get()
if len(search_input) > 0:
search_url = 'http://www.'
search_data = {
'key': search_input,
'pn': '1',
'rn': '80',
'httpsStatus': '1',
'reqid': '858597c1-b18c-11ec-83e4-9d53d2ff08ff'
}
try:
resp = requests.get(search_url, params=search_data, headers=headers, timeout=20)
self.response_data = resp.json()
if 'data' not in self.response_data:
mes_box.showerror(title='错误', message='API返回异常,缺少data字段,请稍后重试。\n' + str(self.response_data))
return
data_obj = self.response_data['data']
if 'list' not in data_obj:
mes_box.showerror(title='错误', message='搜索结果格式错误,缺少list字段。\n' + str(data_obj))
return
total = data_obj.get('total', 0)
if int(total) <= 0:
mes_box.showerror(title='错误', message='搜索:{} 不存在。'.format(search_input))
return
songs_data = data_obj['list']
for i in range(len(songs_data)):
song_name = songs_data[i].get('name', '未知歌曲')
artist = songs_data[i].get('artist', '未知歌手')
album = songs_data[i].get('album', '未知专辑')
self.show_result.insert('', i, values=(i + 1, artist, song_name, album))
except requests.exceptions.Timeout:
mes_box.showerror(title='错误', message='搜索超时,请重新输入后再搜索!')
except Exception as e:
mes_box.showerror(title='错误', message=f'搜索失败:{str(e)}')
else:
mes_box.showerror(title='错误', message='未输入要查询的歌曲或歌手,请输入后搜索!')
def get_song_url(self, event):
"""获取下载歌曲的地址"""
for item in self.show_result.selection():
item_text = self.show_result.item(item, "values")
self.song_num = int(item_text[0])
if self.song_num is not None:
# 同样需要安全访问 response_data
if self.response_data is None or 'data' not in self.response_data:
mes_box.showerror(title='错误', message='未获取到搜索结果,请先搜索!')
return
songs_data = self.response_data['data'].get('list')
if not songs_data:
mes_box.showerror(title='错误', message='搜索结果列表为空!')
return
if self.song_num - 1 >= len(songs_data):
mes_box.showerror(title='错误', message='选择的歌曲序号无效!')
return
songs_req_id = self.response_data.get('reqid', '')
song_rid = songs_data[self.song_num - 1]['rid']
music_url = f'http://www.{song_rid}&type=convert_url3&httpStatus=1&reqId={songs_req_id}'
try:
resp = requests.get(music_url)
response_data = resp.json()
self.song_url = response_data.get('data', {}).get('url')
if not self.song_url:
mes_box.showerror(title='错误', message='获取下载链接失败,可能歌曲无版权或需要付费。')
return
self.song_name = songs_data[self.song_num - 1].get('name', '未知歌曲')
self.song_author = songs_data[self.song_num - 1].get('artist', '未知歌手')
except Exception as e:
mes_box.showerror(title='错误', message=f'获取播放地址失败:{str(e)}')
else:
mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择')
def download_music(self):
"""下载音乐"""
save_dir = './KuWoMusic'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
if self.song_num is not None and self.song_url:
song_name = f'{self.song_name}--{self.song_author}.mp3'
try:
save_path = os.path.join(save_dir, song_name).replace('\\', '/')
true_path = os.path.abspath(save_path)
resp = requests.get(self.song_url, timeout=30)
with open(save_path, 'wb') as file:
file.write(resp.content)
mes_box.showinfo(title='下载成功', message=f'歌曲:{self.song_name},保存地址为:{true_path}')
except Exception as e:
mes_box.showerror(title='错误', message=f'下载失败:{str(e)}')
else:
mes_box.showerror(title='错误', message='未选择要下载的歌曲,请先单击表格选择后再下载')
def progress_bar(self, file_size):
"""任务加载进度条"""
layout = [[Sg.Text('任务完成进度')], [Sg.ProgressBar(file_size, orientation='h', size=(40, 20), key='progressBar')], [Sg.Cancel()]]
window = Sg.Window('机器人执行进度', layout)
_progress_bar = window['progressBar']
for i in range(file_size):
event, values = window.read(timeout=10)
if event == 'Cancel' or event is None:
break
_progress_bar.UpdateBar(i + 1)
window.close()
def center_window(self):
"""UI界面窗口设置:居中"""
ws = self.ui_root.winfo_screenwidth()
hs = self.ui_root.winfo_screenheight()
x = (ws - self.ui_weight) // 2
y = (hs - self.ui_height) // 2
self.ui_root.geometry(f'{self.ui_weight}x{self.ui_height}+{x}+{y}')
def loop(self):
"""启动主循环"""
self.ui_root.resizable(False, False)
self.center_window()
self.set_ui()
self.ui_root.mainloop()
if __name__ == '__main__':
app = SetUI()
app.loop()
[此贴子已经被作者于2026-4-14 18:29编辑过]








