Soundcloud – Die Suche nach dem Stream

Ich war mal, nach einer gefühlten Ewigkeit, wieder auf Soundcloud und hab das neue Design bemerkt. Sieht super aus, aber nun kann ich nicht mehr die Musik runterladen die ich möchte. Speziell interactiondnb find ich mit seinem Liquid Drum & Bass super cool und habe immer seine Musik runtergeladen. Vorher war es so, dass direkt im Sourcecode eine Streaming URL stand. Durch das neue Design ist der Sourcecode enorm unübersichtlich geworden. Speziell die gefühlten Millionen von Skripten tragen ihren Teil dazu bei.

Lasst die Jagd beginnen!

Zunächst habe ich normal in den Quelltext geschaut und fand heraus, dass alles mögliche an Skripten verbaut ist. Da kann man sich ja stundenlang in diesen Skripten verlieren und schlussendlich kann es sein das ich nichts finde. Hier ein kleiner Ausschnitt:

erste Suche

Da es nicht viel nützt stundenlang in diesen Code rumzuwühlen, habe ich mir überlegt alles zu markieren und dann mal den Quellcode anzuschauen. In Firefox durch STRG + A alles markiert und dann den Auswahlquelltext anzeigen lassen:

zweite Suche

Das sieht wenigstens nach etwas mehr aus, aber auch die Suche nach bestimmten Strings wie „Stream“, „url“ oder den Songnamen, haben mich kaum auf eine heiße Spur gebracht. Mir viel dann ein, dass die Seite irgendwann auf die URL des Streams zugreifen muss. Sie sendet also irgendeinen Befehl an den Server. Wie kann ich diesen am besten Abfangen? Richtig! Tamper Data ein super Firefox Plug-In hilft mir dabei. Es fragt mich vorher, ob ich ein Request des Browsers bearbeiten möchte oder nicht. Also URL kopieren, Cookies zur Sicherheit löschen und Tamper Data starten.

URL_json rest

Das erste was mir auffiel war, dass Tamper Data direkt die Streaming URL anzeigt. Doch da steckt noch mehr dahinter! Die weiteren markierten URL’s sind auch sehr interessant. Besonders die „streams“ JSON ist sehr interessant:

{"http_mp3_128_url":"http://ec-media.soundcloud.com/Ot97aUsJ8tF3.128.mp3?ff61182e3c2ecefa438cd02102d0e385713f0c1faf3b0339595666f30e07ef12826d69bb8ec147d8aceec49aa19de36b7a652aff67297ceee900d5396aeebb87748c4d4df1\u0026AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ\u0026Expires=1359124680\u0026Signature=fm7WiDscYGpTydG7YZ3zM7HnJpo%3D"}

Nun müssen wir das nur noch dynamisch erkennen und können so schnell an die Stream URL kommen. Mit dieser kann man dann super die Songs downloaden. Mal schauen was die resolve JSON macht!

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

Gut wir bekommen eine neue URL, ich habe jedoch ein wenig an der aktuellen URL rumgespielt und bin dann auf eine XML Datei gestoßen.

Ursprünglich: https://api.sndcdn.com/resolve?url=https%3A//soundcloud.com/interactiondnb/interaction-animus&_status_code_map[302]=200&_status_format=json&client_id=b45b1aa10f1ac2941910a7f0d10f8e28

Bearbeitet: https://api.sndcdn.com/resolve?url=https%3A//soundcloud.com/interactiondnb/interaction-animus&_status_format=json&client_id=b45b1aa10f1ac2941910a7f0d10f8e28

Ich habe einfach die Status Code Map entfernt und habe durch die Änderung eine XML Datei zurück bekommen.

