鱼C论坛

 找回密码
 立即注册
查看: 6686|回复: 78

[作品展示] 一个能让你免登录下载酷我里的音乐的程序 V2.0(有鱼币)

[复制链接]
发表于 2022-8-14 19:51:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上一个版本:https://fishc.com.cn/thread-216571-1-1.html


此版本更新了N处:
1.可以下载 vip 才能下载的歌曲了!
2.添加了 "合法化非法文件名" 的代码
3.大幅提高了防报错能力
4.合并了几个函数,并精简了代码
5.添加了翻页功能

废话不多说,上代码:
  1. import urllib.request
  2. import urllib.parse
  3. import json
  4. import os

  5. def down_load_music(music_address,down_load_address,information_list): #下载歌曲
  6.     #获取音乐名
  7.     music_name = get_right_music_name(information_list)
  8.    
  9.     #创建文件
  10.     with open(f"{down_load_address}\\{music_name}.mp3","w") as f:
  11.         pass
  12.    
  13.     #写入歌曲
  14.     with open(f"{down_load_address}\\{music_name}.mp3","wb") as f:
  15.         music = urllib.request.urlopen(music_address).read()
  16.         f.write(music)

  17. def get_right_music_name(information_list): #合法化歌曲名
  18.     #初始变量
  19.     music_name = information_list[0] #歌曲名
  20.     characters = ['/', '\\', ':', '*', '?', '"', '<', '>', '|'] #非法字符

  21.     for each in characters:
  22.         if each in music_name: #含此非法字符
  23.             music_name = music_name.replace(each,"") #去除非法字符

  24.     return music_name

  25. def get_music_address(information_list,music_num,second_headrs_words): #获取音乐地址
  26.     #获取此歌信息
  27.     information_list = information_list[music_num - 1]

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

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

  34.     #返回结果
  35.     music_address = response["data"]["url"]
  36.     return music_address,information_list

  37. def print_music_information(music_information): #打印歌曲信息
  38.     information_list = [] #储存重要信息

  39.     #初始变量
  40.     reqId = music_information["reqId"] #作品vip信息
  41.     i = 0 #迭代作品序列号

  42.     #打印歌曲信息
  43.     for each in music_information["data"]["list"]:
  44.         #获取信息
  45.         name = each["name"] #作品名字
  46.         artist = each["artist"] #作者姓名
  47.         album = each["album"] #作品专辑
  48.         songTimeMinutes = each["songTimeMinutes"]
  49.         rid = each["rid"] #作品id

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

  57.     return information_list

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

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

  67. def get_headers(words): #生成请求头
  68.     headers = {each[0]:each[1] for each in [each.split(": ") for each in words.split("\n")]} #转换为字典
  69.    
  70.     return headers

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

  80.             #重试
  81.             first_try()   

  82. def second_try(music_address,down_load_address,information_list,music_name,first_headers_words):
  83.     try:
  84.         down_load_music(music_address,down_load_address,information_list)

  85.     except PermissionError as reason:
  86.         while "[Errno 13] Permission denied:" in reason: #没有访问权限
  87.             down_load_address = input("抱歉,我们没有在此文件夹中创建文件的权力,请换个位置,如:'C:\\test':")
  88.             down_load_music(music_address,down_load_address,information_list)

  89. def third_try(music_name,start_page,first_headers_words):
  90.     #获取歌曲所在页数(有概率报错)(已解决)
  91.     music_page,information_list = get_music_page(get_music_pages(music_name,start_page,first_headers_words),music_name,first_headers_words)

  92.     while music_page == -1: #查无此歌
  93.         music_name = input("抱歉,未查询到此歌,请重新输入歌曲名称:")
  94.         music_page,information_list = get_music_page(get_music_pages(music_name,start_page,first_headers_words),music_name,first_headers_words)

  95.     return music_page,information_list

  96. def fourth_try():
  97.     try:
  98.         #让用户选择要下载的歌所对应的序列号
  99.         music_num = int(input("请输入歌曲序列号:"))

  100.         while not(0 < music_num < 31): #范围超出 1 到 30
  101.             music_num = int(input("序列号超出最大值,请重新输入歌曲序列号:"))

  102.         #返回结果
  103.         return music_num

  104.     except ValueError as reason:
  105.         if "invalid literal for int() with base 10:" in reason: #序列号非数字类型
  106.             fourth_try()

  107. def get_music_page(pages,music_name,first_headers_words): #获取歌曲所在页数
  108.     if pages == 0: #没有此歌
  109.         return -1,-1
  110.    
  111.     else:
  112.         #初始变量
  113.         page = 0 #歌曲所在页数

  114.         for i in range(1,pages + 1):
  115.             #获取歌曲信息(有概率报错)(已解决)
  116.             music_information = first_try(music_name,i,first_headers_words)
  117.             
  118.             #打印歌曲信息
  119.             information_list = print_music_information(music_information)

  120.             #让用户选择是否继续获取歌曲信息
  121.             still_display = input("请输入是否切换下一页(回答:'是'或'否'):")

  122.             #执行用户指令
  123.             if still_display == "否": #停止展示歌曲信息
  124.                 page = i
  125.                 break
  126.             
  127.         else: #达到最后一页
  128.             print("抱歉,这已经是最后一页了!")

  129.         #返回结果
  130.         return page,information_list

  131. def get_music_pages(music_name,start_page,first_headers_words): #获取页面总页数
  132.     #获取歌曲信息(有概率报错)(已解决)
  133.     music_information = first_try(music_name,start_page,first_headers_words)

  134.     #返回结果
  135.     pages = int(music_information["data"]["total"]) // 30 #总页数
  136.     return pages

  137. def main():
  138.     #用户信息
  139.     music_name = input("请输入歌曲名称:")
  140.    
  141.     #初始变量
  142.     first_headers_words = """Accept: application/json, text/plain, */*
  143. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
  144. Connection: keep-alive
  145. 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
  146. Host: www.kuwo.cn
  147. Referer: http://www.kuwo.cn/search/list?key=%E5%AD%A4%E5%8B%87%E8%80%85
  148. 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
  149. csrf: UX6Z894LRHB""" #请求头1

  150.     second_headers_words = """Accept: application/json, text/plain, */*
  151. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
  152. Connection: keep-alive
  153. 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
  154. Host: www.kuwo.cn
  155. Referer: http://www.kuwo.cn/play_detail/198554068
  156. 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

  157.     start_page = 1 #起始页

  158.     #获取歌曲所在页数(有概率报错)(已解决)
  159.     music_page,information_list = third_try(music_name,start_page,first_headers_words)

  160.     #让用户选择要下载的歌所对应的序列号
  161.     music_num = fourth_try()

  162.     #获取歌曲地址
  163.     music_address,information_list = get_music_address(information_list,music_num,second_headers_words)

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

  166.     #下载歌曲(有概率报错)
  167.     second_try(music_address,down_load_address,information_list,music_name,first_headers_words)


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

  171.     #主循环
  172.     while running:
  173.         main()


  174.         


复制代码


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

最后附上一张程序效果展示图:
效果图.gif

评分

参与人数 3荣誉 +12 鱼币 +7 贡献 +3 收起 理由
liuhongrun2022 + 5 + 3
ckblt + 2 + 2 感谢楼主无私奉献!
小伤口 + 5 + 5 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-14 19:52:33 | 显示全部楼层
本帖最后由 python爱好者. 于 2022-8-14 19:57 编辑

@isdkz @青出于蓝 @shiyouroc @ckblt @柿子饼同学
来看看...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 20:39:02 | 显示全部楼层

回帖奖励 +4 鱼币

python爱好者. 发表于 2022-8-14 19:52
@isdkz @青出于蓝 @shiyouroc @ckblt @柿子饼同学
来看看...


来啦
高 , 高啊

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 谢谢夸奖^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 21:18:09 | 显示全部楼层

回帖奖励 +4 鱼币

可以下vip了,太赞了

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
python爱好者. + 3 + 3 + 3 谢谢夸奖^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 21:18:42 | 显示全部楼层

回帖奖励 +4 鱼币

感谢大佬的分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 21:30:51 | 显示全部楼层

回帖奖励 +4 鱼币

666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-14 22:18:35 | 显示全部楼层

回帖奖励 +4 鱼币

感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 22:19:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-14 22:20:04 | 显示全部楼层

回帖奖励 +4 鱼币

感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-14 22:39:48 | 显示全部楼层

回帖奖励 +4 鱼币

代码好牛逼啊,谢谢分享

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
python爱好者. + 3 + 3 + 3 谢谢夸奖^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 09:27:42 | 显示全部楼层

回帖奖励 +4 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 11:07:47 | 显示全部楼层

回帖奖励 +4 鱼币

赞一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 11:09:42 | 显示全部楼层

回帖奖励 +4 鱼币

牛,太牛了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 11:32:44 | 显示全部楼层

回帖奖励 +4 鱼币

感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 11:33:16 | 显示全部楼层

回帖奖励 +4 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 13:24:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 13:25:10 | 显示全部楼层

回帖奖励 +4 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 13:47:49 | 显示全部楼层

回帖奖励 +4 鱼币

感谢大佬的分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 14:34:13 | 显示全部楼层

回帖奖励 +4 鱼币

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 16:04:31 | 显示全部楼层

回帖奖励 +4 鱼币

牛啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表