Python3.6实现付费酷狗音乐免费下载(已用tkinter封装GUI)
前言
之前做的Python小工具,现在搬出来和大家分享,基于酷狗音乐免费下载付费音乐,并已封装GUI。
(纯属个人兴趣,请大家尊重音乐版权),超喜欢JJ Lin的歌,放图镇文
软件
Python 3.6
Pycharm 2018.03
效果展示
代码实现
进度条花费了大量精力,最后采用网页进度条思路,即填充到90%停下,等待请求返回,收到回复后填充至100%
import requests
import json
from tkinter import ttk,filedialog
from tkinter import *
import tkinter as tk
import os,time
from tkinter import messagebox
import threadingglobal song_dic
song_dic = {}
def search():keys = keyin.get()search_url = 'http://songsearch.kugou.com/song_search_v2?callback=jQuery191034642999175022426_1489023388639&keyword={}&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1489023388641'play_url = 'http://www.kugou.com/yy/index.php?r=play/getdata&hash={}'search_file = requests.get(search_url.format(keys))search_html = search_file.content.decode().replace(')', '').replace('jQuery191034642999175022426_1489023388639(', '')views = json.loads(search_html)global song_dicsong_dic = {}song_list = []i=0fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")canvas.coords(fill_line, (0, 0, 646, 60))# 清空表格for item in treeview.get_children():treeview.delete(item)for view in views['data']['lists']:root.update()song_name = view['SongName'].replace('<em>', '').replace('</em>', '')album_name = view['AlbumName'].replace('<em>', '').replace('</em>', '')sing_name = view['SingerName'].replace('<em>', '').replace('</em>', '')file_hash = view['FileHash']song_info = {'歌名': song_name,'演唱者': sing_name,'专辑': album_name if album_name else None,'filehash': file_hash,'mp3url': None}mp3_file = requests.get(play_url.format(song_info['filehash'])).content.decode()mp3_json = json.loads(mp3_file)real_url = mp3_json['data']['play_url']song_info['mp3url'] = real_url # 歌曲信息获取完毕!song_name = str(song_info['歌名'])+str(song_info['演唱者'])+str(song_info['专辑'])song_list.append(song_info['演唱者'])song_list.append(song_info['专辑'])song_list.append(song_info['mp3url'])treeview.insert('', i, values=(song_info['歌名'], song_info['演唱者'], song_info['专辑']))i += 1song_dic[song_name] = song_listsong_list = []# 清空进度条fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="white")x = 300 # 未知变量,可更改n = 643 / x # 643是矩形填充满的次数for t in range(x):n = n + 643 / x# 以矩形的长度作为变量值更新canvas.coords(fill_line, (0, 0, n, 60))root.update()time.sleep(0) # 时间为0,即飞速清空进度条def musicsave():try:dirsetting = open('resource/settings/songdirsetting.ini', 'r')dirlast = dirsetting.read()dirsetting.close()except:dirlast='D:' # 默认保存文件夹for item in treeview.selection():#item = I001item_text = treeview.item(item, "values")song_name1 = item_text[1]+' - '+item_text[0]songkey = item_text[0]+item_text[1]+item_text[2]filename = dirlast +'/'+ song_name1 + ".mp3"with open(filename, "wb")as fp:global song_dicreal_url = song_dic[songkey][2]fp.write(requests.get(real_url).content)messagebox.showinfo('下载完成', '歌曲《'+song_name1+'》已保存至\n'+dirlast+' 文件夹!')def musicsave2(event):musicsave()
def search2(event):two_threading()def chosedir(): # 选择保存文件夹def chose():default_dir = r"C:\Users\lenovo\Desktop" # 设置默认打开目录dname = filedialog.askdirectory(title=u"选择文件夹",initialdir=(os.path.expanduser(default_dir)))dirsetting = open('resource/settings/songdirsetting.ini', 'w')dirsetting.write(dname)dirsetting.close()dirname.set(dname)chosebox = tk.Toplevel()chosebox.iconbitmap(r'resource/EC.ico') # 窗口图标设置chosebox.title("设置")chosebox.geometry(('320x100+720+200')) # 宽度x 高度+横向偏移量(距左边)+纵向偏移量(距上边)chosebox.resizable(0, 0)tk.Label(chosebox, text="文件保存至: ", bd=1, width=10).place(x=7, y=30)dirname = tk.StringVar() # 文件绝对地址try:dirsetting = open('resource/settings/songdirsetting.ini', 'r')dirlast = dirsetting.read()dirname.set(dirlast)dirsetting.close()except:dirname.set('D:') # 默认保存文件夹showdir = tk.Entry(chosebox, textvariable=dirname, width=26)showdir.place(x=74, y=30)ttk.Button(chosebox, text='浏览', compound='center', width=5, command=chose).place(x=262, y=27)# 显示下载进度
def progress():# 填充进度条fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")x = 300 # 未知变量,可更改n = 643 / x # 643是矩形填充满的次数for i in range(x):n = n + 643 / xcanvas.coords(fill_line, (0, 0, n, 60))root.update()time.sleep(0.02) # 控制进度条流动的速度if n>600:breakcanvas.coords(fill_line, (0, 0, 600, 60)) # 90%时停止进度条,等待请求返回root.update()def two_threading():threads = [] #定义线程池t1 = threading.Thread(target=search)threads.append(t1)t2 = threading.Thread(target=progress)threads.append(t2)for t in threads:t.setDaemon(True) # 设置为守护线程t.start()root = tk.Tk()
root.title('欢迎使用本工具')
root.geometry(('700x480+200+100')) # 宽度x 高度+横向偏移量(距左边)+纵向偏移量(距上边)menuBar = tk.Menu(root)
root.config(menu=menuBar)setMenu = tk.Menu(menuBar, tearoff=0)
setMenu.add_command(label="保存文件夹", command = chosedir)
menuBar.add_cascade(label="设置", menu=setMenu)title = Label(root, text='付费音乐破解助手', font=("宋体", 18)) # 设置标题
title.place(x=260, y=10)keywords = Label(root, text='关键词:', width=6, height=1, bd=2,font=('微软雅黑',12))
keywords.place(x=150, y=56)keyshow = StringVar()
keyin = Entry(root, textvariable=keyshow, width=35,bg="#c7edcc",font=('微软雅黑',10)) # 关键词输入框
keyin.place(x=220, y=60)
keyin.bind("<Return>", search2) # 绑定回车键搜索btphoto = tk.PhotoImage(file='resource/image/bt.png')
bt3 = tk.Button(root, image = btphoto,bd =0, command=two_threading)
bt3.place(x=500, y=58)# 设置下载进度条
canvas = tk.Canvas(root, width=643, height=5, bg="white")
canvas.place(x=28, y=88)#bt4 = ttk.Button(root, text='下载',width=5, command=musicsave)
#bt4.place(x=630, y=57)columns = ("歌名", "演唱者","专辑")
treeview = ttk.Treeview(root, height=16, show="headings", columns=columns) # 表格treeview.column("歌名", width=200, anchor='center') # 表示列,不显示
treeview.column("演唱者", width=200, anchor='center')
treeview.column("专辑", width=240, anchor='center')treeview.heading("歌名", text="歌名") # 显示表头
treeview.heading("演唱者", text="演唱者")
treeview.heading("专辑", text="专辑")treeview.place(x=30,y=96)
def treeview_sort_column(tv, col, reverse): # Treeview、列名、排列方式l = [(tv.set(k, col), k) for k in tv.get_children('')]l.sort(reverse=reverse) # 排序方式# rearrange items in sorted positionsfor index, (val, k) in enumerate(l): # 根据排序后索引移动tv.move(k, '', index)tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse)) # 重写标题,使之成为再点倒序的标题
for col in columns: # 绑定函数,使表头可排序treeview.heading(col, text=col, command=lambda _col=col: treeview_sort_column(treeview, _col, False))menu = Menu(treeview, tearoff=0)
menu.add_command(label="下载", command=musicsave)
def popupmenu(event):menu.post(event.x_root, event.y_root)
treeview.bind("<Button-3>", popupmenu)
treeview.bind('<Double-1>', musicsave2)
tk.Label(root, text="左键双击或右键下载歌曲", width=19).place(x=30,y=450)
root.iconbitmap(r'resource/EC.ico') # 窗口图标设置
root.mainloop()
相关文件下载(包括ico图片、无需Python也可直接运行的exe文件)
百度网盘链接:点击这里
参考链接:
https://blog.csdn.net/knidly/article/details/80109155
Python3.6实现付费酷狗音乐免费下载(已用tkinter封装GUI)相关推荐
- 仿酷狗音乐播放器已开源!
转载请说明原出处,谢谢:http://blog.csdn.net/zhuhongshu/article/details/41037875 距离我发布测试版的Redrain音乐盒(仿酷狗播放器),现在正 ...
- java 爬取网页版的酷狗音乐,下载到本地
代码实现 import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.sl ...
- python爬取酷狗音乐免费歌曲
此代码仅供学习交流 import re import requests import json print('请输入搜索歌曲:', end='') search = input() #搜索内容 pag ...
- python自动下载酷狗音乐_Python下载酷狗音乐
#encoding=utf-8 import re import json import time import requests import os def search(song_name): & ...
- 【强烈推荐】音频文件免费批量一键格式转换好工具——酷狗音乐
简介: 最近买了一个U盘,想把偶像JAY的歌曲拷贝到U盘里面,放到车里听,类似车载U盘.但是我的歌曲格式是无损FLAC格式的,车载系统对FLAC格式的音乐兼容性不好,一首歌没听多久就解析失败放下一首了 ...
- 我是如何利用Python下载酷狗音乐的
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 万战自称不提刃,生来双眼篾群容. ...
- 一篇文章教会你使用Python网络爬虫下载酷狗音乐
[一.项目背景] 现在的听歌软件动不动就是各种付费,要下载软件才能听,当你下载了之后,你会惊奇的发现这首歌还收费,这就让一向喜欢白嫖的小编感到很伤心了.于是,小编冥思苦想,终于让我发现了其中的奥秘,一 ...
- 酷狗音乐车载Android版,酷狗音乐车载版
酷狗音乐车载版介绍 酷狗音乐车载版是国内老牌数字音乐播放软件,酷狗音乐盒集歌曲搜索播放.高清MV在线点播以及KRC精准歌词等优秀功能于一身,在用户当中有着优秀的口碑. 酷狗音乐怎么去广告 很多的用户朋 ...
- 移动音乐播放平台-酷狗音乐2021提供下载
酷狗音乐2021安卓版是一款非常受欢迎的移动音乐播放平台.酷狗音乐2021app最新版采用先进的构架设计研发,设计了高传输效果的文件下载功能,实现数据分享传输.酷狗音乐2021app拥有新歌速递.权威 ...
- 怎么把酷狗音乐转换成MP3格式
听音乐用酷狗,很多人喜欢使用酷狗听歌,也喜欢在酷狗音乐下载歌曲,所以就会碰到一些关于音频格式的问题,大家也都应该了解有很多播放器下载的歌曲有些有专门的格式,问题是这些格式有我们生活中可能会不需要,那么 ...
最新文章
- Java基础--定时任务Timer
- 根据数据库中不同的值显示不同的图片
- 如何装keras-gpu?
- VTK:Texture之AnimateVectors
- 《xUnit Test Patterns》学习笔记4 - Principles of Test Automation
- spring数据源配置
- WinForm播放视频
- 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值
- bzoj 1263: [SCOI2006]整数划分
- Android设计模式--之命令模式
- curl如何发送json数据?如何发送form数据?python的restfull又该如何获取这些数据?...
- QuickSort的基本CPU实现代码
- 数字开头的字符可能有冒号可能没有,以分号分隔成数组
- 魔方栈源码-网站在线玩魔方源码-云魔方
- Uniapp实现实时音视频的基础美颜滤镜功能
- 【PRD】倒推“Soul”APP产品需求文档
- STM32之EXTI——外部中断
- u盘打不开,提示需要格式化怎么办?
- 从头开始学习->JVM(九):垃圾收集(上)
- Deployer php自动部署,基于 deployer 的 Web 端自动部署
热门文章
- ectouch java_ectouch: 包含
ECTouch_v2.7.2_SC_UTF8
ECshop_v3.6.0_UTF8_release
ECShop_V4.0.0_UTF8
- 华为设备好的visio图标及ppt图标
- 微信模板消息字体设置变大
- python实现文件管理系统_Python - 文件管理系统
- 计算机一级win7win10,Windows7怎么升级10系统,两种最简单的Win7升级Win10教程
- MySQL数据库编程(C++)介绍
- 汽车故障诊断技术【8】
- wps带阴影的边框怎么设置_win7系统下wps阴影边框如何设置
- WPF|分享一个登录界面设计
- 3COM TFTP 3CDaemon中文绿色版