Всё-таки решил разобраться с API vk.com, да и написать под себя скрипт. Вконтакте я использую всё же больше как плеер и поисковик музыки, нежели как социальную сеть, поэтому иметь хорошую скачивалку музыки под рукой было бы очень не плохо.
Начну с того, как же все таки работать с API. Под Python есть хорошая либа - vkontakte (ставится без проблем через pip), но просто подключение ее ничего не даст(что логично), необходимо зарегать своё приложение, как это делается написано тут: http://habrahabr.ru/post/125155/. Там вам дадут защищенный ключ и ID приложения, с помощью которых необходимо получить токен. Токен - это некоторая длинная замысловатая строка, которая необходима для получения определенных прав и свобод для работы с vk.com. Собственно получить его можно вбив в строку браузера что-то подобное: http://oauth.vk.com/authorize?client_id=ID ВАШЕГО ПРИЛОЖЕНИЯ&scope=audio(ПОЛУЧИМ ДОСТУП К АУДИО)&response_type=token, вас пошлют на страничку, в адресной строке которой можно и увидеть пресловутый токен(выглядит он примерно так: "9d791f49d29a92ea9d19f7da559d6df31e99d409d404a6dcd989bf1baa42bb3"). Всё, токен получили можно действовать. Справка по API описана тут:
Итак, что нам нужно сделать? Во первых получить всю музыку и сотворить некие функции по работе с ней. Реализуем следующие функции:
Печать всех композий
def printAllAudio(audio):
subprocess.call("clear")
for i in xrange(len(audio)):
print str(i)+" "+audio[i]["artist"]+" - "+audio[i]["title"]
subprocess.call("clear")
for i in xrange(len(audio)):
print str(i)+" "+audio[i]["artist"]+" - "+audio[i]["title"]
Скачка одной композиции по её номеру:
def downloadOnNumber(audio, number):
nameFileNew=audio[number]["artist"]+" - "+audio[number]["title"]
print "GET FILE: "+nameFileNew
print "FILE NUMBER: "+str(number)
subprocess.call(['wget', audio[number]["url"]])
p=re.compile(r"[0-9a-zA-Z]+\.mp3$")
nameFileOld=p.findall(audio[number]["url"])
os.rename(nameFileOld[0],nameFileNew+".mp3")
nameFileNew=audio[number]["artist"]+" - "+audio[number]["title"]
print "GET FILE: "+nameFileNew
print "FILE NUMBER: "+str(number)
subprocess.call(['wget', audio[number]["url"]])
p=re.compile(r"[0-9a-zA-Z]+\.mp3$")
nameFileOld=p.findall(audio[number]["url"])
os.rename(nameFileOld[0],nameFileNew+".mp3")
Cкачка всех композиций:
def dounloadAllFiles(audio):
for i in xrange(len(audio)):
downloadOnNumber(audio, i)
for i in xrange(len(audio)):
downloadOnNumber(audio, i)
Скачка по названию группы:
def downloadOnArtist(audio, artist):
kol=0
for i in xrange(len(audio)):
if audio[i]["artist"] in artist:
downloadOnNumber(audio, i)
kol+=1
return kol
kol=0
for i in xrange(len(audio)):
if audio[i]["artist"] in artist:
downloadOnNumber(audio, i)
kol+=1
return kol
Скачка по названию песни:
def downloadOnComposition(audio, composition):
kol=0
for i in xrange(len(audio)):
if audio[i]["title"] in composition:
downloadOnNumber(audio, i)
kol+=1
return kol
kol=0
for i in xrange(len(audio)):
if audio[i]["title"] in composition:
downloadOnNumber(audio, i)
kol+=1
return kol
Скачка по интервалу:
def dowloadOnInterval(a, b):
for i in xrange(a, b+1):
downloadOnNumber(audio, i)
for i in xrange(a, b+1):
downloadOnNumber(audio, i)
Как видим, достаточно широкий функционал получился :) Используем внешнюю утилиту wget, которая обладает очень красивым выхлопом. Примерно все выглядит таким образом:
Теперь неплохо было бы все сделать в консоль-стайл, предусмотреть команды, а также слабенькую защиту от дурачка.
В общем тянуть не буду, все выглядит примерно так:
audio=vk.audio.get(uid='ВАШ ID vk.com')
count=len(audio)
print "Введите команду: "
command=raw_input().split()
if command[0]=="help":
subprocess.call("clear")
print "Доступные команды: "
print "grub +"
print "-all = скачать все песни из аудио"
print "-s = скачать песню по её названию (пробел) название песни"
print "-ar = скачать песню по название группы(имя артиста) (пробел) имя артиста(группы):"
print "-print = распечатать все песни и их номер"
print "-n = cкачать по номеру (пробел) номер песни"
print "-i = скачать по интрервалу (пробел) первое число (пробел) второе число"
elif command[0]=="grub":
if command[1]=="-all":
dounloadAllFiles(audio)
elif command[1]=="-ar":
kol=downloadOnArtist(audio, joinOther(command))
if kol==0: print "Нет совпадений в имени!"
elif command[1]=="-s":
kol=downloadOnComposition(audio, joinOther(command))
if kol==0: print "Нет совпадений в имени!"
elif command[1]=="-print":
printAllAudio(audio)
elif command[1]=="-n":
if command[2].isdigit()==False: print "Это не числовое значение!"
elif 1<int(command[2])<count: downloadOnNumber(audio, int(command[2]))
else: print "Песни с таким номером нет!"
elif command[1]=="-i":
if command[2].isdigit()==False or command[3].isdigit()==False: print "Это не числовое значение!"
elif int(command[2])>int(command[3]): print "Первое значение интервала должно быть меньше второго!"
elif int(command[2])<1 or int(command[3])<1 or int(command[2])>count or int(command[3])>count: print "Введите значения от 1 до числа композиций"
else: dowloadOnInterval(int(command[2]), int(command[3]))
else: print command[0]+"- Не, не слышал :)"
count=len(audio)
print "Введите команду: "
command=raw_input().split()
if command[0]=="help":
subprocess.call("clear")
print "Доступные команды: "
print "grub +"
print "-all = скачать все песни из аудио"
print "-s = скачать песню по её названию (пробел) название песни"
print "-ar = скачать песню по название группы(имя артиста) (пробел) имя артиста(группы):"
print "-print = распечатать все песни и их номер"
print "-n = cкачать по номеру (пробел) номер песни"
print "-i = скачать по интрервалу (пробел) первое число (пробел) второе число"
elif command[0]=="grub":
if command[1]=="-all":
dounloadAllFiles(audio)
elif command[1]=="-ar":
kol=downloadOnArtist(audio, joinOther(command))
if kol==0: print "Нет совпадений в имени!"
elif command[1]=="-s":
kol=downloadOnComposition(audio, joinOther(command))
if kol==0: print "Нет совпадений в имени!"
elif command[1]=="-print":
printAllAudio(audio)
elif command[1]=="-n":
if command[2].isdigit()==False: print "Это не числовое значение!"
elif 1<int(command[2])<count: downloadOnNumber(audio, int(command[2]))
else: print "Песни с таким номером нет!"
elif command[1]=="-i":
if command[2].isdigit()==False or command[3].isdigit()==False: print "Это не числовое значение!"
elif int(command[2])>int(command[3]): print "Первое значение интервала должно быть меньше второго!"
elif int(command[2])<1 or int(command[3])<1 or int(command[2])>count or int(command[3])>count: print "Введите значения от 1 до числа композиций"
else: dowloadOnInterval(int(command[2]), int(command[3]))
else: print command[0]+"- Не, не слышал :)"
Всё работает на ура;) Теперь можно качать любимые песни не выходя из не менее любимой консоли))
Комментариев нет:
Отправить комментарий