admin管理员组

文章数量:1633113

周末在家玩电脑,闲极无聊想打开酷狗听歌,想下载几首音乐,居然提示我让我安装软件.作为一个技术宅当然不能容忍这件事情.于是我用了,周末的时间写了一个下载器。
截图一张:

双击下载音乐。会保存到window电脑中music文件夹
如:C:\Users\mbh\Music\

酷狗音乐.py

import getpass
import hashlib
import json
import random
import time
import execjs

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}

def guid():
    # def e():
    #     return hex(int(65536 * (1 + random.random())))[2:]
    #
    # b = e() + e() + "-" + e() + "-" + e() + "-" + e() + "-" + e() + e() + e()

    def e():
        return execjs.compile("""
            function guid() {
                function e() {
                    return (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
                }
                return e() + e() + "-" + e() + "-" + e() + "-" + e() + "-" + e() + e() + e()
            }
        """).call('guid')

    def md5(g):
        js = execjs.compile("""
            function Md5(e) {
                var r, i = 0, s = 8;
                function a(e, r, t, o, i, s) {
                    return K((n = K(K(r, e), K(o, s))) << (a = i) | n >>> 32 - a, t);
                    var n, a
                }
                function l(e, r, t, o, i, s, n) {
                    return a(r & t | ~r & o, e, r, i, s, n)
                }
                function u(e, r, t, o, i, s, n) {
                    return a(r & o | t & ~o, e, r, i, s, n)
                }
                function p(e, r, t, o, i, s, n) {
                    return a(r ^ t ^ o, e, r, i, s, n)
                }
                function m(e, r, t, o, i, s, n) {
                    return a(t ^ (r | ~o), e, r, i, s, n)
                }
                function K(e, r) {
                    var t = (65535 & e) + (65535 & r);
                    return (e >> 16) + (r >> 16) + (t >> 16) << 16 | 65535 & t
                }
                return e = e ? function(e) {
                    for (var r = i ? "0123456789ABCDEF" : "0123456789abcdef", t = "", o = 0; o < 4 * e.length; o++)
                        t += r.charAt(e[o >> 2] >> o % 4 * 8 + 4 & 15) + r.charAt(e[o >> 2] >> o % 4 * 8 & 15);
                    return t
                }(function(e, r) {
                    e[r >> 5] |= 128 << r % 32,
                    e[14 + (r + 64 >>> 9 << 4)] = r;
                    for (var t = 1732584193, o = -271733879, i = -1732584194, s = 271733878, n = 0; n < e.length; n += 16) {
                        var a = t
                          , g = o
                          , c = i
                          , d = s;
                        t = l(t, o, i, s, e[n + 0], 7, -680876936),
                        s = l(s, t, o, i, e[n + 1], 12, -389564586),
                        i = l(i, s, t, o, e[n + 2], 17, 606105819),
                        o = l(o, i, s, t, e[n + 3], 22, -1044525330),
                        t = l(t, o, i, s, e[n + 4], 7, -176418897),
                        s = l(s, t, o, i, e[n + 5], 12, 1200080426),
                        i = l(i, s, t, o, e[n + 6], 17, -1473231341),
                        o = l(o, i, s, t, e[n + 7], 22, -45705983),
                        t = l(t, o, i, s, e[n + 8], 7, 1770035416),
                        s = l(s, t, o, i, e[n + 9], 12, -1958414417),
                        i = l(i, s, t, o, e[n + 10], 17, -42063),
                        o = l(o, i, s, t, e[n + 11], 22, -1990404162),
                        t = l(t, o, i, s, e[n + 12], 7, 1804603682),
                        s = l(s, t, o, i, e[n + 13], 12, -40341101),
                        i = l(i, s, t, o, e[n + 14], 17, -1502002290),
                        o = l(o, i, s, t, e[n + 15], 22, 1236535329),
                        t = u(t, o, i, s, e[n + 1], 5, -165796510),
                        s = u(s, t, o, i, e[n + 6], 9, -1069501632),
                        i = u(i, s, t, o, e[n + 11], 14, 643717713),
                        o = u(o, i, s, t, e[n + 0], 20, -373897302),
                        t = u(t, o, i, s, e[n + 5], 5, -701558691),
                        s = u(s, t, o, i, e[n + 10], 9, 38016083),
                        i = u(i, s, t, o, e[n + 15], 14, -660478335),
                        o = u(o, i, s, t, e[n + 4], 20, -405537848),
                        t = u(t, o, i, s, e[n + 9], 5, 568446438),
                        s = u(s, t, o, i, e[n + 14], 9, -1019803690),
                        i = u(i, s, t, o, e[n + 3], 14, -187363961),
                        o = u(o, i, s, t, e[n + 8], 20, 1163531501),
                        t = u(t, o, i, s, e[n + 13], 5, -1444681467),
                        s = u(s, t, o, i, e[n + 2], 9, -51403784),
                        i = u(i, s, t, o, e[n + 7], 14, 1735328473),
                        o = u(o, i, s, t, e[n + 12], 20, -1926607734),
                        t = p(t, o, i, s, e[n + 5], 4, -378558),
                        s = p(s, t, o, i, e[n + 8], 11, -2022574463),
                        i = p(i, s, t, o, e[n + 11], 16, 1839030562),
                        o = p(o, i, s, t, e[n + 14], 23, -35309556),
                        t = p(t, o, i, s, e[n + 1], 4, -1530992060),
                        s = p(s, t, o, i, e[n + 4], 11, 1272893353),
                        i = p(i, s, t, o, e[n + 7], 16, -155497632),
                        o = p(o, i, s, t, e[n + 10], 23, -1094730640),
                        t = p(t, o, i, s, e[n + 13], 4, 681279174),
                        s = p(s, t, o, i, e[n + 0], 11, -358537222),
                        i = p(i, s, t, o, e[n + 3], 16, -722521979),
                        o = p(o, i, s, t, e[n + 6], 23, 76029189),
                        t = p(t, o, i, s, e[n + 9], 4, -640364487),
                        s = p(s, t, o, i, e[n + 12], 11, -421815835),
                        i = p(i, s, t, o, e[n + 15], 16, 530742520),
                        o = p(o, i, s, t, e[n + 2], 23, -995338651),
                        t = m(t, o, i, s, e[n + 0], 6, -198630844),
                        s = m(s, t, o, i, e[n + 7], 10, 1126891415),
                        i = m(i, s, t, o, e[n + 14], 15, -1416354905),
                        o = m(o, i, s, t, e[n + 5], 21, -57434055),
                        t = m(t, o, i, s, e[n + 12], 6, 1700485571),
                        s = m(s, t, o, i, e[n + 3], 10, -1894986606),
                        i = m(i, s, t, o, e[n + 10], 15, -1051523),
                        o = m(o, i, s, t, e[n + 1], 21, -2054922799),
                        t = m(t, o, i, s, e[n + 8], 6, 1873313359),
                        s = m(s, t, o, i, e[n + 15], 10, -30611744),
                        i = m(i, s, t, o, e[n + 6], 15, -1560198380),
                        o = m(o, i, s, t, e[n + 13], 21, 1309151649),
                        t = m(t, o, i, s, e[n + 4], 6, -145523070),
                        s = m(s, t, o, i, e[n + 11], 10, -1120210379),
                        i = m(i, s, t, o, e[n + 2], 15, 718787259),
                        o = m(o, i, s, t, e[n + 9], 21, -343485551),
                        t = K(t, a),
                        o = K(o, g),
                        i = K(i, c),
                        s = K(s, d)
                    }
                    return Array(t, o, i, s)
                }(function(e) {
                    for (var r = Array(), t = (1 << s) - 1, o = 0; o < e.length * s; o += s)
                        r[o >> 5] |= (e.charCodeAt(o / s) & t) << o % 32;
                    return r
                }(r = e), r.length * s)) : ""
            }
        """)
        return js.call('Md5', g)

    return md5(hashlib.md5(e().encode('utf-8')).hexdigest())


