Long time no see, lieber Blag. Wie dem auch sei, fangen wir gleich mal an.
Ein aktuelles Projekt von mir erforderte wieder einmal ein paar Sachen, die so nicht vorgesehen sind. Ich muss mir eine DeviantArt-Page holen, dort eine Versionsnummer finden und die Datei, die sich hinter der Seite verbirgt, mit meinem Programm downloaden können. Von der Sache her klingt das ganze recht einfach, die Umsetzung hingegen ist etwas lustig, da DeviantArt keine solche Verwendung ihrer Seite vorsieht und damit auch keine API anbietet.
Ich will nicht groß um den heißen Brei drum herum reden. Ich werde kurz in Worten erklären, was gemacht werden muss, dann folgt ein Code-Beispiel in C#.
Im Grunde muss nur die DeviantArt-Seite geholt und untersucht werden. Für den ganzen Kram braucht ihr einen vernünftigen User-Agent, ich hab mich an dieser Stelle einfach mal bei useragentstring.com bedient und mir den UA für einen alten Chrome (37) geschnappt. Wenn die DeviantArt-Seite das erste Mal herunterladet, bekommt ihr Cookies zugewiesen – gut aufbewahren! Als nächstes müsst ihr nach dem passenden Download-Link suchen. Der ist für jeden Seitenaufruf und für jede Datei (surprise, surprise) natürlich anders, sonst würde ich hier nicht darüber schreiben. Da ich mich in den letzten Monaten in reguläre Ausdrücke verliebt habe, habe ich das ganze natürlich auch damit umgesetzt. Ist eigentlich auch gar nicht so schwer:
"(http://www\.deviantart\.com/download/\d*/.*)"
In Matchgroup 1 ist anschließend der Download-Link enthalten. Wichtig ist hier, dass die double quotes mit in den regulären Ausdruck reingehören, diese haben mir als Start- und Endmarker gedient. Wer das soweit hat, muss noch & durch & ersetzen, dann hat man einen funktionierenden Download-Link. Um diesen aber auch wirklich nutzen zu können, müssen beim neuen Request die alten Cookies und als Referer die DeviantArt-Seite mit übergeben werden. Anschließend wird einem auch schon der Download entgegen geworfen.
Zum Schluss jetzt mal noch das Beispiel in C# und mithilfe des .NET Framework. Ich verwende für die ganze Sache meine eigene Klasse BetterWebClient, die von WebClient erbt und einfach nur die Unterstützung für Cookies, User-Agent-Strings und Referer hinzufügt – nicht allzu schwer umzusetzen. Wer den Code nicht durch meine Erklärung oben umsetzen konnte, findet hier einen Gist mit dem benötigten Code. Wie man dem WebClient Cookies, Referer und User-Agents beibringt, findet ihr bestimmt problemlos selbst heraus.
Das war’s auch erstmal wieder, man sieht sich!
Funktioniert der Code noch für dich oder hat DA seinen Schutz verfeinert?
Ich versuche das Download-Problem auch gerade zu lösen (in Java), aber trotz Cookie und Referer-Header bekomme ich immer ein 404.
Hm, scheint wohl nicht mehr so zu klappen. Vermutlich passt auch der reguläre Ausdruck gar nicht mehr. Leider benutze ich weder DA noch die Anleitung oben noch aktiv, sodass ich jetzt auf die Schnelle auch keine Lösung weiß.
Aber so wie ich mich kenne, wird mich das nun nicht mehr in Ruhe lassen und ich werde es mir unter Umständen nochmal ansehen. 🙂
Ich habe mittlerweile den Eindruck, dass DA prüft, ob auch andere Elemente der Seite geladen wurden und erst dadurch den Cookie akzeptiert.
Mittlerweile habe ich mir eine Lösung gebaut, die die DA-Seite in einem automatisierten Browser öffnet und da auf den Download-Button „klickt“. Das funktioniert zwar, ist aber unbefriedigend und umständlich.