Zippyshare Downloads automatisieren [reloaded]

Heute geht es wieder um Zippyshare-Downloads, bzw. wie man diese einfach automatisieren kann. Da seit meinem letzten Beitrag zu diesem Thema die Seite wieder einige Umstellungen gemacht hat, präsentiere ich hier meine neue AutoIT Lösung:

; #FUNCTION# ====================================================================================================================
; Name ..........: _ZippyLoad
; Description ...: Download a file from zippyshare.com
; Syntax ........: _ZippyLoad($sUrl, $sFilename)
; Parameters ....: $sUrl                - Downloadpage, eg. http://www01.zippyshare.com/view.jsp?locale=de&key=12345678 or http://www01.zippyshare.com/v/12345678/file.html
;                  $sFilename           - Path to where the download should be saved, eg. C:test.mp3
; Return values .: False on error, InetGet-Handle on success
; Author ........: www.agrafix.net
; Modified ......: 17.11.2011 - 15:57
; Remarks .......: None
; Related .......: _ZippyIsComplete
; Link ..........: http://blog.agrafix.net/tag/zippyshare/
; Example .......: No
; License .......: CC BY-NC 3.0
; ===============================================================================================================================
Func _ZippyLoad($sUrl, $sFilename)
	; RegExp
	$sRegExp  = ''
	$sRegExp &= 's*var a = ([0-9]*)%([0-9]*);'
	$sRegExp &= 's*var b = ([0-9]*)%([0-9]*);'
	$sRegExp &= 's*document.getElementById(.dlbutton.).href = "([^"]*)"+(([ab*+-/0-9]*))+"([^"]*)";'
	$sRegExp &= 's*'

	; Extract Host
	$aHostMatches = StringRegExp($sURL, 'http://([^/]*)', 1)
	$sHost = $aHostMatches[0]

	If @error = 1 Or @error = 2 Then
		SetError(1)
		Return False ; Invalid Host
	EndIf

	; Get Downloading Page
	$sSource = _INetGetSource($sURL)

	; Extract Params for Download-URL
	$aMatches = StringRegExp($sSource, $sRegExp, 1)

	If @error = 1 Or @error = 2 Then
		SetError(2)
		Return False ; Downloading failed
	EndIf

	$iVarA = Mod($aMatches[0], $aMatches[1])
	$iVarB = Mod($aMatches[2], $aMatches[3])

	$sMathExpr = StringReplace(StringReplace($aMatches[5], "a", $iVarA), "b", $iVarB)

	$iResult = Execute($sMathExpr)

	$sBaseUrl = $aMatches[4] & $iResult & $aMatches[6]

	$sFullPath = "http://" & $sHost & $sBaseUrl

	; Download File
	$hHandle = InetGet($sFullPath, $sFilename, 1, 1)
	ConsoleWrite("Downloading " & $sFullPath & " to " & $sFilename & @CRLF)

	Return $hHandle
EndFunc

; #FUNCTION# ====================================================================================================================
; Name ..........: _ZippyIsComplete
; Description ...: Check if a download launched with _ZippyLoad is complete
; Syntax ........: _ZippyIsComplete($hHandle)
; Parameters ....: $hHandle             - the handle returned from _ZippyLoad
; Return values .: True if download is complete, False if not
; Author ........: www.agrafix.net
; Modified ......: 17.11.2011 - 15:57
; Remarks .......: None
; Related .......: _ZippyLoad
; Link ..........: http://blog.agrafix.net/tag/zippyshare/
; Example .......: No
; License .......: CC BY-NC 3.0
; ===============================================================================================================================
Func _ZippyIsComplete($hHandle)
	Return InetGetInfo($hHandle, 2)
EndFunc

Die Verwendung dieser Funktionen ist denkbar einfach:

#include 

$h = _ZippyLoad("http://www01.zippyshare.com/view.jsp?locale=de&key=12345678", @ScriptDir & "test.mp3")
While Not _ZippyIsComplete($h)
	Sleep(250)
WEnd
ConsoleWrite("Download complete..." &@CRLF)

Der Code steht zur freien Verwendung unter der CC BY-NC 3.0 Lizenz.

 

Zippyshare Downloads Automatisieren *update*

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.

 

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

 

Eigene XOR Funktion

Liebe Leser,

ein kleines Code-Snippet für alle, die die XOR-Funktion verstehen wollen 😉

#cs
Coding by www.agrafix.net

---------------------
The functions
---------------------
#ce
; Nand Function
Func nand($a, $b)
	Return BitNOT(BitAnd($a, $b))
EndFunc

; XOR Function
Func xor($a, $b)
	Return  nand(nand($a, nand($a, $b)), nand($b, nand($a,$b)))
EndFunc

#cs
---------------------
Proof of Concept: my xor function returns the same stuff as the Built-in XOR function
---------------------
#ce
If xor(0xAB, 0xBC) == BitXor(0xAB, 0xBC) Then ; horray, it works!
	ConsoleWrite("Congratz Bro, you coded a XOR function :D" & @CRLF)
Else ; this will never happen
	ConsoleWrite("Sorry, but you suck!" & @CRLF)
EndIf

Viel Vergnügen damit,
Agrafix