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

 

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.

 

Zukunft des Spiels

In der aktuellen Making Games, eine Zeitschrift für Spielemacher, geht es um die Zukunft des Spiels, es werden Fachkundige wie einer der drei Crytek (Far Cry, Crysis) Gründer Cevat Yerli oder der Ubisoft Deutschland (ANNO, Siedler) Geschäftsführer Ralf Wirsing interviewt. Bei den Interviews stellen die Hohen der deutschen Spieleindustrie mehr oder weniger Prognosen für das Jahr 2015. Cevat Yerli ist zum Beispiel die Meinung, dass Spiele zwar technisch gesehen einen enormen Wachstum hinlegen und Filme wie Avatar und Spiele nicht mehr zu unterscheiden sind, dafür aber auch die Spielzeit drastisch sinken werden. Statt sechs Stunden sollen es nur noch zwei sein. Der Grund dafür ist einfach: Ein Spiel, das zwei Stunden braucht statt sechs, benötigt auch viel weniger Entwicklungszeit und viel weniger Budget. Somit kommen Fortsetzungen viel schneller, das erreicht mehr Kunden. Das Spiel kann für 20 € verkauft werden und mehr Leute können es sich leisten. Außerdem sieht Cevat die Zukunft eher in Onlineverkäufen als im Spieleregal. Spieler wollen keine Disks mehr in den Händen halten, ihnen reicht es ein Spiel auf Steam zu kaufen und es herunterzuladen. Cevat muss es wissen, seine Spiele sind seit Gründung im Jahr 1999 immer erfolgreich gesehen, Crysis gilt noch heute als eines der technisch besten Spiele und Crysis 2 wird das erste Spiel mit 3D Effekten sein, vorausgesetzt man hat den richtigen Fernseher. Auch sieht er das iPad als sehr interessant und könnte sich Strategiespiele gut darauf vorstellen. Ein sehr interessanter Gedanke, den ich befürworte. Cevat hält es außerdem für wahrscheinlich, dass 2012 bzw 2013 die neue Konsolengeneration auf den Markt treten wird.

Es wurde in einem anderen Interview auch über Spielestreaming geredet. Bei dem Spielestreaming besitzt der Spieler das Spiel nicht, er bezahlt für die Spielzeit. Er muss das Spiel nicht zuhause installieren, sondern es läuft auf speziellen Servern und wird über das Internet zum Spieler gebracht. Es ist also mit Spielestreaming möglich, Crysis 2 auf einem kleinen Netbook in hochauflösender Grafik zu spielen – ein sehr interessanter Gedanke. Allerdings nichts für mich. Ich halte mein Spiel gerne in den Händen. Ich kaufe mir das Spiel generell nicht online über Steam oder sonstwas, sondern ich besorge mir sie immer noch klassisch aus dem Laderegal oder einem Shop. Da ich gerne eine Disk habe, die mir das Gefühl gibt, wirklich etwas gekauft zu haben. Und wahrscheinlich sehen das viele andere auch so. Außerdem muss ich dafür ständig mit dem Netz verbunden sein, so wie bei Ubisofts „tollem“ Kopierschutz.

Was erhofft ihr euch für das Jahr 2015 in Sachen Gaming?

Ich wünsche allen viel Spaß auf der Gamecom 😉

 

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! 🙂

 

Google beendet Wave

Vor einigen Tagen hat Google verlauten lassen dass das von Google gloreich umworbene Projekt Google Wave beendet wird. Dies liegt an der geringen Nutzerzahl die deutlich unter dem liegt was Google sich erhofft hatte.

 

Google Street View – Viel Theater um nichts?

Google Street View, nur wieder eine große Verücktmache der Medien?

 

How-To: Automatisches MySQL Dump FTP-Backup

