Как получать музыку из ВКонтакте в 2022 году / Хабр

Началось все с того, что мне захотелось написать музыкального бота для своего discord сервера.

При проектировании проекта, я решил разделить его на две части. Первая — получение музыки из ВК. Вторая — сам бот. И начать я решил с первой части.

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

Я решил посмотреть что сейчас отдает ВКонтакте при воспроизведении записи и полез во вкладку network, вот что я там увидел:

ФотоНас интересует index.m3u8Открыв его мы видим GET запрос на сгенерированный ВКонтакте urlА ответ этого запроса представляет из себя просто HLS формат, с сегментами и их ключами декодирования если они закодированы

Теперь передо мной стояла новая задача, как получить с определенного аудио нужную ссылку на m3u8 файл и уже потом думать как его разбирать и собирать в дальнейшем в цельным mp3 файл.

В ходе раздумий был найден довольно простой вариант в виде библиотеки для питона vk_api и реализация получения такой ссылки через эту библиотеку выглядит так:

from vk_api import VkApi
from vk_api.audio import VkAudio
login = "+7XXXXXXXXXX"
password = "your_password"
vk_session = VKApi(
  login=login,
  password=password,
  api_version='5.81'
)
vk_session.auth()
vk_audio = VKAudio(vk_session)
# Делаем поиск аудио по названию
# Так же можно получать аудио со страницы функцией .get_iter(owner_id)
# где owner_id это айди страницы
# или же можно получить аудио с альбома, где мы сначала получаем айди альбомов
# функцией .get_albums_iter()
# и после снова вызываем .get_iter(owner_id, album_id), где album_id полученный
# айди альбома
q = "audio name"
audio = next(vk_audio.search_iter(q=q))
url = audio['url'] # получаем ту длиннющую ссылку на m3u8 файл

Вот мы и получили ссылку на этот файл и встал вопрос, а что делать дальше. Я попробовал запихнуть эту ссылку в ffmpeg и уже было обрадовался, ведь он скачал мой заветный аудиофайл и сразу же сделал конвертацию в mp3, однако, счастье мое длилось не долго, ведь ffmpeg хоть и скачал все сегменты, самостоятельно склеив их, но зашифрованные сегменты он не расшифровал, поэтому давайте еще раз взглянем на внутренности m3u8 файла

#EXTM3U
#EXT-X-TARGETDURATION:25
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="https://cs1-66v4.
vkuseraudio.net/s/v1/ac/wYaompMqHNQpBIh283wK68QVW45tvaJLaznkPiqES66JM-xzffiiM4KQx5WPS0Vg99U9ggCDronPKO8bzit3v_j8fH6LymN2pngBXYTv5uaDnFiAfc2aXv848bhRJEyFVB1gaJw1VR4BS9WnSb8jIMd0haPgfvJMcWC7FW7wpFkGU14/key.pub" #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:2.000, seg-1-a1.ts #EXT-X-KEY:METHOD=NONE #EXTINF:4.000, seg-2-a1.ts #EXTINF:20.000, seg-3-a1.ts #EXT-X-KEY:METHOD=AES-128,URI="https://cs1-66v4.vkuseraudio.net/s/v1/ac/wYaompMqHNQpBIh283wK68QVW45tvaJLaznkPiqES66JM-xzffiiM4KQx5WPS0Vg99U9ggCDronPKO8bzit3v_j8fH6LymN2pngBXYTv5uaDnFiAfc2aXv848bhRJEyFVB1gaJw1VR4BS9WnSb8jIMd0haPgfvJMcWC7FW7wpFkGU14/key.pub" #EXTINF:20.000, seg-4-a1.ts #EXT-X-KEY:METHOD=NONE #EXTINF:25.444, seg-5-a1.ts #EXT-X-ENDLIST

Мы видим, что перед зашифрованными сегментами в EXT-X-KEY указан метод шифровки AES-128 и ссылка на скачку ключа для расшифровки.

Для решения уже этой проблемы была найдена прекрасная библиотека m3u8 и pycryptodome:

import m3u8
import requests
from Crypto.Cipher import AES
from Crypto. Util.Padding import unpad
# Получаем этот самый m3u8 файл
m3u8_data = m3u8.load(
  url="" # Вставляем наш полученный ранее url
)
segments = m3u8.data.get("segments")
# Парсим файл в более удобный формат
segments_data = {}
for segment in segments:
  segment_uri = segment.get("uri")  
  extended_segment = {
    "segment_method": None,
    "method_uri": None
  }
  if segment.get("key").get("method") == "AES-128":
    extended_segment["segment_method"] = True
    extended_segment["method_uri"] = segment.get("key").get("uri")
    
	segments_data[segment_uri] = extended_segment
  
# И наконец качаем все сегменты с расшифровкой
uris = segments_data.keys()
downloaded_segments = []
for uri in uris:
  # Используем начальный url где мы подменяем index.m3u8 на наш сегмент
  audio = requests.get(url=index_url.replace("index.m3u8", uri))
  # Сохраняем .ts файл
  downloaded_segments.append(audio.content)
  # Если у сегмента есть метод, то расшифровываем его
  if segments_data.get(uri).get("segment_method") is not None:
    # Качаем ключ
    key_uri = segments_data.
get(uri).get("method_uri") key = requests.get(url=key_uri) iv = downloaded_segments[-1][0:16] ciphered_data = downloaded_segments[-1][16:] cipher = AES.new(key, AES.MODE_CBC, iv=iv) data = unpad(cipher.decrypt(ciphered_data), AES.block_size) downloaded_segments[-1] = data complete_segments = b''.join(downloaded_segments)

И наконец конвертируем все в mp3 формат, для чего нам понадобится установленный ffmpeg на ПК.

import os
with open('../m3u8_downloader/segments/temp.ts', 'w+b') as f:
  f.write(complete_segments)
os.system(f'ffmpeg -i "media/music/segments/temp.ts" -vcodec copy '
          f'-acodec copy -vbsf h364_mp4toannexb "media/music/mp3/temp.wav"')
os.remove("../m3u8_downloader/segments/temp.ts")

Для меня это был довольно интересный опыт, поскольку я никогда до этого в своей жизни не работал с зашифрованными файлами и HLS протоколом, надеюсь Вам тоже было интересно читать это. Так же надеюсь я смог помочь другим людям, ведь никаких решений по скачиванию аудио с ВКонтакте на питоне в 2022 году я не нашел.

Так же выложу весь код:

