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).