天天看點

python網易雲音樂下載下傳打包exe檔案,Windows可運作

下載下傳原理:

通過官方的下載下傳連結http://music.163.com/song/media/outer/url?id=歌曲id.mp3,
分析網頁尋找歌曲id組裝成song_url,urlretrieve(song_url, path)下載下傳歌曲,
用pyinstaller将程式打包,脫離python環境Windows可運作
           

程式環境

  • python3.0以上解釋器
  • pycharm編輯器(編輯器無所謂,能寫代碼就可以)

代碼實作

import requests, json, base64

from binascii import hexlify

# Windows安裝注crypto有坑,新手建議先去Linux實作代碼功能
from Crypto.Cipher import AES

from tkinter import *

# urlretrieve優點隻用傳入url和下載下傳路徑就可以實作下載下傳
from urllib.request import urlretrieve
import os


class Encrypyed():
    '''傳入歌曲的ID,加密生成'params'、'encSecKey 傳回'''

    def __init__(self):
        self.pub_key = '010001'
        self.modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
        self.nonce = '0CoJUm6Qyw8W8jud'

    def create_secret_key(self, size):
        return hexlify(os.urandom(size))[:16].decode('utf-8')

    def aes_encrypt(self, text, key):
        iv = '0102030405060708'
        pad = 16 - len(text) % 16
        text = text + pad * chr(pad)
        encryptor = AES.new(key, AES.MODE_CBC, iv)
        result = encryptor.encrypt(text)
        result_str = base64.b64encode(result).decode('utf-8')
        return result_str

    def rsa_encrpt(self, text, pubKey, modulus):
        text = text[::-1]
        rs = pow(int(hexlify(text.encode('utf-8')), 16), int(pubKey, 16), int(modulus, 16))
        return format(rs, 'x').zfill(256)

    def work(self, ids, br=128000):
        text = {'ids': [ids], 'br': br, 'csrf_token': ''}
        text = json.dumps(text)
        i = self.create_secret_key(16)
        encText = self.aes_encrypt(text, self.nonce)
        encText = self.aes_encrypt(encText, i)
        encSecKey = self.rsa_encrpt(i, self.pub_key, self.modulus)
        data = {'params': encText, 'encSecKey': encSecKey}
        return data

    def search(self, text):
        text = json.dumps(text)
        i = self.create_secret_key(16)
        encText = self.aes_encrypt(text, self.nonce)
        encText = self.aes_encrypt(encText, i)
        encSecKey = self.rsa_encrpt(i, self.pub_key, self.modulus)
        data = {'params': encText, 'encSecKey': encSecKey}
        return data


class search():
    '''跟歌單直接下載下傳的不同之處,1.就是headers的referer
                              2.加密的text内容不一樣!
                              3.搜尋的URL也是不一樣的
        輸入搜尋内容,可以根據歌曲ID進行下載下傳
                                '''

    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
            'Host': 'music.163.com',
            'Referer': 'http://music.163.com/search/'}  ###!!注意,搜尋跟歌單的不同之處!!
        self.main_url = 'http://music.163.com/'
        self.session = requests.Session()
        self.session.headers = self.headers
        self.ep = Encrypyed()

    def search_song(self, search_content, search_type=1, limit=9):
        """
        根據音樂名搜尋
      :params search_content: 音樂名
      :params search_type: 不知
      :params limit: 傳回結果數量
      return: 可以得到id 再進去歌曲具體的url
        """
        url = 'http://music.163.com/weapi/cloudsearch/get/web?csrf_token='
        text = {'s': search_content, 'type': search_type, 'offset': 0, 'sub': 'false', 'limit': limit}
        data = self.ep.search(text)
        resp = self.session.post(url, data=data)
        result = resp.json()
        if result['result']['songCount'] <= 0:
            print('搜不到!!')
        else:
            songs = result['result']['songs']
            
            # 預設下載下傳搜尋歌曲後第一首歌曲 for song in songs[:1]
            for song in songs[:1]:
                song_id, song_name, singer, alia = song['id'], song['name'], song['ar'][0]['name'], song['al']['name']
                print(song_id, song_name, singer, alia)
			
			# 擷取音樂id和name
            item = {}
            item['song_id']   = song_id
            item['song_name']  = song_name
			
			# 下載下傳音樂	
            song_load(item)

def song_load(item): # 下載下傳歌曲
    song_id = item['song_id']
    song_name = item['song_name']
    # 拼接下載下傳url
    song_url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)

    # 建立一個檔案夾
    # exist_ok=True 如果檔案存在不會報錯 不會繼續建立
    os.makedirs('music_netease', exist_ok=True)
    path = 'music_netease\{}.mp3'.format(song_name)

    # GUI圖像畫界面,顯示資料到文本框
    text.insert(END, '歌曲:{},正在下載下傳...'.format(song_name))
    # 文本框滾動
    text.see(END)
    # 更新
    text.update()

    # 下載下傳歌曲
    urlretrieve(song_url, path)

    text.insert(END, '下載下傳完畢: {},請試聽!'.format(song_name))
    text.see(END)
    text.update()

if __name__ == '__main__':

    # 搜尋歌曲名字
    def get_music_name():
        # 擷取輸入框輸入的歌曲名字
        name = entry.get()
        # 拼接url
		
		# 搜尋歌曲
        song = search()
        # 更具傳入的歌名擷取id
        song.search_song(name)

        # 下載下傳歌曲
        # song_load() # 在search_song()得到歌曲id後調用

    # 搭建界面

    # 建立界面
    root = Tk()
    # 添加标題
    root.title('網易雲音樂')
    # 設定視窗大小 x 小寫x連,不能用乘号 後面兩位是x,y坐标,固定初始位置
    root.geometry('550x430+400+200')

    # 标簽控件
    label = Label(root, text='請輸入下載下傳的歌曲:', font=('華文行楷', 20))
    # 标簽定位 grid 網格式定位
    label.grid()  # 預設 row=0,column=0
    # 輸入框
    entry = Entry(root, font=('隸書', 20))
    # 定位 第0行 第1列
    entry.grid(row=0, column=1)
    # 清單框
    text = Listbox(root, font=('楷書', 16), width=50, heigh=15)
    # 定位 columnspan 元件橫跨的列數
    text.grid(row=1, columnspan=2)

    # 點選按鈕 command 點選按鈕觸發函數
    button = Button(root, text='開始下載下傳', font=('隸書', 15), command=get_music_name)
    # 定位 sticky 對齊方式 W E N S  東南西北
    button.grid(row=2, column=0, sticky=W)

    # command 點選觸發方法 command=root.quit 關閉視窗
    button1 = Button(root, text='退出程式', font=('隸書', 15), command=root.quit)
    # 定位 sticky 對齊方式 W E N S  東南西北
    button1.grid(row=2, column=1, sticky=E)

    # 顯示界面
    root.mainloop()
    
                

打包exe檔案方式不多說了,請檢視,文章裡有打包詳情: https://mp.csdn.net/mdeditor/81742491

exe打包好檔案加源碼百度網盤下載下傳連結永久有效!

https://pan.baidu.com/s/1ajXctZyWJCP9bQjCnFxGOw

改進版:

python網易雲音樂下載下傳,可選擇歌曲,下載下傳路徑