Вчера вечером захотелось написать 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
Чтобы токен жил вечно, надо в 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
Владимир привет.
Спасибо за Ваши статьи, благодаря им узнал, что можно с 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.
Понимаю, что неправильно пытаюсь залить фото на сервер, но уже закончились мысли и к сожалению в интернет не смог найти ничего путного.
Виктор, добрый день. Загрузку музыки и изображений во вконтакте я не реализовывал. Поэтому ничего подсказать не могу по этому поводу