Unduh musik VKontakte

Hari baik untuk semua


Saya ingin mengunduh semua musik saya dari VKontakte ke USB flash drive, seperti di masa lalu yang indah. Sedikit googling dan tidak menemukan sesuatu yang kurang lebih dapat diterima, saya memutuskan untuk bertindak sendiri. Setelah setengah jam, kami mendapatkan naskah yang berfungsi untuk diri kami sendiri. Jadi mari kita mulai.


Agar berfungsi, Anda perlu mengunduh vk_api dan meminta modul!


Untuk memulai, sambungkan modul yang diperlukan dan deklarasikan beberapa variabel:


import os import pickle import vk_api import requests from vk_api import audio from time import time vk_file = "vk_config.v2.json" REQUEST_STATUS_CODE = 200 path = 'vk_music/' 

Sekarang kami akan menulis metode otorisasi ke akun VKontakte Anda:


 def Auth(new=False): try: USERDATA_FILE = r"AppData/UserData.datab" #  ,   id global my_id #   ,         # ,     ?  ,   if (os.path.exists(USERDATA_FILE) and new == False): with open(USERDATA_FILE, 'rb') as DataFile: LoadedData = pickle.load(DataFile) login = LoadedData[0] password = LoadedData[1] my_id = LoadedData[2] else: #  ,     ,        if (os.path.exists(USERDATA_FILE) and new == True): os.remove(USERDATA_FILE) login = str(input(" \n> ")) password = str(input(" \n> ")) my_id = str(input(" id \n> ")) SaveUserData(login, password, my_id) SaveData = [login, password, my_id] with open(USERDATA_FILE, 'wb') as dataFile: pickle.dump(SaveData, dataFile) #    vk_session = vk_api.VkApi(login=login, password=password) try: vk_session.auth() #  ,   ,      .   . except: vk_session = vk_api.VkApi(login=login, password=password, auth_handler=auth_handler) # auth_handler=auth_handler -  , .  vk_session.auth() print('  .') vk = vk_session.get_api() global vk_audio #  ,       vk_audio = audio.VkAudio(vk_session) except KeyboardInterrupt: print('   .') 

Metode akan memeriksa apakah kita sudah login sebelumnya? Jika ini terjadi, maka Anda dapat melanjutkan di akun ini, atau masuk lagi. Dalam hal ini, data lama akan dihapus.


Selanjutnya, kami menulis metode auth_handler, yang diperlukan untuk otorisasi dalam akun di mana otentikasi dua faktor diaktifkan:


 def auth_handler(): code = input("  \n> ") remember_device = True # True -         return code, remember_device 

Jadi, sekarang kita bisa masuk ke VKontakte. Dalam metode Auth, metode SaveUserData () disebutkan, diperlukan untuk menyimpan data. Mari kita tulis:


 def SaveUserData(login, password, profile_id): USERDATA_FILE = r"AppData/UserData.datab" if (not os.path.exists("AppData")): #    AppData -   os.mkdir("AppData") SaveData = [login, password, profile_id] #     with open(USERDATA_FILE, 'wb') as dataFile: #      pickle.dump(SaveData, dataFile) 

Data akan direkam dalam bentuk biner, agar tidak menyimpan login dan kata sandi pengguna dalam bentuk yang jelas.


Tetap menulis metode untuk mengunduh audio dari VKontakte, mari kita lakukan ini:


 def main(): try: if (not os.path.exists("AppData")): os.mkdir("AppData") if not os.path.exists(path): os.makedirs(path) #  ,    -     auth_dialog = str(input(" ? yes/no\n> ")) if (auth_dialog == "yes"): Auth(new=True) elif (auth_dialog == "no"): Auth(new=False) else: print(',  .') main() print('  ...') os.chdir(path) #   audio = vk_audio.get(owner_id=my_id)[0] print(' :', len(vk_audio.get(owner_id=my_id)), '.') count = 0 time_start = time() print(" ...\n") #  , ,    . for i in vk_audio.get(owner_id=my_id): try: print(': ' + i["artist"] + " - " + i["title"]) count += 1 r = requests.get(audio["url"]) if r.status_code == REQUEST_STATUS_CODE: print(' : ' + i["artist"] + " - " + i["title"]) with open(i["artist"] + ' - ' + i["title"] + '.mp3', 'wb') as output_file: output_file.write(r.content) except OSError: print("!!!     №", count) time_finish = time() print("" + vk_audio.get(owner_id=my_id) + "   : ", time_finish - time_start + " .") except KeyboardInterrupt: print('   .') 