def getUrl(file_hash):
    params3 = {
        'cmd': 'playInfo',
        'hash': file_hash,
        'from': 'mkugou',
        'apiver': 2,
        'mid': guid(),
        'userid': 0,
        'platid': 4,
        'dfid': ''
    }
    url = 'http://m.kugou/api/v1/song/get_song_info'
    headers3 = {
        'Referer': 'http://m.kugou/search/index',
        'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
    }
    song_info = requests.get(url, params=params3, headers=headers3).json()
    if song_info['errcode'] == 0:
        if song_info['url']:
            # print('{} 已找到,准备下载!'.format(song_info['data']['audio_name']))
            return song_info['url']
        else:
            print('{} 没有找到!'.format(song_info['fileName']))


def search_song(song_name):
    params = {
        'keyword': song_name,
        'page': '1',
        'pagesize': '30',
        'userid': '-1',
        'clientver': '',
        'platform': 'WebFilter',
        'tag': '',
        'filter': '2',
        'iscorrection': '1',
        'privilege_filter': '0',
        '_': int(time.time() * 1000)
    }
    get = requests.get('https://songsearch.kugou/song_search_v2', params=params, headers=headers)
    if get.status_code is 200:
        search_results = get.json()
        if search_results['error_code'] == 0:
            return search_results['data']['lists']


