Soundcloud API /stream 端点给出 401 错误

Def*_*ult 15 soundcloud react-native

我正在尝试编写一个 react native 应用程序,它将从 Soundcloud 流式传输一些曲目。作为测试,我一直在使用 python 使用 API,并且我能够发出请求来解析 url、拉出播放列表/曲目以及我需要的所有其他内容。

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

当前有问题的网址是: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 端点所获得的相同。

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

Def*_*ult 7

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

  1. 使用 API 从用户那里提取曲目。您可以使用 links_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=... 的请求,它会在它的返回 json 中给你 YET ANOTHER url。

  5. 使用从上一步返回的 url,您可以直接链接到浏览器中的 url,它将带您到您的曲目内容。我通过输入链接来检查 VLC,并且它可以正确传输。

希望这可以帮助你们中的一些人进行开发。


Ser*_*erg 6

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

  1. 获取例如用户跟踪喜欢使用这样的api-v2端点:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
Run Code Online (Sandbox Code Playgroud)
  1. 在响应中,我们可以找到所需的 URL,如@Default 在他的回答中提到的:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
Run Code Online (Sandbox Code Playgroud)
  1. 使用client_id作为查询参数向此 URL 发出请求,您将获得另一个 URL,您可以使用该 URL 流式传输/下载曲目

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

  • 用户的曲目为:/users/&lt;user_id&gt;/tracks 用户的点赞为:/users/&lt;user_id&gt;/track_likes 仅单个曲目为:/tracks/&lt;track_id&gt; (3认同)

小智 6

正如@user208685所提到的,通过使用 SoundCloud API v2,解决方案可以更简单一些:

  1. 获取轨道 ID(例如使用https://developers.soundcloud.com/docs 上的公共 API )
  2. https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID获取 JSON
  3. 从 JSON 解析 MP3 渐进式流 URL
  4. 从流 URL 获取 MP3 文件 URL
  5. 从 MP3 文件 URL 播放媒体

注意:此链接仅在有限的时间内有效,并且可以通过重复步骤 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);
})();
Run Code Online (Sandbox Code Playgroud)

对于 Python 中的类似解决方案,请查看此 GitHub 问题:https : //github.com/soundcloud/soundcloud-python/issues/87