API Soundcloud / điểm cuối luồng phát ra lỗi 401


13

Tôi đang cố gắng viết một ứng dụng gốc phản ứng sẽ phát một số bản nhạc từ Soundcloud. Để thử nghiệm, tôi đã chơi với API bằng python và tôi có thể yêu cầu giải quyết url, kéo danh sách phát / bản nhạc và mọi thứ khác tôi cần.

Như đã nói, khi thực hiện một yêu cầu tới stream_url của bất kỳ bản nhạc nào, tôi gặp lỗi 401.

Url hiện tại trong câu hỏi là: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Tôi đã thử nó mà không có? Client_id ..., tôi đã thử thay thế? với &, tôi đã thử nhận một client_id khác, tôi đã thử nó với allow_redirects là đúng và sai, nhưng dường như không có gì hoạt động. Mọi sự trợ giúp sẽ rất được trân trọng.

Thuộc tính có thể truyền phát của mỗi bản nhạc là True, vì vậy nó không phải là vấn đề về quyền.

Biên tập:

Sau khi thực hiện một chút nghiên cứu, tôi đã tìm thấy một cách giải quyết bán thành công. Điểm cuối / luồng của API vẫn không hoạt động, nhưng nếu bạn thay đổi điểm cuối đích của mình thành http://feeds.soundcloud.com/users/soundcloud:users : /sound.rss, nó sẽ cung cấp cho bạn nguồn cấp RSS (hầu hết) giống như những gì bạn nhận được bằng cách sử dụng điểm cuối API của bản nhạc hoặc danh sách phát.

Các liên kết có trong đó có thể được truyền phát.


1
Tôi đã sử dụng API được một thời gian, gần đây tôi cũng gặp phải lỗi 401, không chỉ riêng bạn.
r3verse

Trong trường hợp của tôi với JavaScript, API không hoạt động trong vài ngày nay.
Daniel

tất cả các ứng dụng tôi sử dụng API soundcloud đã bị ngừng hoạt động trong nhiều tuần nay. có vẻ như SoundCloud đã bỏ khá nhiều sự phát triển của bên thứ ba mà thực sự rất tệ
oriyentel

Câu trả lời:


7

Được rồi, tôi nghĩ rằng tôi đã tìm thấy một giải pháp tổng quát sẽ làm việc cho hầu hết mọi người. Tôi ước nó dễ dàng hơn, nhưng đó là điều đơn giản nhất tôi đã tìm thấy.

  1. Sử dụng API để kéo các bản nhạc từ người dùng. Bạn có thể sử dụng link_partitioning và thuộc tính next_href để thu thập mọi thứ vì có giới hạn tối đa 200 bài hát cho mỗi cuộc gọi.

  2. Sử dụng dữ liệu được kéo xuống trong JSON, bạn có thể sử dụng khóa permalink_url để lấy cùng một thứ bạn sẽ nhập vào trình duyệt.

  3. Yêu cầu permalink_url và truy cập HTML. Bạn sẽ cần thực hiện một số phân tích cú pháp, nhưng url bạn muốn sẽ có tác dụng:

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

    Bạn có thể có thể sử dụng một regex để phân tích điều này một cách đơn giản.

  4. Đưa ra yêu cầu cho url này thêm? Client_id = ... và nó sẽ cung cấp cho bạn url YET ANOTHER trong phần trả về của nó.

  5. Sử dụng url được trả về từ bước trước, bạn có thể liên kết trực tiếp đến đó trong trình duyệt và nó sẽ đưa bạn đến nội dung theo dõi của bạn. Tôi đã kiểm tra trên VLC bằng cách nhập liên kết và nó truyền phát chính xác.

Hy vọng rằng điều này sẽ giúp một số bạn ra ngoài với sự phát triển của bạn.


1
Bạn đã bao giờ xem xét chỉ sử dụng api v2? có vẻ như họ có api-v2.soundcloud.com/tracks?id=<song_id>&client_id= liên kết mà họ sử dụng
user208685

Đây là quyết định tốt. Nhưng khi bạn nhận được URL luồng trực tiếp và thử chơi nó, bộ đếm SoundCloud sẽ đếm số lần phát này.
Alex

6

Vì tôi có cùng một vấn đề, câu trả lời từ @Default đã thúc đẩy tôi tìm kiếm một giải pháp. Nhưng tôi không hiểu cách giải quyết với permalink_url các bước 2 và 3. Giải pháp dễ dàng hơn có thể là:

  1. Lấy ví dụ lượt thích theo dõi người dùng bằng cách sử dụng api-v2điểm cuối như thế này:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. Trong phản hồi, chúng tôi có thể tìm thấy URL cần thiết như được đề cập từ @Default trong câu trả lời của anh ấy:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Yêu cầu URL này với client_idtư cách là một tham số truy vấn và bạn nhận được một URL khác mà bạn có thể truyền phát / tải xuống bản nhạc

Lưu ý rằng api-v2vẫn chưa được công khai và yêu cầu từ khách hàng của bạn có thể sẽ bị CORS chặn.


3
Các bản nhạc từ người dùng là: / users / <user_id> / track Lượt thích từ người dùng là: / users / <user_id> / track_like Chỉ một bản nhạc duy nhất là: / track / <track_id>
r3verse

@ r3verse đúng, đã chỉnh sửa câu trả lời của tôi, nhưng đại diện theo dõi phải giống nhau cho các điểm cuối khác nhau
Serg

Có, hầu như, @Serg, đối với một bản nhạc duy nhất bạn không có đối tượng bộ sưu tập lồng nhau, nhưng đại diện theo dõi là như nhau. Một trong hai cách rất tốt đẹp.
r3verse

5

Như được đề cập bởi @ user208685 , giải pháp có thể đơn giản hơn một chút bằng cách sử dụng SoundCloud API v2:

  1. Lấy ID theo dõi (ví dụ: sử dụng API công khai tại https://developers.soundcloud.com/docs )
  2. Nhận JSON từ https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Từ JSON phân tích cú pháp URL luồng lũy ​​tiến
  4. Từ URL luồng nhận URL tệp MP3
  5. Phát phương tiện từ URL tệp MP3

Lưu ý : Liên kết này chỉ có hiệu lực trong một khoảng thời gian giới hạn và có thể được tạo lại bằng cách lặp lại các bước 3. đến 5.

Ví dụ trong node(với 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);
})();

Để biết một giải pháp tương tự trong Python, hãy kiểm tra vấn đề GitHub này: https://github.com/soundcloud/soundcloud-python/issues/87

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.