Как получать музыку из ВКонтакте в 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 textimport 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()
Скачать загрузчик музыки ВК для Windows 10, 7, 8/8.1 (64 бит/32 бит)
Загрузчик музыки ВК — это простое в использовании и совершенно бесплатное расширение, созданное для браузера Opera, которое позволяет буквально скачать музыкальные файлы из социальной сети ВКонтакте в пару кликов.
Для установки плагина в браузере достаточно нажать на исполняемый файл программы, также в процессе установки будет произведена интеграция в интерфейс социальной сети ВКонтакте. Плагин не имеет никаких настроек, так как они не нужны, а все функции Загрузчик музыки ВК работает в автоматическом режиме.
Чтобы скачать нужную песню, наведите курсор мыши на значок воспроизведения рядом с музыкальным треком (синяя иконка с белым треугольником) и щелкните правой кнопкой мыши, чтобы открыть контекстное меню, в котором можно выбрать опцию «Сохранить». Далее вам нужно указать папку на жестком диске, куда вы хотите сохранить загруженный музыкальный файл. При желании вы также можете переименовать трек в процессе сохранения. Как видите, это действительно просто. Используйте этот плагин и слушайте хорошую музыку!
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian KörnerLogan
Расширение для Microsoft Edge, позволяющее клиентам скачивать музыку из ВКонтакте всего в пару кликов
image/svg+xmlBotttsPablo Stanleyhttps://bottts.
Загрузчик музыки ВКонтакте, пожалуй, главная идея для пользователей. ОС Windows идеальна, так как она хорошо запускает программу. Скачивайте музыку, а затем управляйте файлами с большей точностью. Эту программу можно установить за короткое время. Загрузчик музыки ВКонтакте заработал, и люди хотят, чтобы он продолжал работать. Следите за обновлениями, которые выходят для загрузчика музыки ВКонтакте.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian KörnerKayden F.
VK Music Downloader — это программа, которая позволяет пользователям скачивать музыку с популярной платформы социальных сетей VK (ранее известной как VKontakte). . Программное обеспечение поддерживает несколько форматов, таких как MP3, M4A и OGG, и может использоваться для загрузки целых списков воспроизведения или отдельных песен. Программное обеспечение также позволяет пользователям искать музыку, а также создавать свои собственные плейлисты.
image/svg+xmlBotttsПабло Стэнлиhttps://bottts.
Jayden Mastropieri
1. VK Music Downloader — отличная программа для скачивания музыки из ВКонтакте. 2. Он прост в использовании и удобен для пользователя. 3. Вы можете скачать музыку в разных форматах и качестве. 4. Это позволяет загружать целые альбомы сразу. 5. Он поддерживает множество языков. 6. Это быстро и надежно. 7. Встроенная поисковая система поможет вам найти то, что вам нужно. 8. Хороший выбор музыки, доступной для скачивания. 9. Скорость загрузки хорошая. 10. Интерфейс интуитивно понятен и прост в использовании.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian KörnerTyler L.
VK Music Downloader — отличная и простая в использовании программа. Быстро и качественно скачивает музыку из ВК. Интерфейс интуитивно понятен и удобен для пользователя. Качество песен тоже очень хорошее. Программное обеспечение поддерживает несколько аудиоформатов, что позволяет легко выбрать формат, который лучше всего соответствует вашим потребностям. Скорость загрузки также достаточно высока.
Brodie X.
Это программное обеспечение позволяет пользователям скачивать музыку с платформы социальных сетей ВКонтакте (ВК). Он предназначен для извлечения аудиофайлов из профилей ВКонтакте и сохранения их в различных аудиоформатах, включая MP3, FLAC и WAV. Он также поддерживает пакетную загрузку нескольких треков одновременно, что позволяет пользователям загружать целые плейлисты и альбомы за один раз. Кроме того, он предоставляет простой и удобный интерфейс, который делает процесс загрузки быстрым и легким. Программное обеспечение совместимо с операционными системами Windows, Mac и Linux.
Ваше имя
Ваш комментарий
EPUBReader
Планиуэй
Наведите Zoom+
кофейники
Undo Closed Tabs Button
vk-downloader — Google
AlleVideosBilderBücherMapsNewsShopping
Tipp: Begrenze diesuche auf deutschsprachige Ergebnisse. Du kannst deinesuchsprache in den Einstellungen ändern.
Загрузчик видео ВКонтакте онлайн — MP3, MP4, HD!
www.downloadvideosfrom.com › …
Бесплатный онлайн-загрузчик видео из ВКонтакте — скачивайте видео из ВКонтакте в MP3, MP4 и HD без какого-либо программного обеспечения. Очень прост в использовании!
Скачать Вк Аудио и Видео — PasteDownload
pastedownload.com › vk-downloader
Скачать Вк Аудио и Видео. PasteDownload — это, по сути, онлайн-приложение для загрузки видео, которое поддерживает несколько видеосайтов в одном месте.
Einfach VK Videos und Music Downloaden — Savefrom.net
de.savefrom.net Это видео, музыка и фотографии от VK.com. Einfach das kostenlose Add-on SaveFrom.net … Загрузчик видео и музыки ВК.
Загрузчик музыки ВК
chrome.google.com › подробно › скачать-музыку-с-вк
14.12.2022 · Это расширение поможет скачать вашу музыку в русскоязычной социальной сети Вк. ком. Во время загрузки он сохраняет оригинальное название саундтрека.
Загрузчик видео ВКонтакте — ВКонтакте MP4 и MP3 — SteptoDown
steptodown.com › vk-video-downloader
Загрузчик видео ВКонтакте действует как мост между вашим компьютером и серверами социальных сетей. Просто скачивает видео из ВК и отправляет …
Онлайн-загрузчик видео ВКонтакте для MP4 и MP3 бесплатно
fastsavenow.com › vk-video-downloader
1. · Скопируйте URL-адрес видео ВКонтакте · 2. · Вставьте URL-адрес в окно загрузки · 3. · Загрузите и сохраните файл. · Часто задаваемые вопросы о VK Downloader …
Vk Online-Konverter — Конвертировать видео Vk HD kostenlos
youtube4kdownloader.com › convert-vk-video
Vk Video Downloader от YouTube4KDownloader. Mit unserem kostenlosen Tool können Sie ganz einfach herunterladen Vk Videos erhältlich in verschiedenen Formaten ( …
Загрузчик видео для ВКонтакте — Вкон – Приложения в Google Play
play.