Skip to content

Instantly share code, notes, and snippets.

@kuznetsov-m
Last active August 19, 2021 21:38
Show Gist options
  • Save kuznetsov-m/c628fb8d860d6146ddc7d56f5116f425 to your computer and use it in GitHub Desktop.
Save kuznetsov-m/c628fb8d860d6146ddc7d56f5116f425 to your computer and use it in GitHub Desktop.
# requirements.txt
# vk-api==11.9.4
# bs4
#
import vk_api
from vk_api.audio import VkAudio
import requests
import shutil
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def captcha_handler(captcha):
""" При возникновении капчи вызывается эта функция и ей передается объект
капчи. Через метод get_url можно получить ссылку на изображение.
Через метод try_again можно попытаться отправить запрос с кодом капчи
"""
f = open('image.png', 'wb')
f.write(captcha.get_image())
f.close()
key = input("Enter captcha code {0}: ".format(captcha.get_url())).strip()
# Пробуем снова отправить запрос с капчей
return captcha.try_again(key)
login, password = '', ''
vk_session = vk_api.VkApi(login, password, captcha_handler=captcha_handler)
try:
vk_session.auth()
except vk_api.AuthError as error_msg:
print(error_msg)
vkaudio = VkAudio(vk_session)
user_id = 12345678
tracks_path = 'tracks'
def make_safe_filename(filename):
keepcharacters = (' ','.','-','_','(',')',',','[',']','&','\'')
return "".join(c for c in filename if c.isalnum() or c in keepcharacters).rstrip()[:255]
for track in vkaudio.get_iter():
try:
original_filename = f'{track.get("artist")} - {track.get("title")}.mp3'
filename = make_safe_filename(original_filename)
print(f'{"!!! " if original_filename != filename else ""}{original_filename} -> {filename}')
r = requests.get(track.get('url'), verify=False, stream=True)
r.raw.decode_content = True
with open(f'{tracks_path}/{filename}', 'wb') as f:
shutil.copyfileobj(r.raw, f)
except Exception as e:
print(f'Exception: {e}')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment