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

 

jQuery in Greasemonkey

Wer kennt das nicht? Man möchte ein Greasemonkey-Script schreiben und würde dabei gerne auf jQuery zurückgreifen. Außerdem verwendet die betreffende Seite bereits jQuery, das heißt man müsste dieses Script eigentlich gar nicht mehr nachladen. Doch wie kann man auf die bereits vorhandene jQuery-Instanz zugreifen? Ganz einfach:

var $ = unsafeWindow.jQuery;

Das steht zu beginn des Scripts und nun kann man wie immer per $ auf alle jQuery Funktionen und Elemente der Seite zugreifen.

In diesem Zuge möchte ich gleich noch zwei neue UserScripts für das Browserspiel Die-Stämme vorstellen, die ich heute veröffentlicht habe und welche ebenfalls auf die genannte Technik zurückgreifen:

[DS] Save Attack

Ermöglicht es im Versammlungsplatz die gewählen Einheiten zu speichern um bei einem weiteren Angriff mit gleichen Truppen anzugreifen

Download & Install

[DS] Menu Resort

Dieses Script sortiert die ingame Die-Stämme Menüleiste so um wie sie früher war (vor Version 7.x)

Download & Install

 

Visitor-Stats.de Update

Heute habe ich endlich mal wieder ein Update für visitor-stats.de fertiggestellt. Große optische Änderungen sind wohl nicht zu erkennen, dennoch wurde hinter den Kulissen einiges verändert. Die JavaScripts basieren jetzt auf jquery und die AJAX-API gibt json-formatierte Antworten. Außerdem habe ich einen „loadscreen“ eingebaut, der bei gesendeten AJAX-Requests erscheint.

Das Projekt ist unter http://www.visitor-stats.de zu finden.

Für die Realisierung der AJAX-API mit json Antworten habe ich json_encode() benutzt.

 

Hello World in Android

Seit kurzem befasse ich mich mit der Programmierung von „Apps“ für Android-Handys. Hier möchte ich nun meine „ersten Schritte“ festhalten:

Zuerst habe ich das Android-SDK von der offiziellen Google-Seite (http://developer.android.com/sdk/index.html) runtergeladen. Dann ist noch Eclipse (http://www.eclipse.org/downloads/) und ein JavaJDK (http://www.oracle.com/technetwork/java/javase/downloads/index.html) nötig. Nachdem alles herunter geladen ist, muss erst das JavaJDK und dann das Android-SDK installiert werden. Jetzt kann Eclipse gestartet werden.

In Eclipse erstellt ihr dann unter New > Project > Android > Android Project ein neues Adroid Projekt. Beim ersten ausführen wird sich Eclipse mit einer Fehlermeldung melden, dass R.java nicht vorhanden sei. Einfach Eclipse neu starten und dies sollte behoben sein. Bei dem nächsten Start-Versuch, wird Eclipse melden, dass keine AVD (Virtuelles Android-Gerät) vorhanden ist, allerdings kann man dann direkt eins anlegen. Nun startet in der AVD stundenlang Android und dann eure Anwendung die in etwa „Hello World, Hello World“ ausgibt.

Das war’s für’s erste, weitere Informationen findet ihr natürlich auf der offiziellen Android SDK Seite, sowie weitere Code-Snippets und Startup-Codes.

 

agLinker

Heute ist endlich mein erstes WordPress-Plugin, der agLinker online gegangen. Zu finden ist es unter: http://wordpress.org/extend/plugins/aglinker/

Was macht agLinker?
Im Admin-Pannel des Blogs können Wörter definiert werden, die dann in Beiträgen und Seiten automatisch mit vorgegebenen Links verlinkt werden.

Beispiel:
Der agLinker ist bereits auf diesem Blog aktiv. Einfach mal umschauen!
Meine Text:

Welcome to a blog about bing

Plugin-Settings:

blog|Wordpress software|http://wordpress.org
bing|Search engine|http://bing.com

Resultat:

Welcome to a blog about bing

Installationsanleitungen & Download
http://wordpress.org/extend/plugins/aglinker/installation/
Alternativ auch über die eingebaute Plugins Funktion im Admin-Pannel. Einfach nach agLinker suchen.

Viel Vergnügen damit! 🙂

 

DSLan v1.4

Liebe Leser,

gerade eben haben wir die DSLan v1.4 veröffentlicht. Die DSLan ermöglicht es einen Local-Area-Netzwerk Server mit maximal 10 Spielern des Spiels Die-Stämme zu erstellen.

Download und weitere Info’s: http://dslan.gfx-dose.de

Liebe Grüße,
Agrafix

 

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

 

Agrafix.net in neuem Design

Lange hat sich www.agrafix.net in gleichem Design präsentiert, deshalb war jetzt Zeit für etwas neues. Im Grunde habe ich ein neues Design für die Seite erstellt, die Referenz-Icons vereinheitlicht und auf der Startseite werden nun die letzten 3 Blogbeiträge angezeigt. Wie gefällt euch das neue Design?

Besuche www.agrafix.net

Wärend der „Umstellung“ bin ich natürlich auf ein paar interessante Dinge gestroßen:

1) Die SQL, die es ermöglicht die letzten Blogbeiträge aus einem WordPress auszulesen:

