Files
obsidian-vault/personal/tech/yandex-music-api.md
T
Taiga b53dd70a15 [2026-09-26 09:10:28] syncthing: personal/tech/archive-org-collection-harvest.md personal/tech/balda-go-fx-pitfalls.md personal/tech/bilety-oxota-interaktiv.md personal/tech/cloudflare-tunnel-ssh-published-route.md personal/tech/deepseek-language-drift.md personal/tech/docker-data-root-mount-race.md personal/tech/docker-mac-disk-issues.md personal/tech/docker_colima_setup.md personal/tech/eagle-dashboard-launchd.md personal/tech/hermes-agent-improvements.md personal/tech/hermes-browser-toolsets.md personal/tech/hermes-fork-vs-upstream.md personal/tech/hermes-git-repo.md personal/tech/hermes-memory-architecture.md personal/tech/hermes-secret-redaction-bypass.md personal/tech/hermes-self-improvement-review.md personal/tech/home-network-config.md personal/tech/inter-site-throughput-taiga-to-mac.md personal/tech/inter-site-throughput-taiga-to-mac.md.bak-nedstab2 personal/tech/jellyfin-db-schema-mismatch.md personal/tech/karabiner-keyboard-config.md personal/tech/kraken-media-inventory-facts.md personal/tech/kraken-truenas-media-copies.md personal/tech/lampa-jellyfin-plugin.md personal/tech/lampac-deployment.md personal/tech/lampac-torrserver.md personal/tech/llm-model-selection-2026.md personal/tech/mac-print-shared-services.md personal/tech/modbus-rtu-sniffer-debugging.md personal/tech/multistream-single-flow-limit.md personal/tech/multistream-single-flow-limit.md.bak-nedstab2 personal/tech/music-tags-repair-truenas.md personal/tech/obsidian-mcp-ecosystem.md personal/tech/original-xbox-2025-guide.md personal/tech/prowlarr-flaresolverr-cloudflare.md personal/tech/radarr-sonarr-phantom-records.md personal/tech/roundtrip-key-verification.md personal/tech/ryujinx-mac-setup.md personal/tech/skill-arr-media-stack-setup-additions.md personal/tech/skill-docker-data-root-mount-race.md personal/tech/skill-lampac-kraken-deploy.md personal/tech/tirith-trust.md personal/tech/truenas-local-tree-comparison.md personal/tech/truenas-nfs4-acl-and-arrmultiuser.md personal/tech/truenas-zfs-panic-recovery.md personal/tech/vault-doc-pruning.md personal/tech/vless-space-subscription-egress.md personal/tech/watchlist-sync-feed.md personal/tech/watchtower-docker-updates.md personal/tech/xray-outbound-subscription-3xui.md personal/tech/xray-reverse-limits-private-network.md personal/tech/xray-reverse-tunnel-kraken-truenas.md personal/tech/xray-reverse-tunnel-kraken-truenas.md.bak-nedstab2 personal/tech/yandex-music-api.md
2026-09-26 09:10:28 +00:00

184 lines
8.3 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Yandex Music API — выгрузка библиотеки
updated: '2026-09-26'
type: tech
tags:
- music
- yandex
- api
- personal
related: 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 символов).
```bash
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 пользователя
```bash
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!
```json
{
"result": {
"library": {
"tracks": [
{"id": "149422838", "albumId": "41220806", "timestamp": "2026-08-27T02:05:47+00:00"}
]
}
}
}
```
`timestamp` — дата лайка. Названий и артистов НЕТ — нужен второй запрос на `/tracks` батчами по ~100 id.
### Ответ `playlists/list`
```json
[{"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 под другим именем.
**Рабочие варианты (не проверялись):**
1. `spotify.com/account/privacy` → **Request data** (Extended streaming history) — ZIP на email
2. Official Web API `GET /v1/me/tracks` — требует OAuth-приложения в Developer Dashboard
3. `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*