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