Как стать автором
Обновить

Комментарии 41

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

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

Не думаю, что из-за статьи будут что-то менять. В конце концов, они и не прячут декодер — просто скрывают таким образом музыку от обывателя.
ровно год назад была статья на эту тему.
интересно за это время сильно изменился механизм?
habr.com/post/340810
Сравнивал вскользь недавно.

Они добавили привязку к id пользователя
i: function(e, t) {
	return i.s(e, t ^ vk.id)
},



На сколько понимаю, они этим самым проверяют локаль пользователя… и в плейлисте появляется то и дело — «Аудиозапись your_favorite_music недоступна для прослушивания в Вашем регионе.»
Но можно же, в теории, позаимствовать айди товарища из «нужной» страны… Хотя вроде там более замароченно.
Думаю, за это отвечает другой механизм и на такие аудио даже ссылки не выдает. К сожалению, мне такие записи не попадались и как это обойти — ответить трудно. Попробую зайти через впн глянуть.
Именно ВПН и позволяет обойти «ваш регион».
Точнее, если у туннеля выход в Европе — DMCA(или кто там у них) блюдётся. Если в России — слушай на здоровье.
А у меня, к сожалению, такое встречается постоянно… если не пользуюсь русским прокси.
Именно поэтому перестал пользоваться вк музыкой как таковой… проще уж из других источников слушать, чем слушать трэк через три.
Попробуйте Тайский впн, очень многие песни с Пхукета недоступны, кстати.
Всегда есть возможность использовать telegram бота…
А зачем? Можно же просто взять ID официального приложения и пользоваться API для аудио как раньше.

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

Не эту реализацию случайно — github.com/vodka2/vk-audio-token? Если эту, то можно было создать Issue, кроме того, не так давно я добавил примеры использования полученных токенов. Если другую, можете, если не трудно, написать ссылку? Вообще, на мой взгляд, использование API намного удобнее, чем парсинг сайта.
Реализация ваша, да. Спасибо за нее :)
Я просто ради интереса решил переписать на шарпе, поэтому issue не помогут. Токены получаю от гугла и от вк, но что-то делаю не так — vk api всегда возвращает тот самый 25-секундный семпл. Хочу разобраться и запилить экспортер всего-и-вся-из-вк, но все руки не доходят.
Сложно сказать, не видя кода, но, возможно, вы делаете запрос к API с другим User-Agent. В принципе, я мог бы посмотреть ваш код, если бы вы выложили его на Github, всё-таки идея хорошая.
Если не справлюсь, напишу вам) все-таки интересно и самому поковыряться
Мы вот получаем один обычный токен через авторизацию по логину-паролю под видом одного из официальных приложений и по этому токену напрямую используем старые методы аудио-апи. И никаких вытаскиваний GMS не нужно.
поделитесь кусочком кода?
def create_playlist_file(self, user_id: Union[int, str]) -> str:
        # Probably it is better to separate it all to different methods

        all_music_link = f'https://api.vk.com/method/audio.get?owner_id={user_id}&access_token={self.token}&v=5.85'
        all_music = requests.get(all_music_link).json()['response']['items']
        song_ids = []

        # Create unique song ids
        for song in all_music:
            if not song.get('access_key'):
                continue
            access_key = song['access_key']
            song_id = song['id']
            song_ids.append(f'{user_id}_{song_id}_{access_key}')

        splited_song_ids = self.group(song_ids, 200)  # Grouping ids because of VK API limits for songs in one request

        result = OrderedDict()  # OrderedDict here and below is to specify order of songs like in a real playlist

        for chunk in splited_song_ids:
            # Making one request to get data for each 200 songs
            ids_for_request = ','.join(chunk)
            data = {'audios': ids_for_request, 'access_token': self.token, 'v': '5.85'}
            songs_with_urls = requests.post('https://api.vk.com/method/audio.getById', data=data).json()['response']

            sleep(0.5)  # Excepting VK API rate limit

            # Getting only needed data for each song to create a beautiful playlist file
            for song in songs_with_urls:
                id_ = song['id']
                author = song.get('artist')
                title = song.get('title')
                src = song.get('url')
                if not src:
                    is_blocked = True
                else:
                    is_blocked = False
                needed_data = OrderedDict(author=author, title=title, src=src, is_blocked=is_blocked)
                result[id_] = needed_data
Спасибо за код, но куда интересней было бы узнать название приложения.
После того как появилась платная подписка на музыку, сделали завязку на google play, и для полноценной работы нужно проходить доп. валидацию с использованием android_id (device_id) при которой api токен меняется на такой же токен с доп. правами, в частности с правами на доступ к audio api, при том что документацию по audio api с сайта вк выпилили.
Официальный клиент ВК для Android может работать и без валидации, правда, там другие методы API.
Значит ли это что сейчас опять появятся на пару недель over 9000 приложений музыки в AppStore?
Как ответила мне одна девушка, «У меня целых три таких приложения и я жму там одну кнопочку, а ты тут столько строк какой-то фигни написал»)
«Глаза» то у девушки хоть большие?

Даже Google сейчас выпиливает плагины для скачивания музыки из VK.

НЛО прилетело и опубликовало эту надпись здесь

Такие приложения разве не нарушают условия соглашений?

Красивый код на php)
Данная страница будет полезной для тех, кто решил взять заказ на парсер аудио-треков VK и резко понял, что ничего не понял.


А если для себя решил написать, то страница полезной не будет?
Давно уже поддерживаю аналогичный код на Github и на Тостере. Даже скрипт для обратного шифрования есть.
Добавил к статье :)
Спасибо за статью. Ранее через API ходил, потом через ID приложений. Этот метод куда проще кажется.
Забавно, но не все ссылки декодирует нормально. После процесса декодирования, перейдя по ссылке, кидает 404. Позже скину пример…
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.