8.3 KiB
Executable File
title, updated, type, tags, related
| title | updated | type | tags | related | ||||
|---|---|---|---|---|---|---|---|---|
| Yandex Music API — выгрузка библиотеки | 2026-09-26 | tech |
|
personal/spotify-library |
Yandex Music API — выгрузка библиотеки
Рабочий метод выгрузки лайков, плейлистов и альбомов из Яндекс Музыки БЕЗ OAuth-флоу — токен лежит в Local Storage desktop-приложения. Проверено живыми запросами: 2026-09-26. Skill:
yandex-music-library-export(~/.hermes/hermes-whale/skills/media/)
1. Извлечение токена (главное)
Desktop-приложение Яндекс Музыки хранит OAuth-токен в Local Storage LevelDB в открытом виде (без шифрования, не в Keychain).
Путь:
~/Library/Application Support/YandexMusic/Local Storage/leveldb/
Файлы: 000394.log, 000396.ldb — номер файла меняется, искать по маске *.ldb / *.log.
Формат токена: y0_ + ~56 символов base64url (итого ~59-60 символов).
LS="$HOME/Library/Application Support/YandexMusic/Local Storage/leveldb"
find "$LS" -type f \( -name "*.ldb" -o -name "*.log" \) \
| while read f; do strings "$f" | grep -oE "y0_[A-Za-z0-9_.-]{20,}"; done \
| head -1 > /tmp/ym_token
chmod 600 /tmp/ym_token
Что НЕ работает — не тратить время
| Источник | Результат |
|---|---|
YandexMusic/Cookies (Session_id, sessionid2) |
❌ HTTP 401 |
Keychain (security find-generic-password -s "Yandex Music Safe Storage") |
❌ Записи не существует |
IndexedDB/*.leveldb/*.log |
❌ Токена нет, там кэш |
Preferences, .updaterId |
❌ Только UUID и настройки |
Важно: sessionid2 содержит суффикс fakesign000... — это заглушка, реальная авторизация идёт через OAuth-токен.
2. uid пользователя
H="Authorization: OAuth $(cat /tmp/ym_token)"
curl -s -H "$H" "https://api.music.yandex.net/account/status" | jq -r '.result.account.uid'
# → 16635693
Заголовок — именно OAuth, не Bearer.
3. Проверенные эндпоинты
База: https://api.music.yandex.net
| Что | Endpoint | Проверено |
|---|---|---|
| Статус аккаунта + uid | GET /account/status |
✅ |
| Настройки | GET /account/settings |
✅ |
| Лайкнутые треки | GET /users/{uid}/likes/tracks |
✅ 956 треков |
| Плейлисты | GET /users/{uid}/playlists/list |
✅ 8 штук |
| Лайкнутые альбомы | GET /users/{uid}/likes/albums |
✅ 100 |
| Метаданные треков | GET /tracks?track-ids=ID1,ID2,... |
✅ title/artists/albums |
Ответ likes/tracks — только id и timestamp!
{
"result": {
"library": {
"tracks": [
{"id": "149422838", "albumId": "41220806", "timestamp": "2026-08-27T02:05:47+00:00"}
]
}
}
}
timestamp — дата лайка. Названий и артистов НЕТ — нужен второй запрос на /tracks батчами по ~100 id.
Ответ playlists/list
[{"kind": 1009, "title": "Классика", "trackCount": 3}]
Параметр ?with-tracks=true добавляет треки в тот же ответ.
4. Прослушанное (история) — НЕ ДОСТУПНО ⛔
Ни один из вариантов не существует в публичном API:
| Endpoint | Ответ |
|---|---|
/users/{uid}/history |
not-found |
/users/{uid}/music-history |
not-found |
/users/{uid}/recent-tracks |
not-found |
/users/{uid}/play-history |
not-found |
/users/{uid}/plays |
not-found |
/users/{uid}/listening |
not-found |
GET /landing3?blocks=personal-playlists возвращает блоки, но data.title: null — контент скрыт за авторизацией веб-клиента.
Вывод: историю прослушивания Яндекс через этот API не отдаёт.
5. Spotify — токен НЕ найден ⛔
Проверено (2026-09-26), ни одного sp_dc / sp_t / access_token:
| Место | Результат |
|---|---|
Desktop app PersistentCache/public.ldb/*.log |
❌ Только телеметрия |
Users/<id>-user/prefs |
❌ Только настройки UI и DIAL-устройства |
Keychain Spotify Safe Storage |
❌ Записи не существует |
| Chrome (Default, Profile 4, Guest) | ❌ 0 spotify-cookies |
| Firefox (3 профиля) | ❌ 0 |
Safari (Cookies.binarycookies) |
❌ 0 |
| Arc / Brave | ❌ Профилей нет |
Приложение Spotify на Mac не пишет cookies на диск. Токен либо в памяти, либо в Keychain под другим именем.
Рабочие варианты (не проверялись):
spotify.com/account/privacy→ Request data (Extended streaming history) — ZIP на email- Official Web API
GET /v1/me/tracks— требует OAuth-приложения в Developer Dashboard sp_dcиз залогиненной веб-сессииopen.spotify.com
6. Итоговое состояние (2026-09-26)
| Яндекс Музыка | Spotify | |
|---|---|---|
| Токен | ✅ y0_... в /tmp/ym_token |
❌ нет |
| uid | 16635693 (login mAlleXXX) |
mixsxmcds20znczu4na52ghox |
| Лайки | ✅ 956 треков | ⚠️ 162 (данные в personal/spotify-library от 2026-05-12) |
| Плейлисты | ✅ 8 штук | ⚠️ 6 (2026-05-12) |
| Альбомы | ✅ 100 | ⚠️ 40 (2026-05-12) |
| История | ❌ API не отдаёт | ❌ токена нет |
8 плейлистов Яндекс: Классика (3), ДР (3), ok (4), олдскуд (3), Слушать позже (34), Best (1), Мои аудиозаписи ВКонтакте (237), Мегаpolice - АК-47 (20)
Статус (2026-09-26)
- Яндекс — ГОТОВО:
personal/yandex-music-library.md— 956 лайков (с датами), 8 плейлистов (321 трек), 100 альбомов. 1456 строк, 117 KB. Добавлено вpersonal/index.md. - Spotify — блокер:
~/.hermes/auth.json→.providers.spotifyсодержит client_id + refresh_token, но токен отозван (invalid_grant: Refresh token revoked) →SpotifyAuthRequiredError. Нуженhermes auth spotify(интерактивно, браузер).
7. Подводные камни
$(...)внутри write_file может быть вырезан санитайзером →syntax error near unexpected token ). Решение: писать скрипт без inline-подстановок, читать токен из файла; либоsource /dev/stdin <<'EOF'.- Не эхоить токен в stdout — попадает в лог сессии. Писать в
/tmp/ym_tokenсchmod 600. - Токен привязан к устройству и обновляется — при 401 перечитать из LevelDB (приложение должно быть запущено и залогинено).
- Токен в
/tmpсбрасывается при перезагрузке — извлекать заново. - Не пихать 956 id в один URL
/tracks?track-ids=— бить на батчи по ~100. - uid
0не работает:/users/0/likes/tracks→invalid uid: 0. Только реальный uid.
8. Связанные документы
- personal/spotify-library — выгрузка Spotify (2026-05-12)
- personal/music-download-practices — источники mp3, загрузка на TrueNAS
- personal/documents/music-recommendations — музыкальные рекомендации
Создано: 2026-09-26 | Сессия: разведка способов выгрузки Яндекс Музыки и Spotify