-
-
Save st4lk/4708673 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*- | |
""" | |
Скрипт для скачивания музыки с сайта vkontakte.ru (vk.com) | |
Запуск: | |
python vkcom_audio_download.py | |
Принцип работы: | |
Скрипт проверяет сохраненный access_token. Если его нет или срок истек, | |
то открывается страница в браузере с запросом на доступ к аккаунту. | |
После подтверждения идет редирект на https://oauth.vk.com/blank.htm#... . | |
Нужно скопировать весь url, на который вас редиректнуло и вставить его | |
в консоль скрипта. | |
Далее будут скачиваться все ваши аудиозаписи. Если аудиозапись уже есть на | |
диске - то скачивания не происходит. | |
Будут запрошены ваши данные приложением с app_id = 3358129 | |
Можно создать свое Standalone-приложение с доступом к аудио здесь: | |
http://vk.com/editapp?act=create | |
И заменить APP_ID на ваше. | |
""" | |
import webbrowser | |
import pickle | |
import json | |
import urllib | |
import urllib2 | |
import HTMLParser | |
import re | |
import os | |
import urlparse | |
from datetime import datetime, timedelta | |
# id of vk.com application, that has access to audio | |
APP_ID = '3358129' | |
# if None, then save mp3 in current folder | |
MUSIC_FOLDER = 'music' | |
# file, where auth data is saved | |
AUTH_FILE = '.auth_data' | |
# chars to exclude from filename | |
FORBIDDEN_CHARS = '/\\\?%*:|"<>!' | |
def get_saved_auth_params(): | |
access_token = None | |
user_id = None | |
try: | |
with open(AUTH_FILE, 'rb') as pkl_file: | |
token = pickle.load(pkl_file) | |
expires = pickle.load(pkl_file) | |
uid = pickle.load(pkl_file) | |
if datetime.now() < expires: | |
access_token = token | |
user_id = uid | |
except IOError: | |
pass | |
return access_token, user_id | |
def save_auth_params(access_token, expires_in, user_id): | |
expires = datetime.now() + timedelta(seconds=int(expires_in)) | |
with open(AUTH_FILE, 'wb') as output: | |
pickle.dump(access_token, output) | |
pickle.dump(expires, output) | |
pickle.dump(user_id, output) | |
def get_auth_params(): | |
auth_url = ("https://oauth.vk.com/authorize?client_id={app_id}" | |
"&scope=audio&redirect_uri=http://oauth.vk.com/blank.html" | |
"&display=page&response_type=token".format(app_id=APP_ID)) | |
webbrowser.open_new_tab(auth_url) | |
redirected_url = raw_input("Paste here url you were redirected:\n") | |
aup = urlparse.parse_qs(redirected_url) | |
aup['access_token'] = aup.pop( | |
'https://oauth.vk.com/blank.html#access_token') | |
save_auth_params(aup['access_token'][0], aup['expires_in'][0], | |
aup['user_id'][0]) | |
return aup['access_token'][0], aup['user_id'][0] | |
def get_tracks_metadata(access_token, user_id): | |
url = ("https://api.vkontakte.ru/method/audio.get.json?" | |
"uid={uid}&access_token={atoken}".format( | |
uid=user_id, atoken=access_token)) | |
audio_get_page = urllib2.urlopen(url).read() | |
return json.loads(audio_get_page)['response'] | |
def get_track_full_name(t_data): | |
html_parser = HTMLParser.HTMLParser() | |
full_name = u"{0}_{1}".format( | |
html_parser.unescape(t_data['artist'][:100]).strip(), | |
html_parser.unescape(t_data['title'][:100]).strip(), | |
) | |
full_name = re.sub('[' + FORBIDDEN_CHARS + ']', "", full_name) | |
full_name = re.sub(' +', ' ', full_name) | |
return full_name + ".mp3" | |
def download_track(t_url, t_name): | |
t_path = os.path.join(MUSIC_FOLDER or "", t_name) | |
if not os.path.exists(t_path): | |
print "Downloading {0}".format(t_name.encode('ascii', 'replace')) | |
urllib.urlretrieve(t_url, t_path) | |
def main(): | |
access_token, user_id = get_saved_auth_params() | |
if not access_token or not user_id: | |
access_token, user_id = get_auth_params() | |
tracks = get_tracks_metadata(access_token, user_id) | |
if MUSIC_FOLDER and not os.path.exists(MUSIC_FOLDER): | |
os.makedirs(MUSIC_FOLDER) | |
for t in tracks: | |
t_name = get_track_full_name(t) | |
download_track(t['url'], t_name) | |
print "All music is up to date" | |
if __name__ == '__main__': | |
main() |
Спасибо за скрипт!
Я его немного модифицировал, (добавил gevent) и он стал ещё лучше ( с 30 минут до 7) https://gist.github.com/ice2heart/fc34a1b40cbde5cf2d4c может кому пригодится.
К моему удивлению, скомпилировал код и не умудрился поднагадить на этапе вбивки параметров. Обычно я просто убиваю и нечаянно ломаю любой доступный полезный инструмент созданный для социума. Скрипт* работает со списком просто на отлично. А можно как-то вывести этот самый список (плейлист) в отдельный JSON файл? На каком этапе текста, мне нужно вписать "копирование" текущего имени (или полное название трека) в отдельный массив или список? Я просто не кодер и тугой, но мне нужен файл в формате джейсона с списком треков из плейлиста. Жду и надеюсь на отзыв хотябы по прошествии 2 лет. Спс.
This script was extremely helpful. Thanks!
как запускать его для скачивания определенного файла?
Сколько говноедов
Для запуска этого скрипта нужен Python 2.7
Русские символы не распознаются
Портировал на третий питон, добавил асинхронное скачивание через asyncio. Лежит тут.
А все потому, что они опять выпилили часть музыки из-за правообладателей, и даже не сказали что конкретно выпилили.
Крутой скрипт, спасибо :)
Спасибо!
Вот небольшой фикс для кириллицы в ревизии от 23 февраля 2016.
Этот скрипт сейчас актуален?
Спасибо за скрипт, работает отлично! Только api.vkontakte.ru устарело, теперь api.vk.com
@lolwat97 решается изменением api.vkontakte.ru на api.vk.com
Всё, кончилась малина, с 16 декабря VK закрыл скачивание музыки для сторонних API/приложений....
"Вот и наступило 17 декабря.
Доступ к api VK закрыт для сторонних приложений.
Последняя песня звучит так.
Прощай музыка из VK в телеграме."
Скрипт тоже не работает, отвечает "Downloading Аудио доступно на vk.com_и в официальных приложениях ВКонтакте.mp3
Saved file Аудио доступно на vk.com_и в официальных приложениях ВКонтакте.mp3"...
Есть аналог audio api вконтакте - api.я.ws
Чет не фурыжит, пару раз запустилось, (сконвертилс адрес) и все, тишина.
заебись я его взломал пбка
здраствуйте, а через этот скрипт можно скачать песню со всего вк? Или только с определенного user id?
А можно скачивать отдельную песню вк?
На php было б лучше
привет, можешь сделать такой же скрипт, только чтобы скрипт скачивал трек из вк по ссылке
@CHUKEPC маловероятно, они закрыли api.
youtube-dl -v -u <email/phone_number> -p <password> -vg "https://vk.com/video-133441491_456261066"
попробуй youtube-dl
При скачивании, в консоли, названия песен с не английскими названиями отображаются некорректно. В папке, на диске, названия песен правильные.
После замены 104 строки на ' print "Downloading", t_name ', в консоли отображается правильно.