python爱好者. 发表于 2022-8-13 19:25:53

一个能让你免登录下载酷我里的音乐的程序(有鱼币)

本帖最后由 python爱好者. 于 2022-8-13 20:08 编辑

想必大家在制作作品时,都遇到过背景音乐无法下载,这件极度、极度气人的事吧?{:10_269:}
所以,为了让大家(还有我{:10_256:} )能更快将所需的背景音乐下载下来,
我就做了这个:不需要打开 "网页版酷我音乐" 即可快速下载所需音乐的程序:{:10_248:}

废话不多说,上代码:{:10_327:}
import urllib.request
import urllib.parse
import json
import os

def down_load_music(music_address,down_load_address,information_list): #下载歌曲
    #创建文件
    with open(f"{down_load_address}\\{information_list}.mp3","w") as f:
      pass
   
    #写入歌曲
    with open(f"{down_load_address}\\{information_list}.mp3","wb") as f:
      music = urllib.request.urlopen(music_address).read()
      f.write(music)

def get_music_address(information_list,music_num,second_headrs_words): #获取音乐地址
    #获取此歌信息
    for i in range(len(information_list)):
      if i + 1 == music_num: #序号匹配
            information_list = information_list

    #初始变量
    url = f"http://www.kuwo.cn/api/v1/www/music/playUrl?mid={information_list[-1]}&type=music&httpsStatus=1&reqId=d3546381-1ad6-11ed-aa38-519c66b4fe28" #歌曲网页地址
    second_headers = get_headers(second_headrs_words) #请求头2

    #获取数据
    req = urllib.request.Request(url,headers = second_headers)
    response = json.loads(urllib.request.urlopen(req).read().decode("utf8"))

    #返回结果
    if response["code"] == -1: #报错
      #提示
      print("抱歉,您选的歌曲为付费歌曲,无法下载!")

      #下一轮
      return -1,-1

    else:
      music_address = response["data"]["url"]
      return music_address,information_list

def print_music_information(music_information): #打印歌曲信息
    information_list = [] #储存重要信息
   
    i = 0
    for each in music_information["data"]["list"]:
      #获取信息
      name = each["name"] #作品名字
      artist = each["artist"] #作者姓名
      album = each["album"] #作品专辑
      songTimeMinutes = each["songTimeMinutes"]
      rid = each["rid"] #作品id

      #储存信息
      information_list.extend([])
      
      #打印信息
      print(f"序号{i + 1}:/歌曲:{name}/,/歌手:{artist}/,/专辑:{album}/,/时长:{songTimeMinutes}/")
      
      i += 1

    return information_list

def get_music_information(music_name,music_page,first_headrs_words): #获取歌曲
    #初始变量
    url = f"http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={urllib.parse.quote(music_name)}&pn={urllib.parse.quote(music_page)}&rn=30&httpsStatus=1&reqId=1947b511-1ac6-11ed-abe0-e348db15d8b3"
    first_headers = get_headers(first_headrs_words) #请求头1

    #获取数据
    req = urllib.request.Request(url,headers = first_headers)
    response = json.loads(urllib.request.urlopen(req).read().decode("utf8"))
   
    return response

def get_headers(words): #生成请求头
    headers = {each:each for each in } #转换为字典
   
    return headers

def first_try(music_name,music_page,first_headers_words):
    try:
      music_information = get_music_information(music_name,music_page,first_headers_words)
      return music_information
      
    except urllib.error.HTTPError as reason:
      if reason == "HTTP Error 504: Gateway Timeout": #暂时性网络连接失败
            #提示
            print("网络连接失败,正在重试中,请耐心等待!")

            #重试
            first_try()   

