Kurz nachdem ich den letzten Beitrag über zippyshare veröffentlicht habe, hat die Seite wieder umgestellt auf einen anderen „Schutz“ der Downloadlinks. Diesmal ist es aber ziemlich einfach an diese zu geraten, man muss nur nach documents.getElementById(‚dlbutton‘).href = „…“ suchen. Dort findet sich in Klammern ein einfacher mathematischer Ausdruck, der in fasst jeder Programmiersprache mit einem Einzeiler ausgeführt werden kann.
Javascript
Zippyshare Downloads automatisieren
Zur Zeit arbeite ich an einem Downloadmanager, der alle gängigen Download-Seiten unterstützen soll. Neulich hat zippyshare.com etwas eingebaut um genau diesen „automatischen“ Downloads einen Riegel vorzuschieben: Der Download-Link wird jetzt per JavaScript „verschlüsselt“. Ich werde jetzt hier keinen Beispiel-Zippyshare-Downloadlink posten, das findet man mit etwas googlen schnell selbst 😉
Nun möchte ich erläutern, wie ich den Download-Link automatisch auslese:
Zuerst entnehme ich der Seite per Regulärem Ausdruck die benötigten JavaScript Variablen:
xHTML-Code der Stelle
var zipdata = eval(eval(eval(((function() {var parzDiXdet= (((function() {var hutByDojpZ= eval(379);var BvLCmMYDEQB= ((function() {var qefrKDjxbJ= eval(51);var DKbCbnceoJN= ((((18+(3*3)))+((function() {var kzCDpmQUwq= eval(eval(43));var UoRHKeZvyaH= 23;return (kzCDpmQUwq+UoRHKeZvyaH)})())));return (qefrKDjxbJ+DKbCbnceoJN)})());return (hutByDojpZ+BvLCmMYDEQB)})())*eval((19*eval(29)+((eval((eval(3)*3))+(((function() {var fhYCresaSD= 0;var XRIVTZgfbzF= eval(2);return (fhYCresaSD+XRIVTZgfbzF)})())*eval(3)+1)))))+468);var MpIWcCCkdZo= (((function() {var ciqbBKFBYW= eval(80);var aAZRNKwkocE= 242;return (ciqbBKFBYW+aAZRNKwkocE)})())*(3*(8*eval(32)+(1*((function() {var yMgeUqevwX= ((function() {var CIechCiWBN= 0;var GoKsZmkLAMw= ((function() {var JYpKjwyxxu= 0;var YfDpdwhpscp= 2;return (JYpKjwyxxu+YfDpdwhpscp)})());return (CIechCiWBN+GoKsZmkLAMw)})());var FklyvoQTPho= eval(eval(2));return (yMgeUqevwX+FklyvoQTPho)})())))+eval(eval((1*((0+eval(2)))))))+261);return (parzDiXdet+MpIWcCCkdZo)})())))); var fulllink = 'http://www123.zippyshare.com/d/123456789/'+zipdata+'/Alarmclock.mp3'; document.getElementById('dlbutton').href = fulllink;
Regexp zum auslesen
$aFind = StringRegExp($ZippySrc, "s*(var zipdata = .*;)s*var fulllink = '(.*)';s*document", 1)
Nun muss die Variable „zipdata“ evaluiert werden. Dies mache ich wie folgt:
; ; ; Evaluate zippyshare.com JavaScript ; ; Coded by www.agrafix.net ; ; Func _JSParse_Parse($sJavaScript) For $_x = 0 To 50 If StringRegExp($sJavaScript, "var zipdata = ([0-9]*);") Then ExitLoop EndIf $sJavaScript = _JSParse_NumericVariableDeclarations($sJavaScript) $sJavaScript = _JSParse_EvaluateEasyMath($sJavaScript) $sJavaScript = _JSParse_SimpleEvals($sJavaScript) $sJavaScript = _JSParse_SimpleFunctions($sJavaScript) Next $m = StringRegExp($sJavaScript, "var zipdata = ([0-9]*);", 1) Return $m[0] EndFunc Func _JSParse_SourceReplace($aArray, $sJavaScript) For $i = 0 To UBound($aArray) - 1 Step 2 $sJavaScript = StringReplace($sJavaScript, $aArray[$i], $aArray[$i+1]) Next Return $sJavaScript EndFunc Func _JSParse_NumericVariableDeclarations($sJavaScript) $aNumDeclarations = StringRegExp($sJavaScript, "var ([a-zA-Z0-9_-]*) ?= ([0-9]*);", 3) $sJavaScript = StringRegExpReplace($sJavaScript, "var ([a-zA-Z0-9_-]*) ?= ([0-9]*);", "") $sJavaScript = _JSParse_SourceReplace($aNumDeclarations, $sJavaScript) Return $sJavaScript EndFunc Func _JSParse_EvaluateEasyMath($sJavaScript) While StringRegExp($sJavaScript, "(([0-9]*?[+-*/]?[0-9]*[+-*/][0-9]*))") $aMatches = StringRegExp($sJavaScript, "(([0-9]*?[+-*/]?[0-9]*[+-*/][0-9]*))", 3) For $i = 0 To UBound($aMatches) - 1 $Result = Execute($aMatches[$i]) $sJavaScript = StringReplace($sJavaScript, "(" & $aMatches[$i] & ")", $Result) Next WEnd Return $sJavaScript EndFunc Func _JSParse_SimpleEvals($sJavaScript) While StringRegExp($sJavaScript, "eval(([0-9]*))") $aMatches = StringRegExp($sJavaScript, "eval(([0-9]*))", 3) For $i = 0 To UBound($aMatches) - 1 $sJavaScript = StringReplace($sJavaScript, "eval(" & $aMatches[$i] & ")", $aMatches[$i]) Next WEnd $sJavaScript = StringRegExpReplace($sJavaScript, "(([0-9]{1,11}))", "$1") Return $sJavaScript EndFunc Func _JSParse_SimpleFunctions($sJavaScript) $sJavaScript = StringRegExpReplace($sJavaScript, "(function() {return ([0-9]*)})()", "$1") Return $sJavaScript EndFunc
Nun muss ich die Funktion nur noch mit den obigen Werten aus meiner RegExp aufrufen, die JavaScript Variable „fulllink“ anpassen und aufrufen:
$url = StringReplace($aFind[1], "'+zipdata+'", _JSParse_Parse($aFind[0])) INetGet($url, "Alarm.mp3")
Das war’s auch schon. Alle Source-Codes sind in AutoIT. Natürlich ist _JSParse kein funktionierender JavaScript Parser, sondern einfach nur eine Funktionssammlung die eben diesen Zippyshare-JavaScript-Haufen evaluieren kann 😉
Der obige Source-Code darf natürlich verwendet, verändert und verteilt werden, ich bitte legendlich um einen kleinen Hinweis auf den Ursprung (http://www.agrafix.net).
in_array() für Javascript
Da in_array() eine nützliche Funktion in PHP ist, habe ich sie für JavaScript umgeschrieben:
Array.prototype.in_array = function(search) { for(var i=0; i < this.length; i++) { if (this[ i] === search) { return true; } } return false; }
Die Funktion wird wie folgt angewendet:
var arr = new Array("rock", "and", "roll"); alert(arr.in_array("rock")); // -> true alert(arr.in_array("pop")); // -> false alert(arr.in_array("nd")); // -> false
Viel Vergnügen damit 😉