Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Python: vkontakte.ru (vk.com) audio music downloader
# -*- 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()
@acriptis

This comment has been minimized.

Copy link

commented Jan 10, 2014

Спасибо, Алексей! Если дашь биткойн адрес я тебе на пиво донейтну ;)

@st4lk

This comment has been minimized.

Copy link
Owner Author

commented Jan 13, 2014

Пожалуйста! Всегда приятно получать такие комменты :)
18YEv2aj3sUgAS3W5JJpbkShQTCP2b4hev

@manviemes

This comment has been minimized.

Copy link

commented Mar 5, 2015

a kak naprimer mogno vse muzyku ot gruppy ska4at, esli takoy URL http://vk.com/audios-xxxxxxxxx

@nickus83

This comment has been minimized.

Copy link

commented Jun 5, 2015

При скачивании, в консоли, названия песен с не английскими названиями отображаются некорректно. В папке, на диске, названия песен правильные.
После замены 104 строки на ' print "Downloading", t_name ', в консоли отображается правильно.

@ice2heart

This comment has been minimized.

Copy link

commented Jun 26, 2015

Спасибо за скрипт!
Я его немного модифицировал, (добавил gevent) и он стал ещё лучше ( с 30 минут до 7) https://gist.github.com/ice2heart/fc34a1b40cbde5cf2d4c может кому пригодится.

@Banan-Telefon

This comment has been minimized.

Copy link

commented Oct 24, 2015

К моему удивлению, скомпилировал код и не умудрился поднагадить на этапе вбивки параметров. Обычно я просто убиваю и нечаянно ломаю любой доступный полезный инструмент созданный для социума. Скрипт* работает со списком просто на отлично. А можно как-то вывести этот самый список (плейлист) в отдельный JSON файл? На каком этапе текста, мне нужно вписать "копирование" текущего имени (или полное название трека) в отдельный массив или список? Я просто не кодер и тугой, но мне нужен файл в формате джейсона с списком треков из плейлиста. Жду и надеюсь на отзыв хотябы по прошествии 2 лет. Спс.

@jksisme

This comment has been minimized.

Copy link

commented Nov 2, 2015

This script was extremely helpful. Thanks!

@djgelius

This comment has been minimized.

Copy link

commented Jan 27, 2016

как запускать его для скачивания определенного файла?

@tz4678

This comment has been minimized.

Copy link

commented Feb 21, 2016

Сколько говноедов

@e3e6

This comment has been minimized.

Copy link

commented Apr 20, 2016

Для запуска этого скрипта нужен Python 2.7
Русские символы не распознаются

@Dront

This comment has been minimized.

Copy link

commented Jul 11, 2016

Портировал на третий питон, добавил асинхронное скачивание через asyncio. Лежит тут.
А все потому, что они опять выпилили часть музыки из-за правообладателей, и даже не сказали что конкретно выпилили.
Крутой скрипт, спасибо :)

@isanosyan

This comment has been minimized.

Copy link

commented Jul 24, 2016

Спасибо!

Вот небольшой фикс для кириллицы в ревизии от 23 февраля 2016.

@st4ycool

This comment has been minimized.

Copy link

commented Nov 2, 2016

Этот скрипт сейчас актуален?

@lolwat97

This comment has been minimized.

Copy link

commented Nov 5, 2016

@st4ycool вроде да, у меня работал, пока ноут в сон не отправил

@lolwat97

This comment has been minimized.

Copy link

commented Nov 5, 2016

@st4lk вопрос -- у меня, видимо, работал этот скрипт, когда я закрыл крышку ноута и отправил его в сон. Теперь при запуске:

Traceback (most recent call last):
  File "main.py", line 122, in <module>
    main()
  File "main.py", line 112, in main
    tracks = get_tracks_metadata(access_token, user_id)
  File "main.py", line 87, in get_tracks_metadata
    return json.loads(audio_get_page)['response']
KeyError: 'response'

С вкшным API не работал, это в чем проблема?

@x603

This comment has been minimized.

Copy link

commented Nov 11, 2016

Спасибо за скрипт, работает отлично! Только api.vkontakte.ru устарело, теперь api.vk.com

@st4ycool

This comment has been minimized.

Copy link

commented Nov 15, 2016

@lolwat97 решается изменением api.vkontakte.ru на api.vk.com

@MetaKeks

This comment has been minimized.

Copy link

commented Dec 17, 2016

Всё, кончилась малина, с 16 декабря VK закрыл скачивание музыки для сторонних API/приложений....

"Вот и наступило 17 декабря.
Доступ к api VK закрыт для сторонних приложений.

Последняя песня звучит так.
Прощай музыка из VK в телеграме."

Скрипт тоже не работает, отвечает "Downloading Аудио доступно на vk.com_и в официальных приложениях ВКонтакте.mp3
Saved file Аудио доступно на vk.com_и в официальных приложениях ВКонтакте.mp3"...

@daranger

This comment has been minimized.

Copy link

commented Dec 24, 2016

Есть аналог audio api вконтакте - api.я.ws

@hulitolku

This comment has been minimized.

Copy link

commented Jun 17, 2018

Чет не фурыжит, пару раз запустилось, (сконвертилс адрес) и все, тишина.

@support4ert

This comment has been minimized.

Copy link

commented Aug 1, 2018

заебись я его взломал пбка

@kamronbek29

This comment has been minimized.

Copy link

commented Sep 5, 2018

здраствуйте, а через этот скрипт можно скачать песню со всего вк? Или только с определенного user id?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.