Yah, itu dia. Sekarang kami memiliki skrip yang berfungsi untuk mengunduh rekaman audio dari VKontakte.
Seperti inilah keseluruhan kode sumber:


Tampilkan kode sumber
 import os import pickle import vk_api import requests from vk_api import audio from time import time __version__ = 'VK Music Downloader v1.0' APP_MESSAGE = ''' _ . ___ /\\ | | | \\ | | | \\ / | / /__\\ | | | \\ | | | \\ / |/ / \\ |___| |__/ | |___| \\/ |\\ ''' vk_file = "vk_config.v2.json" REQUEST_STATUS_CODE = 200 path = 'vk_music/' def auth_handler(remember_device=None): code = input("  \n> ") if (remember_device == None): remember_device = True return code, remember_device def SaveUserData(login, password, profile_id): USERDATA_FILE = r"AppData/UserData.datab" SaveData = [login, password, profile_id] with open(USERDATA_FILE, 'wb') as dataFile: pickle.dump(SaveData, dataFile) def Auth(new=False): try: USERDATA_FILE = r"AppData/UserData.datab" #  ,   id global my_id if (os.path.exists(USERDATA_FILE) and new == False): with open(USERDATA_FILE, 'rb') as DataFile: LoadedData = pickle.load(DataFile) login = LoadedData[0] password = LoadedData[1] my_id = LoadedData[2] else: if (os.path.exists(USERDATA_FILE) and new == True): os.remove(USERDATA_FILE) login = str(input(" \n> ")) password = str(input(" \n> ")) my_id = str(input(" id \n> ")) SaveUserData(login, password, my_id) SaveData = [login, password, my_id] with open(USERDATA_FILE, 'wb') as dataFile: pickle.dump(SaveData, dataFile) vk_session = vk_api.VkApi(login=login, password=password) try: vk_session.auth() except: vk_session = vk_api.VkApi(login=login, password=password, auth_handler=auth_handler) vk_session.auth() print('  .') vk = vk_session.get_api() global vk_audio vk_audio = audio.VkAudio(vk_session) except KeyboardInterrupt: print('   .') def main(): try: if (not os.path.exists("AppData")): os.mkdir("AppData") if not os.path.exists(path): os.makedirs(path) auth_dialog = str(input(" ? yes/no\n> ")) if (auth_dialog == "yes"): Auth(new=True) elif (auth_dialog == "no"): Auth(new=False) else: print(',  .') main() print('  ...') os.chdir(path) #   audio = vk_audio.get(owner_id=my_id)[0] print(' :', len(vk_audio.get(owner_id=my_id)), '.') count = 0 time_start = time() #     print(" ...\n") #      for i in vk_audio.get(owner_id=my_id): try: print(': ' + i["artist"] + " - " + i["title"]) #         count += 1 r = requests.get(audio["url"]) if r.status_code == REQUEST_STATUS_CODE: print(' : ' + i["artist"] + " - " + i["title"]) with open(i["artist"] + ' - ' + i["title"] + '.mp3', 'wb') as output_file: output_file.write(r.content) except OSError: print("!!!     №", count) time_finish = time() print("" + vk_audio.get(owner_id=my_id) + "   : ", time_finish - time_start + " .") except KeyboardInterrupt: print('   .') if __name__ == '__main__': print(APP_MESSAGE) print(__version__ + "\n") main() 

Saya baru belajar, jadi saya akan senang dengan semua komentar dalam kode. Terima kasih atas perhatian anda

Source: https://habr.com/ru/post/id468735/


All Articles