Hallo,
da bei vielen Anwendungen nicht nur Dateien sondern auch Datenbanken wichtig sind, ist es auch enorm wichtig diese mitzusichern. Eine einfache Möglichkeit um MySQL Datenbanken in der Shell zu sichern ist es, einen MySQL Dump anzulegen. Das geht schnell und einfach – mit diesem Tool kann man einzelne Datenbanken und ganze Server sichern und wiederherstellen.
Das per Hand zu machen wäre eine Heidenarbeit, ein Cronjob ist deshalb eine enorme Entlastung.
Gerne hat man aber mehrere Datenbanksicherungen zur Verfügung, falls ein Fehler in dem Dump vorliegt und dieser irreperabel ist. Es ist also intelligent mehrere Dumps hochzuladen und sie nach dem aktuellen Datum + evtl. dem DB-Namen. Für das Datum gibt es in der Shell ‚date‘. Mit date kann das Datum in verschiedenen Formaten ausgegeben und bspw. in einer Variable abgespeichert werden. Um das dann schließlich auf einen FTP-Server hochzuladen, benötigen wir zum Autoeinloggen einen Eintrag in der ~/.netrc. Dann können wir einfach mit wput den Dump hochladen. Auf meinem Ubuntu System ist wput standardmäßig nicht installiert, wir können es aber ganz einfach mit ’sudo apt-get install wput‘ nachinstallieren.

Um uns das ganze zu vereinfachen und nicht jedes Mal die ganzen Befehle einzugeben, erstellen wir ein einfaches Shell-Script.
Da wir per wput im Script hochladen und während des Vorgangs nichts eingeben können, immerhin ist es automatisiert, benötigen wir die erwähnte ~/.netrc. In ihre konfigurieren wir die Login Dateien.
~ steht immer für das Homeverzeichnis des angemeldeten Users. In meinem Fall ist das /home/dominic/. Heißt also die File ist in Wirklichkeit /home/dominic/.netrc
Im Normalfall ist diese leer. Hier schreiben wir den Host-, Loginnamen und das Passwort rein:

machine: ftp.domain.com
login: LOGIN
password: PASSWORD

Die richtigen Rechte sind 600. Die setzen wir mit “ chmod 600 ~/.netrc“.
Danach ist es uns möglich, ohne Password oder Login auf dem FTP Server, hier ftp.domain.com, einzuloggen.

Da wäre nur noch das eigentliche Script. Hier ist es einfach mal schnell runtergeschrieben, die Erklärung erübrigt sich dank der Kommentare.
Vorweg: Bei mysqldump ist es enorm wichtig, dass Passwort direkt und ohne Leerzeichen hinter -p zu schreiben, sonst kommt ein Syntax Error.

#!/bin/sh
#MySQL-Dump Backupscript

#Schreiben des aktuellen Datums im Format DD.MM.YYYY in eine Variable
today=$(date +%d.%m.%Y)

#Erstellen eines MySQL Dump einer einzelnen Datenbank
mysqldump –database DBNAME -u USER -pPASSWORD

#Falls nicht vorhanden wird wput installiert
apt-get install wput

#Hochladen des Dumps
wput $today ftp://ftp.domain.com

Zum Schluß kommt noch der Cronjob.
Dazu editieren wir die Crontabelle mit „crontab -e“

55 23 * * * sh /PFAD/ZUM/SCRIPT.sh

Wenn ihr alles richtig gemacht habt, dann startet jeden Tag um 23:55 Uhr ein Cronjob, der einen MySQL-Dump der von euch ausgewählten Datenbank macht.

Fehler oder Anmerkungen bitte in die Kommentare schreiben!

Nachtrag:

Wenn ihr euren Dump nicht nur nach dem aktuellen Datum benennen wollt, sondern z.B. auch nach der Datenbank, so könnt ihr den Namen einfach an „date +%d.%m.%Y“ hängen. Beispiel: „date +%d.%m.%Y-bthost.sql“ gibt 12.08.2010-bthost.sql aus. Außerdem könnt ihr die Darstellung des Datums auch variieren, schaut dazu am besten in die Man-Page von date.