Powershell: Качаем музыку из Вконтакте

Вчера вечером захотелось написать Powershell скрипт, который будет выкачивать аудиозаписи с личной страницы во Вконтакте и раскладывать их по альбомам, в смысле по папкам с именами альбомов в которых они состоят во Вконтакте. Если аудиозапись не состоит в каком-либо альбоме, то качается в папку "Без альбома".

Если добавить новые аудиозаписи, то в следующий раз скрипт скачает только новые, а те что уже скачаны качать не будет. Если же  что-то удалить из аудио-записей из вконтакте, то скрипт об этом напомнит, что мол на компьютере есть такие-то аудиозаписи, которых в вашей аудиоколлекции во вконтакте уже нет. Дальше сами решайте: удалять ли эти аудиозаписи с компьютера или пускай остаются.

Вот такой почти синхронизатор аудиоколлекции из вконтакте =)

В скрипте нужно указать две вещи: папку в которую сохранять аудио записи из вконтакте (у меня это D:\vk-music\) и токен.

Что такое токен и как его получить? Токен это своебразный ключ, по которому вконтакте будет понимать что вы - это вы.

Чтобы получить токен нужно перейти по ссылке:

https://oauth.vk.com/authorize?client_id=3711445&scope=audio&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.0&response_type=token

У вас запросят права на доступ к аудиозаписям и общей информации, нужно согласиться. После чего вы попадете на страницу с текстом:

Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту.

А в адресной строке браузера будет приблизительно такой адрес:

https://oauth.vk.com/blank.html#access_token=6fd83efcffc00be12345678901234567890123456789a23b7b73a4dc3e7c64ec5914768c8dbddd2d461af&expires_in=86400&user_id=24552345

Токен это то, что начинается после "access_token=" и заканчивается перед "&expires_in=86400". Его и вставляем в скрипт. Ниже привожу код скрипта в котором для примера вписаны мои токен и папка куда качать музыку (обязательно укажите СВОЙ токен и папку):

# Скрипт скачивает аудиозаписи из Вконтакте
# Автор: elims.org.ua
# Cсылка для получения токена:
# https://oauth.vk.com/authorize?client_id=3711445&scope=audio&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.0&response_type=token

# Ниже вставляем токен:
$token = "6fd83efcffc00be12345678901234567890123456789a23b7b73a4dc3e7c64ec5914768c8dbddd2d461af"
# Ниже вставляем адрес папки, куда нужно скачать музыку:
$music_path = "D:\vk-music\"

$uri = "https://api.vk.com/method/audio.getAlbums?v=5.24&access_token="+$token
$request = Invoke-WebRequest -Uri $uri #получаем список альбомов
$albums = $request.content | ConvertFrom-Json #Конвертируем полученные данные из формата JSON в массив
$uri = "https://api.vk.com/method/audio.get?v=5.24&need_user=0&access_token="+$token
$request = Invoke-WebRequest -Uri $uri #получаем список аудио
$audios = $request.content | ConvertFrom-Json #Конвертируем полученные данные из формата JSON в массив
$failed_audio = @() #создаем пустой массив, в нем будут хранится информация о неудачных загрузках
$audio_files = ls d:\vk-music\ -recurse | ?{!$_.psiscontainer} | select fullname #аудио-файлы которые уже ранее были скачаны
$audio_files = $audio_files | Foreach {[string]$_ -replace "@\{FullName=(.*)\}", '$1'} #убираем лишние символы
foreach ($audio in $audios.response.items) { #для каждого аудио
 if ($audio.album_id -ne $null) { #если аудио состоит в альбоме
  foreach ($album in $albums.response.items) { #ищем имя альбома
   if ($audio.album_id -eq $album.id) { $album_title = $album.title }
  }
 }
 else { #если аудио не состоит в альбоме
  $album_title = "Без альбома"
 }
 "Аудио " + ++$i + " из " + $audios.response.items.count + " : " + $audio.artist + " - " + $audio.title + " | Альбом: " + $album_title
 $path = $music_path + $album_title+ "\" #имя папки
 if (-not(Test-Path $path)) { #если папка не существует  
  $result = New-Item -ItemType directory -Path $path #создаем ее
 }
 $filename = $audio.artist + " - " + $audio.title + ".mp3" #формируем имя файла
 $filename = $filename -replace '(\\)|(\/)|(\*)|:|(\?)|"|<|>|(\|)|(\[)|(\])|(\n)', "_" #убираем некорректные знаки для имени файла
 $filename = $path + $filename #добавляем к имени файла папку
 "Имя файла: " + $filename
 if (-not(Test-Path $filename)) { #если такого файла не существует
  Invoke-WebRequest $audio.url -OutFile $filename #скачиваем и сохраняем аудио-файл
 }
 #перепроверяем наличие файла
 if (-not(Test-Path $filename)) { #если такого файла не существует
  $failed_audio += $audio.artist + " - " + $audio.title
 }
 else {
  $audio_files = $audio_files |? {$_ -ne $filename} #сохраняем какие файлы есть локально, но нет во вконтакте
 }
}
if ($failed_audio.count -gt 0) { #говорим какие файлы не удалось скачать
 "###################################################################"
 "Не скачанные файлы:"
 $failed_audio
}
if($audio_files.count -gt 0) {
 "###################################################################"
 "Файлы которые есть на компьютере но нет во вконтакте:"
 $audio_files
}

Токен имеет срок годности: сутки. Так что если вы однажды вписали в скрипт свой токен, то скрипт будет запускаться с ним только на протяжении 24-х часов. После нужно будет получить новый токен.

Сохраняем скрипт в текстовый файл с расширением ".ps1" (например в "D:\get-vk-mp3.ps1") и запускаем командой :

powershell  D:\get-vk-mp3.ps1
Понравилось? =) Поделись с друзьями:

Обсуждение записи “Powershell: Качаем музыку из Вконтакте”

  1. laom says:

    Чтобы токен жил вечно, надо в scope добавить offline
    https://oauth.vk.com/authorize?client_id=3711445&scope=audio,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.0&response_type=token

  2. Виктор says:

    Владимир привет.
    Спасибо за Ваши статьи, благодаря им узнал, что можно с VK работать через API.
    Но столкнулся с проблемой. Не получается залить фотографии в VK.

    отдельное приложение как указано сделал, права у него есть (scope=offline,photos,groups)
    Согласно мануалу получаю ссылку для загрузки фото, после чего пытаюсь залить фото, но в ответ получаю photos_list=[] и когда пробую выполнить метод photos.save получаю следующую ошибку (One of the parameters specified was missing or invalid: photos_list is invalid).
    Залить фотографию пытаюсь командой ($upload = Invoke-RestMethod -Uri $UURL -Method Post -ContentType «multipart/form-data» -InFile $picturefilePath) где $UURL полученный адрес сервера для загрузки файлов в результате метода photos.getUploadServer.
    Понимаю, что неправильно пытаюсь залить фото на сервер, но уже закончились мысли и к сожалению в интернет не смог найти ничего путного.

  3. Владимир Демянович (elims.org.ua) says:

    Виктор, добрый день. Загрузку музыки и изображений во вконтакте я не реализовывал. Поэтому ничего подсказать не могу по этому поводу

Обсудить