Поздравляю всех с наступившим 2025 годом! В честь этого я хочу поделиться с вами двумя способами сливов музыки, который работает по сей день Как сливается музыка? Сейчас большинство сливов (90%) происходят с музыкальных площадок, из-за их уязвимостей, чаще всего, через их API. Сегодня поделюсь с вами двумя из них. 1. Nhaccuatui C помощью этого способа вы можете получать полные треки до официального выхода. Как отсюда сливать? Как отсюда сливать? 1) Заходим на сам сервис и создаем аккаунт, также в него нужно авторизоваться на втором домене: тык 2) Пишем в поиск интересующий вас релиз, чтобы узнать что будет выходить в ближайшее время, заходите в раздел: https://lolz.live/forums/862/, буду заливать туда релизы (пока что на 10 число почти ничего нет) 3) Если вам выдался релиз, нажимаем на три точки -> go to song 4) Далее перед страницей на которую вы попадете пишите view-source: пример: view-source:https://beta.nhaccuatui.com/bai-hat/galore-asteria-ft-clonnex.bOBhR429rsqe.html Пишем в поиск songid и копируем его. 5) Переходим на домен nhaccuatui.com и заходим в личный кабинет, в список плейлистов Нажимаем F12 и переходим в консоль, там пишем следующую команду NCTQuickSearchEditPlaylist.addSong(), в скобочках указываем скопированный songid, после чего сохраняем изменения 6) Идем обратно на на другой хостинг, нажимаем F12 -> Network, заходим в созданный плейлист, включаем его, и вауля, в консоле появился mp3 невышедшего трека, а также информация о нем, где в том числе обложка в максимально возможном качестве: https://avatar-ex-swe.nixcdn.com/playlist/2024/12/27/c/7/e/0/1735315994167_3000.jpg Сам бы с текста ничего не понял, поэтому для вас записали видео-гайд: FAQ : Почему я не могу найти нужный релиз? : Иногда площадка не пишет имя исполнителя, попробуй искать по названию трека, либо же он в целом сюда не загружен : Как получить трек в 320kbps? (как на видео) : Нужно купить VIP подписку. Без подписки можно скачать в 120kbps : Как купить подписку если у меня нету вьетнамской карты? (почему?) : Подписку можно купить через BitRefill или через мобильное приложение 2. Vodafone Эта площадка интереснее, сюда заливают больше лейблов, в том числе Universal Music (дахуя пиздатый американский лейбл). С помощью этого способа вы сможете получать отрывки (30сек) и информацию о невышедших релизах. (К сожалению, полные треки качать нельзя, это был пофикшено, но при этом здесь намного больше артистов, чем на способе выше) Как отсюда сливать? Как отсюда сливать? Для вас мы подготовили парсер, тк объяснить как это работает достаточно тяжело, да и руками вы явно не будете самостоятельно перебирать айдишники в апи. Вот он: https://mega.nz/file/KR8znLIS#0KYwsv_FnMTByxU4cKQnOgHJNzcAjnOPEoqFW1SKElQ Как он работает? Это бот для телеграма, вам нужно будет вставить токен бота, данный скрипт использует апи музыкального сервиса для получения информации о релизе и перебирает их айди. Что нужно для его использования? Для его использования необходимо установить следующие питон библиотеки: pip install aiohttp pip install mutagen pip install python-dotenv Code pip install aiohttp pip install mutagen pip install python-dotenv Также в директории с скриптом должны быть файлы: artists.txt - вайт лист артистов для того, чтобы бот не флудил вам в телеграм, его вы должны заполнить самостоятельно, добавить туда интересующих вас артистов, только результаты с ними будут стучать вам в тг parse.csv - файл для логирования полученных релизов Чтобы получить отрывок песни, айди релиза нужно подставить в эту ссылку: https://p.mondiamedia.com/api/fetch/preview/id (пример: https://p.mondiamedia.com/api/fetch/preview/131248361) Если сомневаетесь в надежности, то вот код, дополнительно необходимо создать файлы, которые я расписал выше: Код import os import aiohttp import asyncio from mutagen.mp3 import MP3 from mutagen.easyid3 import EasyID3 from io import BytesIO from dotenv import load_dotenv load_dotenv() API_TOKEN = os.getenv("API_TOKEN") CHAT_ID = os.getenv("CHAT_ID") ERROR_LIMIT = int(os.getenv("ERROR_LIMIT")) MIN_ID = int(os.getenv("MIN_ID")) MAX_ID = int(os.getenv("MAX_ID")) ERRORS = 0 def credits(): print(" ,-. _,---._ __ / \\") print(" / ) .-' `./ / \\") print("( ( ,' `/ /|") print(" \\ `-\" \\'\\ / |") print(" `. , \\ \\ / |") print(" /`. ,'-`----Y |") print(" ( ; | '") print(" | ,-. ,-' | /") print(" | | ( | hjw | /") print(" ) | \\ `.___________|/") print("[*] k1ttyf/mondia-parser: loaded!") print("[*] Creator: k1ttyf.xyz x @zvukleakZ\n") def load_artists(): try: with open("artists.txt", "r", encoding="utf-8") as f: return [line.strip().lower() for line in f if line.strip()] except Exception as e: print(f"[load_artists]: {e}") return [] def check_exists(artist, artists): artist = artist.lower() query_names = [name.strip() for name in artist.split(",")] return any(name in artists for name in query_names) async def isUnreleased(session, album_id): try: async with session.get("https://ment-backend.mondia.com/structure/pages_music_tracks_details?", params={"id": album_id}, headers={"x-tenant-id": "vf-de"}) as response: print(f"[isUnreleased] {album_id}: {response.status}") if response.status == 200: data = await response.json() statusCode = data["substructure"][0]["data"].get("errorCode") return statusCode is not None else: return None except Exception as e: print(f"[isUnreleased] {album_id}: {e}") return None async def fetch_mp3_metadata(session, album_id): try: async with session.get(f"https://p.mondiamedia.com/api/fetch/preview/{album_id}") as response: print(f"[fetch_mp3_metadata] {album_id}: {response.status}") if response.status == 200: data = await response.read() mp3_data = BytesIO(data) audio = MP3(mp3_data, ID3=EasyID3) return { "title": audio.get("title", [""])[0], "artist": audio.get("artist", [""])[0], "album": audio.get("album", [""])[0], } else: return None except Exception as e: print(f"[fetch_mp3_metadata] {album_id}: {e}") return None async def send_message(chat_id, text): telegram_url = f"https://api.telegram.org/bot{API_TOKEN}/sendMessage" payload = { "chat_id": chat_id, "text": text, "parse_mode": "HTML" } try: async with aiohttp.ClientSession() as session: async with session.post(telegram_url, json=payload) as response: if response.status == 200: return True print(f"[send_message] {chat_id}: {response.status}") return False except Exception as e: print(f"[send_message] {chat_id}: {e}") return False async def process_ids(start_id, end_id, log, batch_size=50, artists=None): global ERRORS if artists is None: artists = [] async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=10)) as session: for i in range(start_id, end_id, batch_size): tasks = [ fetch_mp3_metadata(session, album_id) for album_id in range(i, min(i + batch_size, end_id)) ] results = await asyncio.gather(*tasks) for result, album_id in zip(results, range(i, min(i + batch_size, end_id))): if ERRORS >= ERROR_LIMIT: await send_message(CHAT_ID, f"<b>⚠ Получено больше {ERROR_LIMIT} ошибок!</b>") return None if result: ERRORS = 0 title = result.get("title", "") artist = result.get("artist", "") album = result.get("album", "") log.write(f"{album_id};{artist};{title};{album}\n") if check_exists(artist, artists) and await isUnreleased(session, album_id): message_text = ( f"<b> ID:</b> <code>{album_id}</code>\n" f"<b> Трек:</b> <code>{title}</code>\n" f"<b> Артист:</b> <code>{artist}</code>\n" f"<b> Альбом:</b> <code>{album}</code>" ) await send_message(CHAT_ID, message_text) else: ERRORS += 1 async def main(): credits() log = open("parse.csv", "a") artists = load_artists() await process_ids(MIN_ID, MAX_ID, log, artists=artists) log.close() if __name__ == "__main__": asyncio.run(main()) Python import os import aiohttp import asyncio from mutagen.mp3 import MP3 from mutagen.easyid3 import EasyID3 from io import BytesIO from dotenv import load_dotenv load_dotenv() API_TOKEN = os.getenv("API_TOKEN") CHAT_ID = os.getenv("CHAT_ID") ERROR_LIMIT = int(os.getenv("ERROR_LIMIT")) MIN_ID = int(os.getenv("MIN_ID")) MAX_ID = int(os.getenv("MAX_ID")) ERRORS = 0 def credits(): print(" ,-. _,---._ __ / \\") print(" / ) .-' `./ / \\") print("( ( ,' `/ /|") print(" \\ `-\" \\'\\ / |") print(" `. , \\ \\ / |") print(" /`. ,'-`----Y |") print(" ( ; | '") print(" | ,-. ,-' | /") print(" | | ( | hjw | /") print(" ) | \\ `.___________|/") print("[*] k1ttyf/mondia-parser: loaded!") print("[*] Creator: k1ttyf.xyz x @zvukleakZ\n") def load_artists(): try: with open("artists.txt", "r", encoding="utf-8") as f: return [line.strip().lower() for line in f if line.strip()] except Exception as e: print(f"[load_artists]: {e}") return [] def check_exists(artist, artists): artist = artist.lower() query_names = [name.strip() for name in artist.split(",")] return any(name in artists for name in query_names) async def isUnreleased(session, album_id): try: async with session.get("https://ment-backend.mondia.com/structure/pages_music_tracks_details?", params={"id": album_id}, headers={"x-tenant-id": "vf-de"}) as response: print(f"[isUnreleased] {album_id}: {response.status}") if response.status == 200: data = await response.json() statusCode = data["substructure"][0]["data"].get("errorCode") return statusCode is not None else: return None except Exception as e: print(f"[isUnreleased] {album_id}: {e}") return None async def fetch_mp3_metadata(session, album_id): try: async with session.get(f"https://p.mondiamedia.com/api/fetch/preview/{album_id}") as response: print(f"[fetch_mp3_metadata] {album_id}: {response.status}") if response.status == 200: data = await response.read() mp3_data = BytesIO(data) audio = MP3(mp3_data, ID3=EasyID3) return { "title": audio.get("title", [""])[0], "artist": audio.get("artist", [""])[0], "album": audio.get("album", [""])[0], } else: return None except Exception as e: print(f"[fetch_mp3_metadata] {album_id}: {e}") return None async def send_message(chat_id, text): telegram_url = f"https://api.telegram.org/bot{API_TOKEN}/sendMessage" payload = { "chat_id": chat_id, "text": text, "parse_mode": "HTML" } try: async with aiohttp.ClientSession() as session: async with session.post(telegram_url, json=payload) as response: if response.status == 200: return True print(f"[send_message] {chat_id}: {response.status}") return False except Exception as e: print(f"[send_message] {chat_id}: {e}") return False async def process_ids(start_id, end_id, log, batch_size=50, artists=None): global ERRORS if artists is None: artists = [] async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=10)) as session: for i in range(start_id, end_id, batch_size): tasks = [ fetch_mp3_metadata(session, album_id) for album_id in range(i, min(i + batch_size, end_id)) ] results = await asyncio.gather(*tasks) for result, album_id in zip(results, range(i, min(i + batch_size, end_id))): if ERRORS >= ERROR_LIMIT: await send_message(CHAT_ID, f"<b>⚠ Получено больше {ERROR_LIMIT} ошибок!</b>") return None if result: ERRORS = 0 title = result.get("title", "") artist = result.get("artist", "") album = result.get("album", "") log.write(f"{album_id};{artist};{title};{album}\n") if check_exists(artist, artists) and await isUnreleased(session, album_id): message_text = ( f"<b> ID:</b> <code>{album_id}</code>\n" f"<b> Трек:</b> <code>{title}</code>\n" f"<b> Артист:</b> <code>{artist}</code>\n" f"<b> Альбом:</b> <code>{album}</code>" ) await send_message(CHAT_ID, message_text) else: ERRORS += 1 async def main(): credits() log = open("parse.csv", "a") artists = load_artists() await process_ids(MIN_ID, MAX_ID, log, artists=artists) log.close() if __name__ == "__main__": asyncio.run(main()) Спасибо за прочтение, теперь вы крутой хакер! (это вам не с эпл музыки за два часа сливать) Если вам интересно - могу поделиться тем, как это можно монетизировать Если остались вопросы - задавайте здесь, или в телеграме - t.me/q9663
Годно,но сложно, сделай бота в ТГ,что бы люди просто могли ввести название артиста,а в ответ приходит трек