SELECT post_title, post_content, guid, post_author FROM [PREFIX]_posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC LIMIT 3

2) Außerdem noch ein Tipp für alle xHTML+CSS-Designer: Um ein komplettes DIV zu verlinken habe ich folgenden Code genutzt:

CSS:

div.nelement {
	float:left;
	margin-left:10px;
}

div.nelement a {
	display:block;
	width:100%;
	height:100%;
}

div.nelement a:hover {
	text-decoration:none;	
}

xHTML:

Das war’s auch schon 😉

 

Facebook: Like

Seit kurzem ist es dank neuen Facebook-Schnittstellen möglich auch Webseiten, Beiträge und Ähnliches zu „Liken“ („Gefällt mir“). Auch als Blogger sollte man von diesem profitieren, da man dadurch anderen die Möglichkeit gibt für eure Beiträge Werbung zumachen, denn wenn ein Leser bei eurem Beitrag auf „gefällt mir“/“like“ klickt, wird auf seinem Profil angezeigt „Mister XYZ gefällt ‚Facebook: Like'“.

Für die „faule“ WordPress Gemeinde gibt’s da ein wunderbares Plugin, welches sich Facebook Like nennt. Dieses muss man sich einfach Installieren und dann konfigurieren. Viel Spaß damit!

 

Crawler – eine „Gefahr“?

Letztes Jahr im Herbst ging „SchülerVZ“ durch die Presse – persönliche private (?) Daten wurden von Crawlern „geklaut“. Und jetzt ist es wieder passiert (siehe hier), wieder sind Millionen von Daten geklaut worden. Das ganze ging eigentlich relativ problemlos – ein Crawler bewappnet mit der entsprechenden RegEx krabbelte durch die Seiten von 1,6 Millionen Nutzern. Gehindert werden sollte der Crawler von einer „Klicksperre“, die ein maximum von Klicks pro Zeiteinheit erlaubt. Doch dies umging der Crawler ganz ohne Probleme – der Programmierer legte einfach 800 SchülerVZ-Accounts an, die parallel benutzt werden konnten. SchülerVZ hatte zuvor die Captchas wieder ausgebaut und hatte somit mehr oder weniger alle Tore zu ihren Daten offen – abgesehen von den Daten jener, die sie nur für den Freundeskreis einsehbar gemacht hatten.

Nun kann man sich Fragen ob Crawler eine Gefahr für die eigene Privatsphäre sind oder einfach nur harmlos Daten sammeln. Denn Crawler durchforsten nicht nur „normale“ Seiten, sondern das ganze Internet und dessen Soziale Netzwerke. Die Daten werden dann abgespeichert und auf irgendwelchen Archiv-Servern gespeichert. Google zum Beispiel nimmt riesige Mengen an Daten in seinen Cache auf – das heißt selbst wenn diese vom ursprünglichen Server gelöscht wurden kann man sie noch einsehen. Andere Crawler erstellen jeden Monat einen „Schnappschuss“ von einer Webseite und archivieren ihn dann. Daten die einmal im Internet sind, bleiben dort wohl for eine (wenn auch) begrenzte „Ewigkeit“.

Es gibt dank verschiedensten Crawlern schon Suchmaschienen, die nach Informationen über Personen suchen. Und wenn in dessen Datenbanken jetzt noch Daten aus Sozialen Netzwerken wie etwa Bilder, Vorlieben oder Lebensweise kommen, dann kann jeder (!) im Internet alles über eine wildfremde Person erfahren. Bei einem Bewerbungsgespräch würde es dann nicht mehr „Hallo Herr Crawlerman, erzählen Sie von sich“ sondern „Hallo Herr Crawlerman, ich habe gehört sie trinken viel Alkohol, sind sehr freizügig und ihre Freundin hat sie wohl grade verlassen?“ heißen. Ist das wirklich wünschenswert?

In dieser Hinsicht denke ich sind Crawler eine Gefahr für die Privatsphäre des Einzelnden, allerdings sehr nützlich um andere Daten zu erfassen und zu durchsuchen. Man müsste eine Lösung finden, Crawler effektiv aus der „Cyber-Privatsphäre“ herauszuhalten, und man muss die Betreiber von sozialen Netzwerken dazu zwingen schärfere Maßnahmen in Hinsicht auf Privatsphäre zu ergreifen.