免费听好歌曲,音乐下载工具

分享一个无聊自己写的一个实用小工具:音乐下载器

看图:
在这里插入图片描述

代码分享:

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&notice=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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值