前言

之前做的Python小工具,现在搬出来和大家分享,基于酷狗音乐免费下载付费音乐,并已封装GUI。

(纯属个人兴趣,请大家尊重音乐版权),超喜欢JJ Lin的歌,放图镇文

软件

Python 3.6

Pycharm 2018.03

效果展示

输入关键字,按下Enter键或者点击搜索键开始搜索

代码实现

进度条花费了大量精力,最后采用网页进度条思路,即填充到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)相关推荐

  1. 仿酷狗音乐播放器已开源!

    转载请说明原出处,谢谢:http://blog.csdn.net/zhuhongshu/article/details/41037875 距离我发布测试版的Redrain音乐盒(仿酷狗播放器),现在正 ...

  2. java 爬取网页版的酷狗音乐,下载到本地

    代码实现 import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.sl ...

  3. python爬取酷狗音乐免费歌曲

    此代码仅供学习交流 import re import requests import json print('请输入搜索歌曲:', end='') search = input() #搜索内容 pag ...

  4. python自动下载酷狗音乐_Python下载酷狗音乐

    #encoding=utf-8 import re import json import time import requests import os def search(song_name): & ...

  5. 【强烈推荐】音频文件免费批量一键格式转换好工具——酷狗音乐

    简介: 最近买了一个U盘,想把偶像JAY的歌曲拷贝到U盘里面,放到车里听,类似车载U盘.但是我的歌曲格式是无损FLAC格式的,车载系统对FLAC格式的音乐兼容性不好,一首歌没听多久就解析失败放下一首了 ...

  6. 我是如何利用Python下载酷狗音乐的

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 万战自称不提刃,生来双眼篾群容. ...

  7. 一篇文章教会你使用Python网络爬虫下载酷狗音乐

    [一.项目背景] 现在的听歌软件动不动就是各种付费,要下载软件才能听,当你下载了之后,你会惊奇的发现这首歌还收费,这就让一向喜欢白嫖的小编感到很伤心了.于是,小编冥思苦想,终于让我发现了其中的奥秘,一 ...

  8. 酷狗音乐车载Android版,酷狗音乐车载版

    酷狗音乐车载版介绍 酷狗音乐车载版是国内老牌数字音乐播放软件,酷狗音乐盒集歌曲搜索播放.高清MV在线点播以及KRC精准歌词等优秀功能于一身,在用户当中有着优秀的口碑. 酷狗音乐怎么去广告 很多的用户朋 ...

  9. 移动音乐播放平台-酷狗音乐2021提供下载

    酷狗音乐2021安卓版是一款非常受欢迎的移动音乐播放平台.酷狗音乐2021app最新版采用先进的构架设计研发,设计了高传输效果的文件下载功能,实现数据分享传输.酷狗音乐2021app拥有新歌速递.权威 ...

  10. 怎么把酷狗音乐转换成MP3格式

    听音乐用酷狗,很多人喜欢使用酷狗听歌,也喜欢在酷狗音乐下载歌曲,所以就会碰到一些关于音频格式的问题,大家也都应该了解有很多播放器下载的歌曲有些有专门的格式,问题是这些格式有我们生活中可能会不需要,那么 ...

最新文章

  1. Java基础--定时任务Timer
  2. 根据数据库中不同的值显示不同的图片
  3. 如何装keras-gpu?
  4. VTK:Texture之AnimateVectors
  5. 《xUnit Test Patterns》学习笔记4 - Principles of Test Automation
  6. spring数据源配置
  7. WinForm播放视频
  8. 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值
  9. bzoj 1263: [SCOI2006]整数划分
  10. Android设计模式--之命令模式
  11. curl如何发送json数据?如何发送form数据?python的restfull又该如何获取这些数据?...
  12. QuickSort的基本CPU实现代码
  13. 数字开头的字符可能有冒号可能没有,以分号分隔成数组
  14. 魔方栈源码-网站在线玩魔方源码-云魔方
  15. Uniapp实现实时音视频的基础美颜滤镜功能
  16. 【PRD】倒推“Soul”APP产品需求文档
  17. STM32之EXTI——外部中断
  18. u盘打不开,提示需要格式化怎么办?
  19. 从头开始学习->JVM(九):垃圾收集(上)
  20. Deployer php自动部署,基于 deployer 的 Web 端自动部署

热门文章

  1. ectouch java_ectouch: 包含 ECTouch_v2.7.2_SC_UTF8 ECshop_v3.6.0_UTF8_release ECShop_V4.0.0_UTF8
  2. 华为设备好的visio图标及ppt图标
  3. 微信模板消息字体设置变大
  4. python实现文件管理系统_Python - 文件管理系统
  5. 计算机一级win7win10,Windows7怎么升级10系统,两种最简单的Win7升级Win10教程
  6. MySQL数据库编程(C++)介绍
  7. 汽车故障诊断技术【8】
  8. wps带阴影的边框怎么设置_win7系统下wps阴影边框如何设置
  9. WPF|分享一个登录界面设计
  10. 3COM TFTP 3CDaemon中文绿色版