17

我试图为我的 HTML5 播放器隐藏我的音频流的 URL,并且真的很难想办法做到这一点,然后我意识到,soundcloud 必须隐藏其流的 URL。所以我去了 soundcloud,打开控制台并播放了一首曲目,但我看不到任何明显的隐藏 URL 的方式。之后,我查看了 DOM 树,看看里面是否有任何音频信息,但我什么也没找到!甚至没有播放器/音频的 ID,所以我很困惑 soundcloud 是如何做到的。

现在,我已经尽我所能隐藏音频 URL。我已经在 DOM 中为曲目放置了一个 ID,在单击播放按钮时获取了该 ID,并从数据库中检索了该 ID 的 URL。一个明显的问题是任何有足够意愿的人都可以直接进入控制台并从网络事件中获取 URL。

我并没有试图打破 soundcloud 的安全性来下载我不应该下载的曲目。我只是好奇他们是如何隐藏 URL 的。现在我也很好奇每个轨道是如何区分的,因为 DOM 中没有任何东西可以区分它们(无论如何我在简短的观察中发现的不是)。

所以,简而言之,是否有人对 soundcloud 如何实现这一目标或如何实现这一目标有任何想法?

4

3 回答 3

20

Soundcloud 几乎是一个纯 JS 网站。

正如你所说,没有用 HTML 加载的歌曲的 ID。识别歌曲的方式是通过页面 URL。是通过。此网址(示例):

https://api.sndcdn.com/resolve?url=https%3A//soundcloud.com/hoodinternet/joywave-tongues-hood-internet-remix&_status_code_map%5B302%5D=200&_status_format=json&client_id=YOUR_CLIENT_ID

这将返回如下内容:

{"status":"302 - Found","location":"https://api.soundcloud.com/tracks/100270342?client_id=YOUR_CLIENT_ID"}

接下来,它从上面的 JSON 加载位置 URL。这会返回一堆关于轨道的信息,包括:

stream_url: "https://api.soundcloud.com/tracks/100270342/stream"

然后它加载这个 URL:

https://api.sndcdn.com/i1/tracks/100270342/streams?client_id=YOUR_CLIENT_IT

它返回如下响应:

{"http_mp3_128_url":"https://ec-media.soundcloud.com/2gNVBYiZ06bU.128.mp3?ff61182e3c2ecefa438cd021sdf02d0e385713f0c1faf3b0339595664fe070de810d30a8e3a1186eda958909e9ed97799adfeceabc135efac83aee4271217a108450591db3b88\u0026AWSAccessKeyId=AKIAsdfJ4IAZE5EOIdsf7PA7VQ\u0026Expires=1374883403\u0026Signature=%2B1%2B7dfdfLN4NWP3C3bNF3gizSEVIU%3D"}

这就是他们隐藏流 URL 的方式。唯一不明显的部分是他们通过使用 URL 作为参数访问 API 来找到歌曲 ID。支持它的轨道上的下载 URL 也可以这样做。

于 2013-07-27T00:09:06.730 回答
2

如果你去 SoundCloud.com 并打开你的调试器(我正在使用 Chrome)。查看“网络”选项卡,您会看到一个调用 audio?anonymous_id######### 的脚本。

它的结构类似于 REST 调用,这意味着它们将 id 传递给后端的服务,并匿名返回音频输出。

于 2013-07-27T00:06:10.253 回答