def download_song(file_name, file_hash):
    song_url = getUrl(file_hash)
    if song_url:
        with open(r'C:\Users\{}\Music\{}.m4a'.format(getpass.getuser(), file_name), 'wb') as f:
            f.write(requests.get(song_url).content)
        print('{} 下载完成!'.format(file_name))
        return True
    else:
        print('歌曲链接获取失败!')
        return False

酷狗音乐GUI.py

# -*- coding: utf-8 -*-
import sys

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

from 酷狗音乐 import search_song, download_song


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(792, 612)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.widget = QWidget(self.centralwidget)
        self.widget.setGeometry(QRect(5, 10, 781, 611))
        self.widget.setObjectName("widget")
        self.gridLayout = QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.lineEdit = QLineEdit(self.widget)
        self.lineEdit.setStyleSheet("    width: 249px;\n"
                                    "    height: 24px;\n"
                                    "    border: none;\n"
                                    "    margin-left: 14px;\n"
                                    "    padding: 5px 0;\n"
                                    "    color: #666;\n"
                                    "    font-size:20px;\n"
                                    "line-height:24px")
        self.lineEdit.setText("")
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton = QPushButton(self.widget)
        self.pushButton.setMinimumSize(QSize(100, 35))
        self.pushButton.setStyleSheet("QPushButton{\n"
                                      "    width: auto;\n"
                                      "    line-height: 28px;\n"
                                      "    border: 1px solid #169af3;\n"
                                      "    border-radius: 2px;\n"
                                      "    text-align: center;\n"
                                      "    color: #fff;\n"
                                      "    cursor: pointer;\n"
                                      "    background-color: #169af3;\n"
                                      "padding:5px 10px\n"
                                      "}\n"
                                      "\n"
                                      "QPushButton:hover{\n"
                                      "    color: #fff;\n"
                                      "    border: 1px solid #158fe1;\n"
                                      "    background-color: #158fe1;\n"
                                      "}")
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.search_song)

        self.horizontalLayout.addWidget(self.pushButton)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
        self.listWidget = QListWidget(self.widget)
        self.listWidget.setObjectName("listView")
        self.gridLayout.addWidget(self.listWidget, 1, 0, 1, 1)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

    def search_song(self):
        self.listWidget.clear()
        self.song_lists = search_song(self.lineEdit.text())
        for song in self.song_lists:
            file_name = song['FileName']
            self.listWidget.addItem(file_name)
        self.listWidget.doubleClicked.connect(self.download_song)

    def download_song(self, item):
        row_index = item.row()
        song = self.song_lists[row_index]
        down_result = download_song(song['FileName'], song['FileHash'])
        if down_result:
            QMessageBox.information(self.widget, "消息", "下载成功!")
        else:
            QMessageBox.critical(self.widget, "消息", "下载失败!")

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "搜索音乐下载器"))
        self.pushButton.setText(_translate("MainWindow", "搜索"))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = QWidget()
    ui = Ui_MainWindow()
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())

本文标签: 音乐下载酷狗PythonGUI