def main():
    #用户信息
    music_name = input("请输入歌曲名称:")
    music_page = input("请输入歌曲所在页数:")
   
    #初始变量
    first_headers_words = """Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Cookie: _ga=GA1.2.38866944.1643424882; BusinessId={"std_plat":404,"std_dev":"d2b0d6c5-27ce-4b06-bf62-1e19b3ad6f84","std_imei":"d2b0d6c5-27ce-4b06-bf62-1e19b3ad6f84"}; _gid=GA1.2.432698325.1660354553; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1660254093,1660354553,1660356822,1660366722; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1660367192; kw_token=UX6Z894LRHB; _gat=1
Host: www.kuwo.cn
Referer: http://www.kuwo.cn/search/list?key=%E5%AD%A4%E5%8B%87%E8%80%85
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47
csrf: UX6Z894LRHB""" #请求头1

    second_headers_words = """Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Cookie: _ga=GA1.2.38866944.1643424882; BusinessId={"std_plat":404,"std_dev":"d2b0d6c5-27ce-4b06-bf62-1e19b3ad6f84","std_imei":"d2b0d6c5-27ce-4b06-bf62-1e19b3ad6f84"}; _gid=GA1.2.432698325.1660354553; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1660254093,1660354553,1660356822,1660366722; kw_token=DQ089P4PGZG; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1660374530; _gat=1
Host: www.kuwo.cn
Referer: http://www.kuwo.cn/play_detail/198554068
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47""" #请求头2

    #获取歌曲信息(有概率报错)
    music_information = first_try(music_name,music_page,first_headers_words)

    #打印歌曲信息
    information_list = print_music_information(music_information)

    #让用户选择要下载的歌所对应的序列号
    music_num = int(input("请输入歌曲序列号:"))

    #获取歌曲地址(有概率报错)
    try:
      music_address,information_list = get_music_address(information_list,music_num,second_headers_words)
      if music_address == -1: #需要跳一轮循环
            return -1 #退出本轮循环
      
    except urllib.error.HTTPError as reason:
      if reason == "HTTP Error 403: Forbidden": #无法访问
            print("此歌无法访问,猜测原因应该是因为此歌的此版本为付费内容!")
            return -1

    #让用户选择要将歌曲下载在哪里
    down_load_address = input(r"请输入存放歌曲的位置(文件夹),如:'C:\\test':")

    #下载歌曲(有概率报错)
    try:
      down_load_music(music_address,down_load_address,information_list)

    except PermissionError as reason:
      if " Permission denied:" in reason: #没有访问权限
            print("抱歉,我们没有在此文件夹中创建文件的权力,请换个位置,如:'C:\\test':")


if __name__ == "__main__":
    #初始变量
    running = True #程序是否继续执行

    #主循环
    while running:
      main()


      




注意:
1.此程序不可以下载付费歌曲{:10_245:}
2.此程序并非与这个作品的交互过程相同,且原理也不一样{:10_334:} :
一个(大佬@青出于蓝 的)是需要:用户自己打开酷我并手动传入网页地址(url)参数的(注意:此处无贬义{:10_297:} ,因为一个追求的是小巧轻便;另一个则是"懒"),
一个(我的)是只需要在程序里操作的,
两者没有对比意义(因为原理不一样)
3.此程序创意来自大佬@青出于蓝,感谢!

最后附上一张程序效果展示图:{:10_248:}

python爱好者. 发表于 2022-8-13 19:29:43

@isdkz @青出于蓝 @shiyouroc
来看看...

python爱好者. 发表于 2022-8-13 19:31:33

python爱好者. 发表于 2022-8-13 19:29
@isdkz @青出于蓝 @shiyouroc
来看看...

对了,抱歉,最近一直没更新,因为最近一直在听网课{:10_247:}和写无尽的作业{:10_269:}

hornwong 发表于 2022-8-13 19:33:17

{:5_108:}

hornwong 发表于 2022-8-13 19:33:53

感谢分享!

一点点儿 发表于 2022-8-13 19:45:41

感谢楼主的无私分享{:10_279:}

一点点儿 发表于 2022-8-13 19:46:18

向大佬学习{:10_254:}

一点点儿 发表于 2022-8-13 19:47:06

前来围观支持{:5_108:}

柿子饼同学 发表于 2022-8-13 20:04:26

学习一下{:10_256:}

python爱好者. 发表于 2022-8-13 20:09:51

又稍微改了一下,提升了防报错的机制{:10_256:}

rsj0315 发表于 2022-8-13 21:05:21

我也干这事,干一半,被你完成了。

kerln888 发表于 2022-8-13 21:15:22

{:10_256:}{:10_256:}{:10_256:}6666

kerln888 发表于 2022-8-13 21:17:01

付费的无法下载吗??

python0729 发表于 2022-8-13 21:20:32

青出于蓝 发表于 2022-8-13 21:55:54

厉害{:10_254:}

emotion? 发表于 2022-8-13 22:48:30

66666

emotion? 发表于 2022-8-13 22:50:54

大佬6666666666666666666666

取昵称好难哟 发表于 2022-8-14 00:35:31

{:10_254:}

Passepartout 发表于 2022-8-14 08:56:55

{:7_146:}

香蕉那个不拿拿 发表于 2022-8-14 09:33:12

{:10_265:}
页: [1] 2
查看完整版本: 一个能让你免登录下载酷我里的音乐的程序(有鱼币)