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可以流式传输。
好的,我想我已经找到了适用于大多数人的通用解决方案。我希望它更简单,但这是我发现的最简单的东西。
使用API从用户那里拉曲目。您可以使用 linked_partitioning 和 next_href 属性 来收集所有内容,因为每次调用的最大限制是 200 首曲目。
使用 JSON 中下拉的数据,您可以使用 permalink_url 键获得与在浏览器中输入的内容相同的内容。
向 permalink_url 发出请求并访问 HTML。你需要做一些解析,但是你想要的 url 会是这样的:
您或许可以使用正则表达式来简单地解析它。
向这个 url 提出请求,添加 ?client_id=... 它会在其 [=52= 中给你另一个 url ] json.
使用上一步的 url returned,您可以 link 直接在浏览器中访问它,它将带您到您的跟踪内容。我通过输入 link 检查了 VLC,它的流式传输正确。
希望这对你们中的一些人有所帮助。
由于我遇到了同样的问题,@Default 的回答促使我寻找解决方案。但是我不明白第 2 步和第 3 步中 permalink_url
的解决方法。更简单的解决方案可能是:
- 例如使用
api-v2
端点获取用户跟踪喜欢这样的:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
- 在响应中,我们可以找到所需的 URL,就像@Default 在他的回答中提到的那样:
collection: [
{
track: {
media: {
transcodings:[
...
{
url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
...
}
]
}
}
...
]
- 使用
client_id
作为查询参数向这个 URL 发出请求,你会得到另一个 URL,你可以 stream/download 曲目
请注意,api-v2
仍然不是 public,您的客户端的请求可能会被 CORS 阻止。
如 @user208685 所述,使用 SoundCloud API v2 可以使解决方案更简单一些:
- 获取曲目ID(例如使用public API at https://developers.soundcloud.com/docs)
- 从https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
得到JSON
- 来自JSON解析MP3渐进流URL
- 从流URL获取MP3文件URL
- 播放 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
我正在尝试编写一个反应本机应用程序,它将流式传输来自 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可以流式传输。
好的,我想我已经找到了适用于大多数人的通用解决方案。我希望它更简单,但这是我发现的最简单的东西。
使用API从用户那里拉曲目。您可以使用 linked_partitioning 和 next_href 属性 来收集所有内容,因为每次调用的最大限制是 200 首曲目。
使用 JSON 中下拉的数据,您可以使用 permalink_url 键获得与在浏览器中输入的内容相同的内容。
向 permalink_url 发出请求并访问 HTML。你需要做一些解析,但是你想要的 url 会是这样的:
您或许可以使用正则表达式来简单地解析它。
向这个 url 提出请求,添加 ?client_id=... 它会在其 [=52= 中给你另一个 url ] json.
使用上一步的 url returned,您可以 link 直接在浏览器中访问它,它将带您到您的跟踪内容。我通过输入 link 检查了 VLC,它的流式传输正确。
希望这对你们中的一些人有所帮助。
由于我遇到了同样的问题,@Default 的回答促使我寻找解决方案。但是我不明白第 2 步和第 3 步中 permalink_url
的解决方法。更简单的解决方案可能是:
- 例如使用
api-v2
端点获取用户跟踪喜欢这样的:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
- 在响应中,我们可以找到所需的 URL,就像@Default 在他的回答中提到的那样:
collection: [
{
track: {
media: {
transcodings:[
...
{
url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
...
}
]
}
}
...
]
- 使用
client_id
作为查询参数向这个 URL 发出请求,你会得到另一个 URL,你可以 stream/download 曲目
请注意,api-v2
仍然不是 public,您的客户端的请求可能会被 CORS 阻止。
如 @user208685 所述,使用 SoundCloud API v2 可以使解决方案更简单一些:
- 获取曲目ID(例如使用public API at https://developers.soundcloud.com/docs)
- 从https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID 得到JSON
- 来自JSON解析MP3渐进流URL
- 从流URL获取MP3文件URL
- 播放 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