401 hatası veren Soundcloud API / akış uç noktası


13

Soundcloud'dan bazı parçaları aktaracak bir tepki yerel uygulaması yazmaya çalışıyorum. Bir test olarak, python kullanarak API ile oynuyorum ve URL'yi çözmek, çalma listelerini / parçaları çekmek ve ihtiyacım olan diğer her şeyi yapmak için istekte bulunabilirim.

Bununla birlikte, herhangi bir parçanın stream_url'sine istekte bulunurken 401 hatası alıyorum.

Söz konusu mevcut URL: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

? Client_id ... olmadan denedim, değiştirmeyi denedim? & ile, başka bir client_id almayı denedim, allow_redirects ile hem doğru hem de yanlış olarak denedim, ancak hiçbir şey işe yaramıyor. Herhangi bir yardım büyük mutluluk duyacağız.

Her parçanın aktarılabilir özelliği True olduğundan, bir izin sorunu olmamalıdır.

Düzenle:

Biraz araştırma yaptıktan sonra yarı başarılı bir çözüm buldum. API'nın / stream uç noktası hala çalışmıyor, ancak hedef uç noktanızı http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss olarak değiştirirseniz, size bir RSS feed'i verir (çoğunlukla) parçalar veya oynatma listeleri API uç noktasını kullanarak alacağınızla aynıdır.

Burada bulunan bağlantı akabilir.


1
Bir süredir API kullanıyorum, ayrıca son zamanlarda 401 hatası alıyorum, sadece sen değil.
r3verse

JavaScript ile benim durumumda, API birkaç gün boyunca çalışmıyor.
Daniel

hit hit soundcloud API'lerini kullandığım tüm uygulamaların tümü haftalardır çalışmıyor. SoundCloud'un gerçekten berbat olan üçüncü taraf gelişimini terk ettiği gibi görünüyor
oriyentel

Yanıtlar:


7

Tamam, sanırım çoğu insan için işe yarayacak genelleştirilmiş bir çözüm buldum. Keşke daha kolay olsaydı, ama henüz bulduğum en basit şey.

  1. Kullanıcıdan parça çekmek için API kullanın. Arama başına maksimum 200 parça olduğundan, her şeyi toplamak için Linked_Partitioning ve next_href özelliğini kullanabilirsiniz.

  2. JSON'da açılan verileri kullanarak, tarayıcıya yazacağınız şeyi elde etmek için permalink_url tuşunu kullanabilirsiniz.

  3. Permalink_url için bir istekte bulunun ve HTML'ye erişin. Bazı ayrıştırma yapmanız gerekecek, ancak istediğiniz url, aşağıdakilerin etkisi için bir şey olacaktır:

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

    Bunu basitçe çözümlemek için muhtemelen bir normal ifade kullanabilirsiniz.

  4. ? Url_id = ... ekleyerek bu url için bir istekte bulunursanız, dönüşünde json başka bir url verir.

  5. Önceki adımdan döndürülen url'yi kullanarak, doğrudan tarayıcıdaki URL'ye bağlayabilirsiniz ve sizi parça içeriğinize götürür. Bağlantıyı girerek VLC'yi kontrol ettim ve doğru bir şekilde akıyor.

Umarım bu gelişmekte bazılarınız için yardımcı olur.


1
Hiç v2 api kullanmayı düşündünüz mü? kullandıkları api-v2.soundcloud.com/tracks?id=<song_id>&client_id= bağlantısı var gibi görünüyor
user208685

Bu iyi bir karardır. Ancak doğrudan akış URL'si alıp oynatmaya çalıştığınızda, SoundCloud oynatma sayacı ton bu oyunu sayar.
Alex

6

Aynı sorunu yaşadığım için, @Default'un cevabı beni bir çözüm aramaya motive etti. Ancak permalink_url adım 2 ve 3'teki geçici çözümü anlamadım . Daha kolay çözüm şu olabilir:

  1. Örneğin kullanıcı api-v2noktası beğenilerini aşağıdaki gibi uç nokta kullanarak getir:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. Yanıtta, cevabında @Default'tan bahsedildiği gibi gerekli URL'yi dosyalayabiliriz:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Bu URL'ye client_idsorgu parametresi olarak istekte bulunun ve parçayı akışla / indirebileceğiniz başka bir URL alırsınız

Bunun api-v2hala herkese açık olmadığını ve istemcinizden gelen isteğin CORS tarafından engelleneceğini unutmayın.


3
Bir kullanıcıdan izler: / users / <user_id> / tracks Bir kullanıcıdan beğeniler: / users / <user_id> / track_likes Tek bir parça: / tracks / <track_id>
r3verse 24:09

@ r3verse sağ, cevabımı düzenledi, ancak parça gösterimi farklı uç noktalar için aynı olmalı
Serg

Evet neredeyse, @Serg, tek bir parça için iç içe bir koleksiyon nesneniz yok, ancak parça gösterimi aynı. Her iki şekilde de çok güzel.
r3verse

5

@ User208685'te belirtildiği gibi , çözüm SoundCloud API v2 kullanılarak biraz daha basit olabilir:

  1. Parça kimliğini edinin (ör. Https://developers.soundcloud.com/docs adresindeki genel API'yı kullanarak )
  2. JSON'u https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID adresinden alın.
  3. JSON ayrıştırma MP3 aşamalı akış URL'si
  4. Akış URL'sinden MP3 dosyası URL'si alın
  5. MP3 dosya URL'sinden medya yürütme

Not : Bu bağlantı yalnızca sınırlı bir süre için geçerlidir ve 3. ila 5. adımlar tekrarlanarak yeniden oluşturulabilir.

İle örnek node(ile node-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'da benzer bir çözüm için şu GitHub sorununu kontrol edin: https://github.com/soundcloud/soundcloud-python/issues/87

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.