<track>
<kind>track</kind>
<id type="integer">64899708</id>
<created-at type="datetime">2012-10-26T17:55:24Z</created-at>
<user-id type="integer">1898139</user-id>
<duration type="integer">269060</duration>
<commentable type="boolean">true</commentable>
<state>finished</state>
<original-content-size type="integer">10760490</original-content-size>
<sharing>public</sharing>
<tag-list>dnb drum and bass liquid funk beat mp3 music free interaction animus fl studio fruity loops</tag-list>
<permalink>interaction-animus</permalink>
<streamable type="boolean">true</streamable>
<embeddable-by>all</embeddable-by>
<downloadable type="boolean">true</downloadable>
<purchase-url nil="true"/>
<label-id nil="true"/>
<purchase-title nil="true"/>
<genre>Drum & Bass</genre>
<title>Interaction - Animus[Free]</title>
<description/>
<label-name/>
<release/>
<track-type>original</track-type>
<key-signature/>
<isrc/>
<video-url nil="true"/>
<bpm nil="true"/>
<release-year nil="true"/>
<release-month nil="true"/>
<release-day nil="true"/>
<original-format>mp3</original-format>
<license>all-rights-reserved</license>
<uri>https://api.soundcloud.com/tracks/64899708</uri>
<user>
<id type="integer">1898139</id>
<kind>user</kind>
<permalink>interactiondnb</permalink>
<username>interactiondnb</username>
<uri>https://api.soundcloud.com/users/1898139</uri>
<permalink-url>http://soundcloud.com/interactiondnb</permalink-url>
<avatar-url>https://i1.sndcdn.com/avatars-000002488387-wfnii8-large.jpg?0d80db2</avatar-url>
</user>
<permalink-url>http://soundcloud.com/interactiondnb/interaction-animus</permalink-url>
<artwork-url nil="true"/>
<waveform-url>https://w1.sndcdn.com/Ot97aUsJ8tF3_m.png</waveform-url>
<stream-url>https://api.soundcloud.com/tracks/64899708/stream</stream-url>
<download-url>https://api.soundcloud.com/tracks/64899708/download</download-url>
<playback-count type="integer">192</playback-count>
<download-count type="integer">55</download-count>
<favoritings-count type="integer">8</favoritings-count>
<comment-count type="integer">7</comment-count>
<likes-count type="integer">8</likes-count>
<reposts-count type="integer">0</reposts-count>
<attachments-uri>https://api.soundcloud.com/tracks/64899708/attachments</attachments-uri>
</track>

Das ist schonmal perfekt, weil wir die ID des Songs zurück bekommen. Mit der ID kann man nun selbst einen Request für den Song generieren und bekommt dann die Stream URL:

https://api.sndcdn.com/i1/tracks/[TRACK ID]/streams?client_id=b45b1aa10f1ac2941910a7f0d10f8e28

Doch was hat diese client_id zu sagen? Wenn ich sie weglasse bekomme ich eine Fehlermeldung zurück „401 – Unauthorized“. Das heißt es handelt sich um eine Art Schlüssel. Auch hat sie die Länge eines MD5 Hashes, jedoch haben die Suchmaschinen keine Ergebnisse ausgespuckt. Wenn die Client ID einfach fest definiert ist und überall gleich ist, kann man nicht wirklich von Schutz oder Schlüssel reden. Deswegen habe ich mich mit unterschiedlichen Systemen mit Soundcloud verbunden, um zu überprüfen ob diese ID sich ändert. Ohne Erfolg, die ID scheint einfach nur fest definiert zu sein. Nehmen wir das mal so hin :)

Fazit

Nun ja, was lernen wir daraus. Zum downloaden von Songs findet man zu aller erst die Track ID heraus. Dann könnt ihr unter folgender URL die Songs von Soundcloud laden:

https://api.sndcdn.com/i1/tracks/[TRACK ID]/streams?client_id=b45b1aa10f1ac2941910a7f0d10f8e28

Wenn ihr die Track ID nicht wisst, dann kopiert die URL von Soundcloud und nehmt diese URL:

https://api.sndcdn.com/resolve?url=[URL]&client_id=b45b1aa10f1ac2941910a7f0d10f8e28

In diesem Dokument findet ihr dann die passende ID und könnt dann die Stream URL abfragen. Wenn ich langeweile habe, werde ich nen kleinen Crawler basteln. Dann könnt ihr ganz bequem von einer GUI Downloaden. So viel zu Soundcloud :D

Viel Spaß beim Musik downloaden
Greetz TheVamp

PS: Wenn euch die Musik gefällt, versucht die Künstler auch irgendwie zu unterstützen. Sei es Werbung machen, Alben kaufen, auf Konzerte gehen oder Merchandise. Aber die Leute die was ausm Netz laden, sind sowieso Vielkonsumierer und wenn sie Geld haben geben sie es auch gerne aus :D

2 thoughts on “Soundcloud – Die Suche nach dem Stream”

  1. Na, gibt es schon was neues zum Crawler? Würde mich freuen, die Tuts sind zwar gut gemacht aber naja, du kennst ja die Geschichte mit der Bequemlichkeit. :-)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.