API Soundcloud / кінцева точка потоку, що дає 401 помилку


13

Я намагаюся написати нативну програму, що реагує на деякі композиції із Soundcloud. Як тест, я грав з API за допомогою python, і я можу подавати запити на вирішення URL-адреси, витягувати списки відтворення / треки та все інше, що мені потрібно.

З урахуванням сказаного, під час запиту в stream_url будь-якого треку я отримую помилку 401.

Поточна URL-адреса, про яку йдеться ,: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Я спробував це без? Client_id ..., я спробував замінити? з &, я спробував отримати інший client_id, я спробував це з enable_redirects як істинним, так і хибним, але, здається, нічого не працює. Будь-яка допомога буде дуже вдячна.

Властивість streamable кожного треку - True, тому це не повинно бути проблемою дозволів.

Редагувати:

Провівши трохи досліджень, я знайшов напівуспішний спосіб вирішення. Кінцева точка / stream API все ще не працює, але якщо змінити кінцеву точку призначення на http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, вона надасть вам RSS-канал, який є (здебільшого) те саме, що ви отримали, використовуючи кінцеву точку API треків чи списків відтворення.

Посилання, що міститься в ньому, може бути потоковою.


1
Я деякий час використовую API, останнім часом я також отримую помилку 401, це не тільки ви.
r3verse

У моєму випадку JavaScript, API не працює вже кілька днів.
Даніель

усі додатки, які я використовую, які вдарили по API API Soundcloud, вже неділені. Здається, SoundCloud майже відмовився від розробки третьої сторони, яка справді
гасить

Відповіді:


7

Гаразд, я думаю, я знайшов узагальнене рішення, яке буде працювати для більшості людей. Я б хотів, щоб це було простіше, але це найпростіша річ, яку я знайшов ще.

  1. Використовуйте API для витягування треків у користувача. Ви можете використовувати посилання_поділення та властивість next_href, щоб зібрати все, оскільки максимальний ліміт становить 200 треків на виклик.

  2. Використовуючи дані, зібрані в JSON, ви можете використовувати клавішу permalink_url, щоб отримати те саме, що ви ввели у браузері.

  3. Надішліть запит на permalink_url та отримайте доступ до HTML. Вам потрібно буде проаналізувати, але URL, який ви хочете, буде чимось наслідком:

    " https://api-v2.soundcloud.com/media/soundcloud:tracks:288625309/c0d9b93d-4a34-4ccf-8e16-7a87cfaa9f79/stream/progressive "

    Ви, ймовірно, можете використати регулярний вираз, щоб просто проаналізувати це.

  4. Надішліть запит на цю URL-адресу, додавши? Client_id = ..., і вона дасть вам ще ВСІЙ URL-адресу у своєму поверненому json.

  5. Використовуючи URL-адресу, повернуту з попереднього кроку, ви можете зв’язати його безпосередньо у веб-переглядачі, і він перенесе вас до вмісту треку. Я перевірив VLC, ввівши посилання, і воно коректно подається.

Сподіваємось, це допоможе комусь із вас розвиватися.


1
Ви коли-небудь думали просто використовувати v2 api? здається, у них є посилання api-v2.soundcloud.com/tracks?id=<song_id>&client_id=, яке вони використовують
user208685

Це гарне рішення. Але коли ви отримаєте пряму URL-адресу потоку і спробуєте відтворити її, лічильник програвань SoundCloud буде рахувати цю гру.
Олексій

6

Оскільки у мене така ж проблема, відповідь від @Default мотивувала мене шукати рішення. Але я не зрозумів вирішення проблем із permalink_url кроків 2 та 3. Простішим рішенням може бути:

  1. Отримати, наприклад, трек користувача, що подобається, використовуючи api-v2таку кінцеву точку:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. У відповіді ми можемо виправити необхідну URL-адресу, про яку згадував @Default у своїй відповіді:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Надішліть запит на цю URL-адресу client_id, використовуючи параметр запиту, і ви отримаєте іншу URL-адресу, за допомогою якої ви зможете передати / завантажити трек

Зауважте, що ця система api-v2все ще не є загальнодоступною, і запит вашого клієнта, ймовірно, буде заблокований CORS.


3
Треки від користувача: / users / <user_id> / треки Сподобалось користувачеві: / users / <user_id> / track_likes Просто один трек: / track / <track_id>
r3verse

@ r3verse right, відредагував мою відповідь, але представлення треку має бути однаковим для різних кінцевих точок
Serg

Так майже, @Serg, для одного треку у вас немає вкладеного об’єкта колекції, але представлення треку те саме. Дуже приємно в будь-якому випадку.
r3verse

5

Як зазначає @ user208685, рішення може бути трохи простішим за допомогою API SoundCloud v2:

  1. Отримати ідентифікатор доріжки (наприклад, використовуючи загальнодоступний API за адресою https://developers.soundcloud.com/docs )
  2. Отримайте JSON з https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. З розбору JSON проаналізуйте прогресивну URL-адресу потоку MP3
  4. З URL-адреси потоку отримуйте URL-файл MP3-файлу
  5. Відтворюйте носії з URL-файлу MP3

Примітка . Це посилання діє лише обмежений час і може бути відновлено повторенням кроків 3. - 5.

Приклад в nodenode-fetch):

const clientId = 'YOUR_CLIENT_ID';

(async () => {
  let response = await fetch(`https://api.soundcloud.com/resolve?url=https://soundcloud.com/d-o-lestrade/gabriel-ananda-maceo-plex-solitary-daze-original-mix&client_id=${clientId}`);
  const track = await response.json();
  const trackId = track.id;

  response = await fetch(`https://api-v2.soundcloud.com/tracks/${trackId}?client_id=${clientId}`);
  const trackV2 = await response.json();
  const streamUrl = trackV2.media.transcodings.filter(
    transcoding => transcoding.format.protocol === 'progressive'
  )[0].url;

  response = await fetch(`${streamUrl}?client_id=${clientId}`);
  const stream = await response.json();
  const mp3Url = stream.url;

  console.log(mp3Url);
})();

Для подібного рішення в Python перевірте цю проблему GitHub: https://github.com/soundcloud/soundcloud-python/isissue/87

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.