Hidden text
import os import m3u8 import requests from vk_api import VkApi from vk_api.audio import VkAudio from Crypto.Cipher import AES from Crypto.Util.Padding import unpad class M3U8Downloader: def __init__(self, login: str, password: str): self._vk_session = VkApi( login=login, password=password, api_version='5.81' ) self._vk_session.auth() self._vk_audio = VkAudio(self._vk_session) def download_audio(self, q: str): url = self._get_audio_url(q=q) segments = self._get_audio_segments(url=url) segments_data = self._parse_segments(segments=segments) segments = self._download_segments(segments_data=segments_data, index_url=url) self._convert_ts_to_mp3(segments=segments) @staticmethod def _convert_ts_to_mp3(segments: bytes): with open(f'media/music/segments/temp.ts', 'w+b') as f: f.write(segments) os.system(f'ffmpeg -i "media/music/segments/temp.
ts" -vcodec copy ' f'-acodec copy -vbsf h364_mp4toannexb "media/music/mp3/temp.wav"') os.remove("../m3u8_downloader/segments/temp.ts") def _get_audio_url(self, q: str): self._vk_audio.get_albums_iter() audio = next(self._vk_audio.search_iter(q=q)) url = audio['url'] return url @staticmethod def _get_audio_segments(url: str): m3u8_data = m3u8.load( uri=url ) return m3u8_data.data.get("segments") @staticmethod def _parse_segments(segments: list): segments_data = {} for segment in segments: segment_uri = segment.get("uri") extended_segment = { "segment_method": None, "method_uri": None } if segment.get("key").get("method") == "AES-128": extended_segment["segment_method"] = True extended_segment["method_uri"] = segment.get("key").get("uri") segments_data[segment_uri] = extended_segment return segments_data @staticmethod def _download_segments(segments_data: dict, index_url: str) -> bin: downloaded_segments = [] for uri in segments_data.
keys(): audio = requests.get(url=index_url.replace("index.m3u8", uri)) downloaded_segments.append(audio.content) if segments_data.get(uri).get("segment_method") is not None: key_uri = segments_data.get(uri).get("method_uri") key = download_key(key_uri=key_uri) iv = downloaded_segments[-1][0:16] ciphered_data = downloaded_segments[-1][16:] cipher = AES.new(key, AES.MODE_CBC, iv=iv) data = unpad(cipher.decrypt(ciphered_data), AES.block_size) downloaded_segments[-1] = data return b''.join(downloaded_segments) @staticmethod def download_key(key_uri: str) -> bin: return requests.get(url=key_uri).content login = "" # phone password = "" # password md = M3U8Downloader(login=login, password=password) q = "Воллны Волны" # Запрос музыки по названию md.download_audio()

Расширения для скачивания музыки с Вконтакте для Яндекс Браузера

Многие пользователи привыкли использовать Вконтакте не только как социальную сеть, но и как своеобразное медиа хранилище. И это неудивительно, ведь в ней находится огромное количество разнообразной музыки и видеороликов.

Но аудиотреки хочется не только прослушивать в онлайн режиме, но и перекачивать их к себе на компьютер или мобильный телефон.

Стандартные возможности социальной сети не позволяют этого сделать и тут на помощь приходят специальные расширения для скачивания музыки с Вконтакте, которые доступны для всех пользователей Яндекс Браузера.

Такой подход наиболее удобен и избавляет нас от использования различных программ, постоянно захламляющих систему.

Содержание статьи

  1. Skyload
  2. Save From Helper
  3. Скачать музыку с Вконтакте
  4. VK Music Saver
  5. Короткое видео по теме
  6. Комментарии пользователей

Skyload

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

Как его установить:

  1. Зайти в каталог дополнений по этой ссылке, в поисковую строку ввести название «Skyload» и нажать «Enter».

  1. Щелкните по иконке с названием программы левой мышкой, чтобы перейти на страницу расширения.

  1. В правой части окна кликните по кнопке «Добавить в…».

  1. Подтвердите установку.

  1. Перейдите на страницу Вконтакте с MP3 треками и наведите мышкой на нужную композицию. После чего вы увидите стрелку, обозначающую начало загрузки. Нажмите на нее, чтобы скачать музыку к себе на компьютер.

  1. Дождитесь завершения загрузки.
  2. Щелкните по скачанному треку правой мышкой, он будет находиться рядом с иконкой дополнения в верхней строке Яндекс Браузера. Выберите пункт «Показать в».

  1. Откроется раздел с сохраненными композициями.

Теперь вы можете слушать любимые песни через обычный проигрыватель или перенести их на телефон.

Отдельное внимание стоит уделить специальной функции «Мультизагрузка». Она открывает возможность сохранения на компьютер всех найденных композиций на странице.

Кликните по опции мышкой и выберите все или несколько треков и щелкните по кнопке загрузки.

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

На мой взгляд, это очень полезная функция, позволяющая в несколько кликов скачать весь альбом.

Save From Helper

Достаточно популярное расширение для Яндекс Браузера, которое станет для вас незаменимым помощником в плане загрузки медиа файлов с самых популярных ресурсов. С его помощью вы можете скачать музыку с ВК, одноклассников, ютуба и прочих сайтов. Из главных отличий можно выделить регулярные обновления, поддержку множества веб-обозревателей, удобство использования и бесплатность.

Инструкция по установке:

  1. Открываем раздел дополнений, в поиск вводим фразу «Save From Helper» и жмем «Enter».

  1. Жмем по иконке программы.

  1. Щелкаем по зеленой кнопке «Добавить в…».

  1. Подтверждаем действие.

  1. После окончания процесса установки переходим во Вконтакте, наводим мышкой на нужную композицию и нажимаем по стрелке для старта загрузки.

По аналогии с предыдущим плагином, приложение Safe From имеет функцию мультизагрузки. Чтобы ей воспользоваться нужно щелкнуть по зеленой стрелке и выбрать пункт «Скачать аудио».

После этого начнется автоматический поиск треков на всей странице во Вконтакте, по его завершению нажмите «Продолжить» и дождитесь окончания процесса.

Загруженные композиции будут находиться в специальной папке, открыть которую можно нажав по значку файла в верхней части окна и выбрав пункт «Показать в».

Пожалуй, единственным неудобством является то, что нельзя изменить место сохранения. Надеюсь, что в дальнейшем этот функционал будет добавлен.

Расширение также можно использовать для скачивания роликов с Ютуба. Для этого нужно зайти на страницу с роликом и кликнуть по значку под видео. В выпадающем списке выбрать нужное качество скачиваемого видео.

Скачать музыку с Вконтакте

Данное расширение сильно упрощает процесс скачивания музыки с ВК, делая его максимально понятным и удобным для всех пользователей Яндекс Браузера. Отличается стандартным дизайном и минимальным набором функций, в числе которых показ размера файла и отображение битрейта.

Для установки приложения необходимо:

  1. По аналогии, как и с предыдущими дополнениями перейти в каталог веб-обозревателя, произвести поиск по названию, установить плагин и войти на страницу с музыкой во Вконтакте.

  1. Навести курсором мыши на MP3 файл и щелкнуть по стрелке.

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

Для изменения стандартной папки загрузок Mp3 файлов, необходимо зайти в настройки Яндекс Браузера и в графе «Сохранять в» указать нужный путь.

VK Music Saver

Также скачать музыку с ВК можно через Яндекс Браузер используя специальный аддон «VK Music Saver», устанавливается он в сам обозреватель в качестве расширения. Помимо сохранения на компьютер различных MP3 композиций, плагин может похвастаться весьма богатым функционалом, упрощающим время проведение во Вконтакте.

Устанавливать дополнение мы будем из магазина Google Chrome. Все находящиеся в нем плагины полностью совместимы с Яндекс Браузером.

Порядок действий будет следующим:

  1. Заходим в каталог, выполняем поиск по названию и инсталлируем приложение.