Soundcloud API /stream 端点给出 401 错误

Soundcloud API /stream endpoint giving 401 error

我正在尝试编写一个反应本机应用程序,它将流式传输来自 Soundcloud 的一些曲目。作为测试,我一直在使用 python 来玩 API,并且我能够发出请求来解析 url、拉取 playlists/tracks 以及所有内容否则我需要。

话虽如此,当向任何给定轨道的 stream_url 发出请求时,我收到 401 错误。

目前有问题的 url 是: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

我试过不带 ?client_id...,我试过替换 ?使用 &,我已经尝试获得另一个 client_id,我已经尝试使用 allow_redirects 作为 true 和 false,但似乎没有任何效果。任何帮助将不胜感激。

每首曲目的可流属性都是True,所以应该不是权限问题。

编辑:

经过一些研究,我找到了一个半成功的解决方法。 API 的 /stream 端点仍然无法正常工作,但如果您将目标端点更改为 http://feeds.soundcloud.com/users/soundcloud:users:/sounds.rss,它将为您提供一个(主要是)RSS 提要与使用曲目或播放列表 API 端点所获得的相同。

其中包含的link可以流式传输。

好的,我想我已经找到了适用于大多数人的通用解决方案。我希望它更简单,但这是我发现的最简单的东西。

  1. 使用API从用户那里拉曲目。您可以使用 linked_partitioning 和 next_href 属性 来收集所有内容,因为每次调用的最大限制是 200 首曲目。

  2. 使用 JSON 中下拉的数据,您可以使用 permalink_url 键获得与在浏览器中输入的内容相同的内容。

  3. 向 permalink_url 发出请求并访问 HTML。你需要做一些解析,但是你想要的 url 会是这样的:

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

    您或许可以使用正则表达式来简单地解析它。

  4. 向这个 url 提出请求,添加 ?client_id=... 它会在其 [=52= 中给你另一个 url ] json.

  5. 使用上一步的 url returned,您可以 link 直接在浏览器中访问它,它将带您到您的跟踪内容。我通过输入 link 检查了 VLC,它的流式传输正确。

希望这对你们中的一些人有所帮助。

由于我遇到了同样的问题,@Default 的回答促使我寻找解决方案。但是我不明白第 2 步和第 3 步中 permalink_url 的解决方法。更简单的解决方案可能是:

  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. 使用 client_id 作为查询参数向这个 URL 发出请求,你会得到另一个 URL,你可以 stream/download 曲目

请注意,api-v2 仍然不是 public,您的客户端的请求可能会被 CORS 阻止。

@user208685 所述,使用 SoundCloud API v2 可以使解决方案更简单一些:

  1. 获取曲目ID(例如使用public API at https://developers.soundcloud.com/docs
  2. https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. 得到JSON
  4. 来自JSON解析MP3渐进流URL
  5. 从流URL获取MP3文件URL
  6. 播放 MP3 文件中的媒体URL

注意:此link仅在有限的时间内有效,可以通过重复步骤3.至5.

重新生成

node 中的示例(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 中的类似解决方案,请查看此 GitHub 问题:https://github.com/soundcloud/soundcloud-python/issues/87