Soundcloud API /流端点产生401错误


13

我正在尝试编写一个反应本机应用程序,该应用程序将流化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进行了尝试,但是似乎没有任何效果。任何帮助将不胜感激。

每个轨道的streamable属性为True,因此它不应该是权限问题。

编辑:

经过一些研究,我发现了一个半成功的解决方法。API的/ stream端点仍然无法使用,但是如果将目标端点更改为http://feeds.soundcloud.com/users/soundcloud:users,它将为您提供RSS提要(大部分)与使用tracks或playlists API端点所获得的相同。

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


1
我使用API​​已有一段时间了,最​​近我也收到401错误,不仅仅是您。
r3verse

就我的JavaScript而言,API几天都无法使用。
丹尼尔(Daniel)

到目前为止,我使用的所有影响soundcloud API的应用程序都已关闭数周。似乎SoundCloud几乎放弃了第三方开发,这确实很糟糕
oriyentel

Answers:


7

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

  1. 使用API​​从用户处提取曲目。您可以使用linked_pa​​rtitioning和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. 向此网址添加一个请求,添加?client_id = ...,它将在返回json中为您提供另一个网址。

  5. 使用上一步返回的url,您可以直接链接到浏览器中的URL,它将带您进入跟踪内容。我通过输入链接检查了VLC,它可以正确传输。

希望这可以帮助一些人发展自己。


1
您是否曾经考虑过仅使用v2 API?似乎他们使用了api-v2.soundcloud.com/tracks?id=<song_id>&client_id=链接
user208685 '19

这是个好决定。但是,当您获得直接流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. client_id使用查询参数对此URL进行请求,您将获得另一个URL,您可以在其中传输/下载轨道

请注意,api-v2仍然不公开,并且来自客户的请求可能会被CORS阻止。


3
来自用户的曲目为:/ users / <user_id> / tracks来自用户的喜欢为:/ users / <user_id> / track_likes仅一个曲目为:/ tracks / <track_id>
r3verse

@ r3verse向右,编辑了我的答案,但不同端点的轨道表示应该相同
Serg

是的,几乎是@Serg,对于单个轨道,您没有嵌套的集合对象,但是轨道表示形式是相同的。无论哪种方式都很好。
r3verse19年

5

@ 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);
})();

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.