分享一个无聊自己写的一个实用小工具:音乐下载器
看图:
代码分享:
import requests
import json,sys
from moviepy.editor import *
import os , threading
session = requests.session()
header = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'}
#清空输入内容
def text_log_clear():
text_log.delete("1.0","end")
def text_views_clear():
text_views.delete("1.0","end")
def get_vids():
# music_name = input("请输入歌曲名字\n")
text_views_clear()
music_name = entry.get()
if not music_name:
text_views.insert(END,'歌曲名不能为空!!!')
return
music_url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&remoteplace=txt.yqq.mv&searchid=143180272530132869&aggr=0&catZhida=1&lossless=0&sem=1&t=12&p=1&n=12&w={}&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0".format(
music_name)
try:
response = session.get(url=music_url, headers=header).text
result = json.loads(response)
lens = len(result['data']['mv']['list'])
except:
text_log.insert(END,"网络请求出问题了噢!快去看看哪里出问题了吧~")
for index in range(0, lens):
song = result['data']['mv']['list'][index]['mv_name']
singer = result['data']['mv']['list'][index]['singer_name']
indexs = str(index) + ": " + song + "----" + singer+"\n"
text_views.insert(END,indexs)
with open("log.txt","w",encoding="utf-8") as f :
f.write(response)
# print(str(index) + ": " + song + "----" + singer)
# s = input("请输入你要下载的MV(如没有你想要的视频可输入非数字):")
def downlald():
with open('log.txt',"r",encoding="utf-8") as f:
sheet = json.loads(f.read())
s = entry2.get()
if s :
text_log_clear()
text_log.insert(END, "请稍后...\n")
vids = sheet['data']['mv']['list'][int(s)]['v_id']
song_name = sheet['data']['mv']['list'][int(s)]['mv_name']
singer_name = sheet['data']['mv']['list'][int(s)]['singer_name']
singer_name = singer_name.replace("/", ",")
name = song_name + "--" + singer_name
flie = song_name + "--" + singer_name + '.mp4'
text_log_clear()
text_log.insert(END, name + "下载中.......\n")
dowlond(vids,name,flie)
else:
text_log_clear()
text_log.insert(END, "输入有误!!!\n")
def dowlond(vids,name,flie):
url = "https://u.y.qq.com/cgi-bin/musicu.fcg"
#请求参数
data1 = {"getMvUrl":{"module":"gosrf.Stream.MvUrlProxy","method":"GetMvUrls","param":{"vids":[vids],"request_typet":10001,"addrtype":3}},"comm":{"ct":24,"cv":4747474,"g_tk":5381,"uin":0,"format":"json","platform":"yqq"}}
data = json.dumps(data1) #转字符串
mv_response = session.post(url=url,headers=header,data=data).text
#提取高清URL位置
mv_url = json.loads(mv_response)["getMvUrl"]["data"][vids]['mp4'][2]['freeflow_url'][-1]
# print("下载地址:\n"+mv_url)
mv = session.get(mv_url).content
try:
with open(flie,"wb") as f:
f.write(mv)
# print("mp3文件下载中.......")
with VideoFileClip(flie) as video:
audio = video.audio
audio.write_audiofile(path_entry.get() + "/" + name + '.'+path2.get())
# print(name + "mp3文件下载完成")
os.remove(flie)
text_log.insert(END,name + "下载完成\n")
except:
text_log.insert(END, name + "下载出错了,请重试...\n")
#多进程
class Thread():
def sceh():
sech_thread = threading.Thread(target=get_vids).start()
def downlald():
downlald_thread = threading.Thread(target=downlald).start()
def go_clear():
text_views_clear()
text_log_clear()
#图形界面
import tkinter
from tkinter import StringVar,END ,scrolledtext
from tkinter.filedialog import askdirectory
root = tkinter.Tk()
root.wm_iconbitmap('软件图标.ico')
root.geometry('550x375')
title = root.title("音乐下载器")
lable = tkinter.Label(root,text = "请输入你要搜索的歌曲:")
lable.place(x=0,y=0)
lable2 = tkinter.Label(root,text="请输入你要下载的歌曲:")
lable2.place(x=0,y=200)
entry = tkinter.Entry(root,width=29)
entry.place(x=150,y=0)
entry2 = tkinter.Entry(root,width=5)
entry2.place(x=150,y=200)
text_views = scrolledtext.ScrolledText(root,width = 50,height = 10)
text_log = tkinter.Text(root,width=50,height=5)
text_log.place(x=0,y=260)
text_views.place(x=0,y=60)
input_button = tkinter.Button(root,text = "搜索",command = Thread.sceh)
download_button = tkinter.Button(root,text="下载",command = Thread.downlald)
lable_path = tkinter.Label(root,text = "文件保存路径:")
lable_path.place(x=380,y=0)
def get_path():
_path = askdirectory()
path.set(_path)
path = StringVar()
path_entry = tkinter.Entry(root,textvariable = path,width=20)
path_entry.place(x=380,y=25)
path_button = tkinter.Button(root,text = "浏览",command = get_path)
path_button.place(x=380,y=50)
#音频格式选择
type_lable = tkinter.Label(root,text = "选择保存格式")
type_lable.place(x=380,y=80)
path2 = StringVar()
path2.set('mp3')
tkinter.Radiobutton(root,text = "MP3",variable=path2,value='mp3').place(x=380,y=100)
tkinter.Radiobutton(root,text = "WMA",variable=path2,value='wma').place(x=450,y=100)
clear = tkinter.Button(root,text = "清空",command=Thread.go_clear)
close = tkinter.Button(root,text = "退出",command = sys.exit)
close.place(x=500,y=330)
clear.place(x=0,y=330)
download_button.place(x=0,y=225)
input_button.place(x=0,y=25)
#背景图片
from PIL import Image,ImageTk
im=Image.open("背景图片.jpg")
img=ImageTk.PhotoImage(im)
tkinter.Label(root,image=img).place(x=380,y=180)
tkinter.Label(root,text = "https://blog.csdn.net/weixin_40018318?spm=1001.2014.3001.5343",font=("隶书",8)).place(x=70,y=330)
import webbrowser
# 设置label标签
link = tkinter.Label(root, text='点击进入我的csdn主页', font=('Arial', 9))
link.place(x=75, y=350)
#我的主页
def open_url(event):# 此处必须注意,绑定的事件函数中必须要包含event参数
webbrowser.open("https://blog.csdn.net/weixin_40018318?spm=1001.2014.3001.5343", new=0)
link.bind("<Button-1>", open_url)
root.mainloop()