MarshalX / yandex-music-api

Неофициальная Python библиотека для работы с API сервиса Яндекс.Музыка
https://yandex-music.rtfd.io
GNU Lesser General Public License v3.0
917 stars 80 forks source link

Получение FLAC'ов #656

Open ArtemBay opened 3 weeks ago

ArtemBay commented 3 weeks ago

Эндпоинт

GET /get-file-info
Authorization: OAuth ...

Параметры

GET-параметры

Ответ

Массив из объектов

Пример запроса

Запрос

GET /get-file-info?ts=1724399849&trackId=117708948&quality=lossless&codecs=flac%2Caac%2Che-aac%2Cmp3&transports=raw&sign=VLPICid1TFCXy27MK7jSoQE4BCPN4hCJ0BCvu2FauvU

Ответ

Ответ
{
  "invocationInfo": {
    "req-id": "1724399890495688-5104116694941670615",
    "hostname": "music-stable-back-sas-86.sas.yp-c.yandex.net",
    "exec-duration-millis": 11
  },
  "result" : {
    "downloadInfo": {
      "trackId": "117708948",
      "quality": "lossless",
      "codec": "flac",
      "bitrate": 0,
      "transport": "raw",
      "size": 0,
      "gain": false,
      "urls": [
        "https://strm-mar-126.strm.yandex.net/music-v2/raw/ysign1=0c9d45f401d2ff200b1fd9ce9323fb10a1588de90c1b5f317a4f75cf83945752,ts=66ca8754,secret_version=ver-1,kts=66c7d100,source=mds,pfx,sfx/0/13584909/2d936a4c.173543555.11.117708948/flac",
        "https://media.strm.yandex.net/music-v2/raw/ysign1=0c9d45f401d2ff200b1fd9ce9323fb10a1588de90c1b5f317a4f75cf83945752,ts=66ca8754,secret_version=ver-1,kts=66c7d100,source=mds,pfx,sfx/0/13584909/2d936a4c.173543555.11.117708948/flac"
      ],
      "url": "https://strm-mar-126.strm.yandex.net/music-v2/raw/ysign1=0c9d45f401d2ff200b1fd9ce9323fb10a1588de90c1b5f317a4f75cf83945752,ts=66ca8754,secret_version=ver-1,kts=66c7d100,source=mds,pfx,sfx/0/13584909/2d936a4c.173543555.11.117708948/flac",
      "realId": "117708948"
    }
  }
}
ArtemBay commented 3 weeks ago

Пример запроса на питоне с генерацией подписи

#!/usr/bin/python3
from datetime import datetime

import hmac
import hashlib
import base64

import requests

SECRET = 'kzqU4XhfCaY6B6JTHODeq5'
TRACK_ID = '117708948'
TIMESTAMP = int(datetime.now().timestamp())

hmac_sign = hmac.new(SECRET.encode('utf-8'), f'{TIMESTAMP}{TRACK_ID}losslessflacaache-aacmp3raw'.encode('utf-8'), hashlib.sha256)
sign = base64.b64encode(hmac_sign.digest()).decode('utf-8')[:-1]

print(TIMESTAMP)
print(sign)
print('-' * 15)

p = {'ts': TIMESTAMP, 'trackId': TRACK_ID, 'quality': 'lossless', 'codecs': 'flac,aac,he-aac,mp3', 'transports': 'raw', 'sign': sign}
h = {
    'Authorization': 'TOP SECRET',
    'X-Yandex-Music-Client': 'YandexMusicDesktopAppWindows/5.13.2'

}

resp = requests.get(f'https://api.music.yandex.net/get-file-info', params=p, headers=h)
print(resp.text)

Значение в переменной SECRET статично, но не исключаю факт что оно может со временем измениться. Получалось кровью и потом из десктопного приложения ЯМ

ArtemBay commented 3 weeks ago

OAuth в токене обязателен. Если использовать токен который получается этим способом, то хедер авторизации должен выглядеть вот так 'Authorization': 'OAuth AQAAAAAQ###############################'

direct-dok commented 2 weeks ago

OAuth в токене обязателен. Если использовать токен который получается этим способом, то хедер авторизации должен выглядеть вот так 'Authorization': 'OAuth AQAAAAAQ###############################'

Привет) а если не секрет, какой прогой трафик слушал?

ArtemBay commented 2 weeks ago

OAuth в токене обязателен. Если использовать токен который получается этим способом, то хедер авторизации должен выглядеть вот так 'Authorization': 'OAuth AQAAAAAQ###############################'

Привет) а если не секрет, какой прогой трафик слушал?

mitm proxy, но вообще просто через дев тулсы в десктопной версии яндекс музыки (которая новая на электроне). Оттуда я все штуки и вытянул типа секрета и принципа создания подписи