Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 12:31

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[AutoIt]Tutorial zu Browsergamebots (Packetbots und IEbots)

Discussion on [AutoIt]Tutorial zu Browsergamebots (Packetbots und IEbots) within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
[AutoIt]Tutorial zu Browsergamebots (Packetbots und IEbots)

Dieses Tut basiert auf der Tutorial Reihe von AMrK www. *************/coding-bereich-autoit-bot-community/tutorials/autoit/2284-video-tut-tcp-reihe/
Ihr könnt euch dieses Tutorial und viele andere auch herunterladen und somit auch offline betrachten :


Kapitel I : Vorraussetzungen
1. Was sollte ich wissen/können ?
2. Brauche ich noch etwas außer Scite/AutoIT um Browsergamebots zu machen ?
3. Wie benutze ich Live Http Headers ?


Kapitel II : Vorwort
1. Welche Arten von Browsergamebots gibt es ?
2. Welche Art sollte man wann für seine Browsergamebots benutzen ?


Kapitel III : Browsergamebots mithilfe der IE.au3 UDF
1. IE.au3 allgemein
2. Herstellen eines kleinen Browsergamebotes

Kapitel IV : Packetbots
1. Einstieg
2. Was sind Cookies und was bringen sie ?
3. Was sind Packets und was macht man damit ?
4. Welche Arten von Packets gibt es ?
5. Kommunikation zwischen Server und Spieler (=Client)
6. Grundlegendes zu TCP/UDP in AutoIT
7. Spielerreien mit TCP-Befehlen in AutoIT
8. Erstellen eines kleinen Packet Botes
9. Anfertigen eines Botes für ein Browsergame mit erhöhtem Anti-Bot-Schutz


-------------------------------------------------------------------------------------------------
Kapitel I : Vorraussetzungen
1. Was sollte ich wissen/können ?

Man sollte alles beherschen, was in diesen beiden Tutorialen vermittelt wird :




Zudem sollte man grundlegende Kentnisse in Html und Javascript besitzen.

Auserdem kann man sich Vorteile verschaffen indem man das gelesen und verstanden hat :

-------------------------------------------------------------------------------------------------
Kapitel I : Vorraussetzungen
2. Brauche ich noch etwas außer Scite/AutoIT um Browsergamebots zu machen ?

Ja einen Browser und manchmal auch einen Packetsniffer.
Ich werde in diesem Tutorial den Browser
verwenden.
Firefox ist ein kostenloser, schneller und recht nett gestalteter Browser.
Als Packetsniffer werde ich Live Http Headers verwenden.

Live Http Headers ist ein Addon für Firefox und kann hier runtergeladen werden :


Einfach auf "Zu Firefox hinzufügen" klicken und
anschließend im kleinen Fenster, das erschienen ist auf "Jetzt installieren" klicken.
Mehr benötigen wir vorerst nicht.
-------------------------------------------------------------------------------------------------
Kapitel I : Vorraussetzungen
3. Wie benutze ich Live Http Headers ?


In Firefox steht oben "Extras", dort klickt man hin und klickt danach auf Live Http Headers
Nun haben wir das Addon gestartet.
Es sollte in etwa so aussehen :
Nachdem wir das Addon gestartet haben, gehen wir zu irgendeiner Seite, beispielsweise google.de.
Wir sollten einen Text sehen :
Was dieser Text ist und zu was der gut ist werden wir später erfahren.
Vorerst reicht es uns, zu wissen, dass alles funktioniert.
-------------------------------------------------------------------------------------------------
Kapitel II : Vorwort
1. Welche Arten von Browsergamebots gibt es ?

Man kann ganz grob zwischen 3 Gruppen von Browsergamebots unterscheiden.

1. Gruppe : Pixel und Mausclickbots
Mit dieser Gruppe fängt normalerweise jeder mal an.
Jedoch sind diese Bots sehr Fehleranfällig, denn wenn die Buttons oder Bilder
vom jeweiligen Browsergame verschoben oder verändert werden, funktionieren Pixelbots nicht mehr.
Auch sind Pixelbots von der Bildschirmauflösung abhängig, was auf 1280*1280 funktioniert, muss nicht auf 800*640 funktionieren.
Hinzu kommt, dass man während diese Bots laufen nichts anderes machen kann.

2.Gruppe : Browserbots, die IE.au3 benutzen
Mit der IE.au3 kann man jedemenge machen, man kann
z.B. Klicks auf Links simulieren, zu bestimmten Seiten navigieren und sogar
Javascript im Browser ausführen lassen.
Diese Funktionen laufen unter jeder Bildschirmauflösung und sind durch
Farbänderungen oder ähnliches in der Regel nicht aus der Bahn zu werfen.
Auch kann man bei dieser Art das Browserfenster minimieren und irgendetwas anderes machen.
Man wird also nicht von einer wild herumklickenden Maus gestört,
wie es bei den Pixelbots der Fall ist.
Leider muss der Pc auf dem das Skript laufen soll Internet Explorer installiert haben.
Auch Schade ist, dass man bei vielen Spielen nicht alles mit der IE.au3 machen kann, besonders
bei Flashgames.

3. Packetbots
Packetbots sind Bots, die eine direkte Verbindung mit dem Server herstellen
und die Daten direkt an den Server senden und nicht erst über einen Browser.
Diese Bots laufen im Hintergrund und sogar auf Computern, die keinen Browser installiert haben.
Hinzu kommt, dass sie normalerweise schneller sind als IE-Bots und Pixelbots.

In diesen 2 Bildern wird klar woher der "Geschwindigkeits-Schub" kommt :
-------------------------------------------------------------------------------------------------
Kapitel II : Vorwort
2. Welche Art sollte man wann für seine Browsergamebots benutzen ?

Ich tendiere dazu möglichst viel mit Packetbots zu machen,
da es einfach viel schneller geht und man die Anti-Botschutzmaßnahmen so leichter
umgehen kann. Auserdem kann man Packetbots für jedes Browsergame machen,
von Seafight über Wurzelimperium bishin zu Ogame.
Pixelbots mache ich nur noch in Außnahmefällen.
Mit IE-Befehlen arbeite ich auch nur noch selten, weil
es meiner Meinung nach einfach viel schneller geht Packetbots zu machen als
IE-Bots, auserdem werden IE-Bots leichter erkannt.
ich muss jedoch anmerken, dass die meisten Spiele keinen Bot-Schutz besitzen.

Ich persönliche finde Packetbots am besten.
Jeder muss für sich selbst entscheiden welche Botart für ihn am besten geeignet ist.

In dem Tutorial werden wir die IE-Bots und die Packetbots kennen lernen.
Ich verzichte auf Pixelbots, da jeder einen halbwegs guten Pixelbot ohne große Schwierigkeiten hinbekommen sollte.
-------------------------------------------------------------------------------------------------
Kapitel III : Browsergamebots mithilfe der IE.au3 UDF
1. IE.au3 allgemein

Da die grundlegensten Befehle von meinem anderem Tutorial ja bereits bekannt sein sollten,
werde ich hier nur kurz ein paar weitere Befehle erläutern,die man öffters braucht.

PHP Code:
#include <IE.au3>
$oIE _IE_Example ("basic")
_IELinkClickByText ($oIE"user forum"
_IELinkClickByText($oIE, "user forum") , klickt einen Link, der den Text "user forum" hat.

PHP Code:
#include <IE.au3>
$oIE _IECreate ("www.google.de")
$sHTML _IEDocReadHTML ($oIE)
FileWrite("Html.txt",$sHTML)
_IEQuit ($oIE
Zuerst wird mithilfe von _IECreate ("www.google.de") ein Internetexplorer "erstellt" und auf die Seite navigiert.
Anschliesend bekommt man den Quelltext mithilfe von _IEDocReadHTML ($oIE) und dieser wird dann zu guter letzt in eine Datei namens Html.txt geschrieben.
_IEQuit ($oIE) schließt unseren Internet Explorer wieder.
-------------------------------------------------------------------------------------------------
Kapitel III : Browsergamebots mithilfe der IE.au3 UDF
2. Herstellen eines kleinen Browsergamebotes

Wir werden jetzt ein kleinen Browsergamebot mithilfe der IE.au3 erstellen.
Aber bevor wir anfangen können, brauchen wir ein Browsergame.
Ich nehme Ogame für unsere bösen Zwecke.

Zu allererst müssen wir dem Benutzer
die Eingabe von Passwort, Benutzername
und Server auf dem gespielt wird, gestatten.

Das machen wir einfach mit Inputboxen :

PHP Code:
$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server zu spielst"
Als nächstes müssen wir einen Internetexplorer erstellen lassen
und auf die Seite navigieren lassen.

PHP Code:
#include<IE.au3>

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$oIE=_IECreate("www.ogame.de"
Der nächste Schritt liegt darin herauszufinden wie wir uns anmelden können.

Ein kurzer Blick in den Quellcode zeigt uns normalerweise alles was wir brauchen.
Also gehen wir auf die Ogame-Seite und machen einen Rechtsklick und anschliesend wird
auf "Seitenquelltext anzeigen" gedrückt.

Nun sehen wir schon (wenn auch nicht auf den ersten Blick), was wir brauchen, nämlich das :
PHP Code:
<input type="text" name="login" id="inputform" alt="Spielername" value="" maxlength="20" tabindex="2".......... 
Hier sieht man, dass die Inputbox auf der Ogameseite den "Namen" login hat.
Wenn wir schon an der richtigen Stelle sind, schauen wir auch gleich welchen Namen die Passwort-Inputbox hat.
PHP Code:
<input type="password" name="pass" id="passwort" alt="Passwort" maxlength="32" tabindex="3".............. 
Jetzt haben wir Passwort und Benutzernamen, aber uns fehlt noch der Name der Server Combobox.
Den finden wir aber auch im Quelltext :
PHP Code:
<select name="uni_url" id="uni_select_box" class="input_universe_select" tabindex="1"................... 
Nun haben wir alles was wir brauchen und können anfangen das in unseren Browsergamebot zu übernehmen.
Zuerst brauchen wir eine Objektsammlung, also fügen wir das :
PHP Code:
$oForm _IEFormGetCollection($oIE,0
zum Skript hinzu danach nehmen wir uns die 2 Inputboxen vor.
Da beide in der Sammlung der Objekten
von $oForm enthalten sein müssen,
müssen wir diese Sammlung auch als 1. Wert übergeben.
Unsere 2 Inputboxen hiesen login und pass.
Natürlich sollen diese Inputboxen den Wert von unserem Benutzernamen bzw. Passwort erhalten.

Nachdem wir uns das alles nochmal in Erinnerung gerufen haben, kann es weitergehen.
Wir fügen also anschliesend das zu unserem Skript hinzu :
PHP Code:
    $oUsername _IEFormElementGetObjByname($oForm,"login")
    
$oPassword _IEFormElementGetObjByName($oForm,"pass")
    
_IEFormElementSetValue ($oUsername,$name)
    
_IEFormElementSetValue ($oPassword,$passwort
Wenn wir als nächstes auch noch den Server hinzufügen ist unser Skript fast fertig.
Der Name der Server-Combobox ist ja uni_url, also brauchen wir auf jedenfall wieder den Befehl
_IEFormElementGetObjByname(...).
PHP Code:
$oServer _IEFormElementGetObjByname($oForm,"uni_url"
So als nächstes müssen wir aber ein Server von der Combobox auswählen.
Das machen wir mit dem Befehl :
PHP Code:
_IEFormElementOptionSelect ByRef $o_object$s_string [, $f_select [, $s_mode "byValue"]]) 
Der erste Wert ist unser Internet Explorer Objekt also $oIE.
Den 2. Wert müssen wir vorerst leer lassen.

Der 3. Wert legt fest ob wir das Objakt auswählen wollen oder abwählen, wir wollen es natürlich auswählen, also müssen wir dort eine 1 setzen.

Der 4. Wert ist die Art nach was gesucht werden soll.
Dies ändern wir zu "byIndex" also werden die Objekte in der Combobox duchnummeriert
von 0 bis Serveranzahl, wir müssen dann nur die Nummer schreiben und schon haben wir den entsprechenden Server ausgewählt.

Jetzt wo wir Wert 4 festgelegt haben können wir auch Wert 2 festlegen, da wir per Index suchen,
ist Wert 2 unser Index, also wenn wir für den Wert 2 eine 3 Schreiben so wird der 4. Server ausgewählt.

Wir wollen aber, dass der Benutzer eine Zahl eingibt und wir geben dem Benutzer dann den Server,
also sollten wir von $server, 1 abziehen, da die Server ja von 0 anfangend durchnummeriert sind.
Unser Skript sollte in etwa so ausschauen :

PHP Code:
#include<IE.au3>

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$oIE=_IECreate("www.ogame.de")

$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex"
Da Uni1 aber erst bei Index 6 anfängt, müssen wir 6 drauf addieren, damit auch wirklich Uni1 gewählt wird.

PHP Code:
#include<IE.au3>

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex"
Soweit so gut, nun müssen wir das nur noch abschicken.
Wir sollten einfach mal schauen ob wir den Namen vom
LogIn-Button herausfinden können.

PHP Code:
<input type="submit" name="submitInput" id="login_button" 
Der Name ist also : submitInput
Aber wir brauchen nicht umbedingt den Namen, da der Button vom Typ "submit" ist,
können wir einfach eine IE-Funktion nehmen, nämlich : _IEFormSubmit(...)
Also schaut unser Skript nach dem wir das hinzugefügt haben so aus :

PHP Code:
#include<IE.au3>

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword,$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex")

_IEFormSubmit($oForm
Es hat also alles geklappt, wir sind eingeloggt !
Das ist doch schonmal wunderbar, nun machen wir weiter und lassen eine
Metalmine bauen.

Dazu müssen wir aber zu Gebäudeseite kommen, das machen wir einfach indem wir
folgendes zum Skript hinzufügen :
PHP Code:
_IELinkClickByText $oIE"Gebäude"
So anschliesend wollen wir unsere Metalmine ausbauen.

Wie wir sehen, können wir den Befehl _IELinkClickByText(...) nicht nehmen, denn wir haben öffters den Text "bauen".
Wir könnten den Befehl _IELinkClickByIndex(...) nehmen, aber dieser eignet sich auch nur bedingt,
denn mit diesem Befehl werden alle Links von 0 bis Anzahl der Links durchnummeriert, wenn wir jetzt aber mehr Gebäude bauen können, verschiebt sich das ganze viellleicht,
das ist also viel zu riskant, wir wollen ja,
dass er das immer bauen kann und nicht nur wenn man genau 7 Gebäude zu verfügung hat.

Also können wir die einfachsten Methoden schon mal vergessen, schauen wir mal im Quelltext ob es irgendetwas interessantes gibt .
Aber was ist da los ?
Wir können uns den Quelltext garnicht mehr anzeigen lassen (zumindest im Fire Fox), aber es gibt eine andere Möglichkeit den Quelltext zu sehen.

Man geht einfach oben links auf Ansicht und dann auf "Seitenquelltext anzeigen".
Aber auch im Quelltext gibt es nichts was uns helfen könnte...
Was machen wir als nächstes ?

Es gibt eine Sache, die wir bisher noch nicht benutzt haben, die wir aber
so langsam brauchen, Live Http Headers.

Wir starten also Live HTTP Headers und setzen das Häckchen bei "mitschneiden"

So dann klicken wir auf löschen, damit Live HTTP Headers leer ist und schauen einfach was passiert wenn wir auf "bauen" drücken, um die Metalmine zu bauen.
Das Addon hat mitgeschnitten, was alles passiert wenn wir auf bauen drücken.
Das was als erstes passiert ist immer das wichtigste, der horizontale Strich (also ------------------) trennt immer verschiedene "Aktionen" von einander.
Wobei die erste Aktion das ist was ganz oben steht.
Uns interessiert vorerst nur das, was in der allerersten Zeile steht, nämlich :
Code:
http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034&modus=add&techid=1&planet=1320734
Das ist das was passiert wenn wir auf bauen drücken, wie wir sehen können ist das eine Internetadresse, aber was passiert wenn wir unseren Internet Explorer dort hin navigieren.
Wir sollten es ausprobieren, aber zuerst warten wir bis die Metalmine fertig ist,
vielleicht hat dieser komisch Link etwas mit der Metalmine zu tun.

Wenn wir den Link einfügen und dann dort hinnavigieren, wird die Metalmine ausgebaut, das ist schonmal gut zu wissen, denn es gibt ja auch einen Befehl
um zu irgendwelchen Seiten zu navigieren : _IENavigate(...)
Der nächste Schritt, ist es das in unser Skript mit einzubinden, also fügen wir die Seite in den Befehl einfach mal ein und schauen was passiert.

PHP Code:
#include<IE.au3>

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword,$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex")

_IEFormSubmit($oForm)
_IeLoadWait($oIE)
_IELinkClickByText $oIE"Gebäude")
_IeLoadWait($oIE)
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034&modus=add&techid=1&planet=1320734"
Was uns als erste auffällt ist, dass der Bot nicht einmal zur Gebäudeseite navigiert...
Also müssen wir hier wohl auch mit Live HTTP Headers arbeiten, wäre auch zu schön gewesen.
Wir starten also wieder HTTP Headers und drücken dann auf Gebäude.
Wir sehen wieder einen komischen Link, der in etwa so ausschaut.
Code:
http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034
Also fügen wir den auch zu unserem Skript hinzu und schauen was passiert.

Skript :
PHP Code:
#include<IE.au3>

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword,$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex")

_IEFormSubmit($oForm)
_IeLoadWait($oIE)
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034")
_IeLoadWait($oIE)
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034&modus=add&techid=1&planet=1320734"
Wie wir sehen können, tut sich wieder nichts...
Das ist nicht gut, aber wir sind der Rätselslösung sehr nahe.
Wir sollten uns mal die Links genauer anschauen.

Code:
http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034
Wir analysieren den Link mal Stück für Stück.


http://uni16.ogame.de/game/index.php?page=b_building&session=63258ec6d034

Der Anfang (braun) ist bei jeder normalen Internetseite so.
Das Grüne teilt uns mit, dass wird auf uni16 auf dem Ogame-Server spielen.
Das Rote schaut etwas komisch aus, aber anscheinend ist es einfach ein Teil
des Links.
Also müsste alles stimmen, wir loggen uns also noch einmal ein und schauen ob sich etwas verändert oder
ob wir falsch abgeschrieben/kopiert haben.
Wir starten wieder Live HTTP Headers und schauen uns den Link an.
Das ist komisch, der stimmt ja garnicht mit unseren Link über ein...
Anscheinend ändert sich das Ende des Linkes.

Das ist eine recht wichtige Erkentniss, denn erst jetzt wissen wir nach was wir suchen müssen.
Wir müssen nur noch heraufinden wo und wie wir suchen müssen.
Die erste Haltestation ist immer der Quelltext,also loggen wir uns erneut ein.
So nachdem LogIn suchen wir nach genau dem Ende, das sich immer verändert.
Dazu gehen wir im Quelltext Fenster oben auf Bearbeiten und dann auf Suchen.
Unten taucht dann so eine kleine Leiste auf
und suchen nach genau unseren Text.

Da wir haben ihn gefunden.
Ich habe ihn das erstemal hier gefunden :

PHP Code:
  <link rel='stylesheet' type='text/css' href='css/formate.css' />

  <
script language="JavaScript">var session="edf533afad4f";</script> 
Der Teil den wir suchen steht also zwischen var session=" und ";</script>.
Das ist gut zu wissen, dann müssen wir das nur noch auslesen.
Wir machen das am besten mit
_StringBetween($text,$StartText,$EndText).
Wir holen uns den Quelltext mithilfe von $HTML = _IEDocReadHTML ($oIE) und lassen das was wir suchen auslesen, Skript :
PHP Code:
#include<IE.au3>
#include<String.au3>
$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword,$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex")

_IEFormSubmit($oForm,0)
_IeLoadWait($oIE,0,8000)
$HTML _IEDocReadHTML ($oIE)
$session=_StringBetween($HTML,'var session="','";</script>')
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session="&$session[0])
_IeLoadWait($oIE,0,8000)
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session="&$session[0]&"&modus=add&techid=1&planet=1320734"
Es ist wichtig, darauf zu achten, dass _Stringbetween(...) immer ein Array zurück gibt, auch wenn nur eine Textstelle gefunden wurde.
Um _Stringbetween benutzen zu können brauchen wir #include<String.au3>

Endlich geschafft, aber wir wollen noch eine Kleinigkeit hinzufügen, nämlich, dass immer
Metalmine und Kristallmiene abwechselnd gebaut werden und zwar erst wenn das Gebäude fertig ist.
Das machen wir mithilfe von Javascript.
Wir werfen wieder einen Blick in den Quelltext und finden eine Javascriptvariable, die die verbleibende Zeit in Sekunden angibt, nämlich aa.

Code,den wir hinzufügen :
PHP Code:
$zeit=$oIE.document.parentWindow.eval('javascript:ss')
Sleep($zeit*1000+2000
Sleep($zeit*1000+2000), deswegen, weil $zeit in Sekunden ist, deswegen müssen wir mal 1000 machen.
Diese 2 Sekunden extra Wartezeit, habe ich hinzugefügt, damit wir ganz sicher sein können,
dass das Gebäude dann fertig ist.
Nun haben wir alles was wir brauchen und müssen zu guter letzt nur noch den komischen Link von der Kristallmiene herausfinden,
also werfen wir wieder Live Http Headers an und bauen diesesmal die Kristallmiene.
Nehmen den Link und fügen ihn zum Skript hinzu.

Dann schaut unser Skript also so aus :
PHP Code:
#include<IE.au3>
#include<String.au3>
$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein")
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein")
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst")

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword,$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex")

_IEFormSubmit($oForm,0)
_IeLoadWait($oIE,1000,8000)
$HTML _IEDocReadHTML ($oIE)
$session=_StringBetween($HTML,'var session="','";</script>')
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session="&$session[0])
_IeLoadWait($oIE,0,8000)

while 
1
_IENavigate
($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session="&$session[0])
_IeLoadWait($oIE,0,5000)
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session="&$session[0]&"&modus=add&techid=1&planet=1320734")
_IeLoadWait($oIE,0,8000)
$zeit=$oIE.document.parentWindow.eval('javascript:ss')
Sleep($zeit*1000+2000)
_IENavigate($oIE,"http://uni16.ogame.de/game/index.php?page=b_building&session="&$session[0]&"&modus=add&techid=2&planet=1320734")
_IeLoadWait($oIE,0,8000)
$zeit=$oIE.document.parentWindow.eval('javascript:ss')
Sleep($zeit*1000+2000)
WEnd 
Wenn wir zusätzlich noch wollen, dass es auf jedem Server funktioniert und nicht nur auf Server 16, sollten wir es abändern.
Auserdem wollen wir das speichern,was der Benutzer eingibt und es wenn der Bot wieder gestartet wird laden :

PHP Code:
#include<IE.au3>
#include<String.au3>

$name=IniRead("Ogame.ini","Eingabe","Name","")
$passwort=IniRead("Ogame.ini","Eingabe","Passwort","")
$server=IniRead("Ogame.ini","Eingabe","Servernummer","")

$name=Inputbox("Benutzername","Bitte gib deinen Benutzernamen ein",$name)
$passwort=Inputbox("Passwort","Bitte gib dein Passwort ein",$passwort)
$server=Inputbox("Server","Bitte gib ein auf welchem Server du spielst",$server)

IniWrite("Ogame.ini","Eingabe","Name",$name)
IniWrite("Ogame.ini","Eingabe","Passwort",$passwort)
IniWrite("Ogame.ini","Eingabe","Servernummer",$server)

$server=$server+6
$oIE
=_IECreate("www.ogame.de")
$oForm _IEFormGetCollection($oIE,0)
$oUsername _IEFormElementGetObjByname($oForm,"login")
$oPassword _IEFormElementGetObjByName($oForm,"pass")
_IEFormElementSetValue ($oUsername,$name)
_IEFormElementSetValue ($oPassword,$passwort)
$oSelect _IEFormElementGetObjByName ($oForm"uni_url")
_IEFormElementOptionSelect ($oSelect,$server-1,1"byIndex")

_IEFormSubmit($oForm,0)
$server=$server-6
_IeLoadWait
($oIE,1000,8000)
$HTML _IEDocReadHTML ($oIE)
$session=_StringBetween($HTML,'var session="','";</script>')
_IENavigate($oIE,"http://uni"&$server&".ogame.de/game/index.php?page=b_building&session="&$session[0])
_IeLoadWait($oIE,0,8000)
$server=$server-6
while 1
_IENavigate
($oIE,"http://uni"&$server&".ogame.de/game/index.php?page=b_building&session="&$session[0])
_IeLoadWait($oIE,0,5000)
_IENavigate($oIE,"http://uni"&$server&".ogame.de/game/index.php?page=b_building&session="&$session[0]&"&modus=add&techid=1&planet=1320734")
_IeLoadWait($oIE,0,8000)
$zeit=$oIE.document.parentWindow.eval('javascript:ss')
Sleep($zeit*1000+2000)
_IENavigate($oIE,"http://uni"&$server&".ogame.de/game/index.php?page=b_building&session="&$session[0]&"&modus=add&techid=2&planet=1320734")
_IeLoadWait($oIE,0,8000)
$zeit=$oIE.document.parentWindow.eval('javascript:ss')
Sleep($zeit*1000+2000)
WEnd 
Damit ist unser kleiner Ogamebot fertig.
Man könnte eventuel auch noch den Planeten auslesen lassen, aber das wird in diesem Tutorial nicht mehr besprochen.
-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
1. Einstieg

Allgemein kann man den Browser grob in 3 Aufgabenbereiche teilen.

1. Das Darstellen der Internetseite.
2. Das Speichern von Werten auf den Computer, um später darauf zu greifen zu können.
Der gespeicherte Text wird Cookie(s) genannt.
3. Kommunikation zwischen Server und Browser mithilfe von sogenannten Packets.
-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
2. Was sind Cookies und was bringen sie ?

Cookies sind Texte, die auf dem Computer gespeichert werden.
Es sind sozusagen Text-Dateien, die der Browser immer wieder abrufen kann.
Wann der Browser Cookies setzen soll, sagt ihm der Server.
Der Browser schickt dann wenn man sich auf der Internetseite bewegt, alle
Cookies, die von dieser Internetseite gesetzt wurden an den Server.
Dadurch sieht der Server dann zum Beispiel "Aha der Benutzername XYZ war das letztemal um 18:43 eingeloggt".
Damit der Server weiß,welcher Cookie welchen Wert hat, werden die Texte wie in AutoIT, "Variablen" zu gewiesen (nur diese Variablen haben kein $ davor).
Damit der Server aber auch weiß, dass das abgeschickt ein Cookie ist, muss der Browser noch das Wort Cookie :.
davor setzen.

Damit der Browser weiß, welche Cookies er setzen soll, steht vor den Cookies, die gesetzt werden sollen
das Wort, Set-Cookie:.
Auserdem muss jeder Wert wieder eine "Variable" zugewiesen bekommen, damit der Browser weiß, welcher Cookie betroffen ist.
Beispielsweise könnte vom Server folgendes geschickt werden :
Code:
[COLOR="Sienna"]Set-Cookie : seite_besucht=2 ;[/COLOR]
Nach jedem einzelnen Cookie muss ein ; gesetzt werden,damit der Browser und der Server weiß, wann ein neuer Cookie anfängt.

Wenn wir uns nun auf dieser Seite bewegen, dann schickt unser Browser automatisch folgendes ab :
Code:
Cookie : seite_besucht=2 ;
Was dieser Cookie bedeuten könnte, lässt sich nur vermuten, er könnte zum Beispiel die Anzahl der Besuche auf der Seite sein.
Also würde dieser Cookie anzeigen, dass wir bereits 2 mal diese Seite aufgerufen haben.

Wir gehen einfach mal auf google.de, starten Live Http Headers und suchen nach irgendetwas, danach gehen wir wieder in Live Http Headers und dort
sollten wir dann sehen, dass unser Browser Cookies abgeschickt hat.
So sollte es in etwa aussehen, was die verschiedenen Cookies bedeuten ist uns egal,
wir wollten uns das nur mal kurz anschauen.
Danach können wir Live Http Headers wieder schließen.
Nun wissen wir also was Cookies sind und wie sie gesetzt werden.

-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
3. Was sind Packets und was macht man damit ?

Ein Packet ist nichts anderes als ein Text, der geschickt wird.
Jedes Browserpacket ist im
Grundaufbau gleich, aber wie ist der Grundaufbau ?
Um das herauszufinden, gehen wir wieder in
Live Http Headers und navigieren anschließend auf Ogame.de.
Das sollten wir in etwa in Live Http Headers stehen haben :
Das rot umrahmte ist ein Packet das vom Browser geschickt wurde, also alles was in dem roten Viereck steht ist vom Browser.
Alles was in dem blauen Viereck steht ist die Antwort vom Server.
Das Packet vom Server geht eigentlich noch weiter, denn das Packet vom Server besteht nicht nur aus dem sogenannten Header (= das was wir zu sehen bekommen) sondern auch noch aus den Quelltext.

Jede Zeile besitzt genau einen Wert, man kann also das Packet, das der Browser abgeschickt hat, nicht so schreiben :
Code:
GET / HTTP/1.1
Host: ogame.deUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Das würde der Server nicht verstehen.

Man muss also immer genau darauf achten, wann eine neue Zeile kommt, die Reihenfolge hingegen ist egal.
So wäre das hier :
Code:
GET / HTTP/1.1
Host: ogame.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
genau das selbe wie das :

Code:
GET / HTTP/1.1
Host: ogame.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Es gibt nur eine Sache, die immer ganz oben stehen muss, nämlich der Header-Kopf in unserem Fall GET / HTTP/1.1.
Wenn man diese Regeln alle beachtet, dann kann eigentlich nichts mehr schief gehen.

-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
4. Welche Arten von Packets gibt es ?

Es gibt 2 unterschiedliche Arten von Packets, zum einem die GET-Packets und zum anderen die POST-Packets.
Die GET-Packets und POST-Packets sind sich ziehmlich ähnlich, es gibt nur einen kleinen Unterschied.

Ein GET-Packet ist in etwa so aufgebaut :
Code:
GET / HTTP/1.1
Host: ogame.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Ein POST-Packet dazu im Vergleich (Ogame Einlogg-Packet) :

Code:
POST /game/reg/login2.php HTTP/1.1
Host: andromeda.ogame.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://ogame.de/
Content-Type: application/x-www-form-urlencoded
Content-Length: 90

uni_id=101&v=2&is_utf8=0&uni_url=andromeda.ogame.de&login=lol&pass=12345&submitInput=Login
Der erste Unterschied, der auffällt ist,
dass der POST-Packet Kopf anders ist.
Es steht im Kopf POST [...] anstatt GET [...].
Es ist wichtig den Kopf immer richtig zu setzen, denn sonst weiß der Server nicht, ob das ein GET-Packet ist oder ein
POST-Packet.
Der Mittelteil ist eigentlich ziehmlich gleich.
Nur das Ende ist wieder anders :
Code:
Content-Length: 90

uni_id=101&v=2&is_utf8=0&uni_url=andromeda.ogame.de&login=lol&pass=12345&submitInput=Login
Das sind extra Informationen, die von dem Browser gechickt werden, Content-Length ist dabei die Länge
des Textes, der als Zusatz geschickt werden soll, unser Zusatz besteht also aus 90 Zeichen.
Nach Content-Length, kommt bei POST-Packets immer eine leere Zeile, also 2 Absätze anstatt einem.
Der Rest sind wieder so Art Variablen, dem Server wird in unserem Fall also mitgeteil, auf welchem Server wir uns
einloggen wollen, nämlich auf dem Server mit der uni_id, 101.
Für was v steht lässt sich nur vermuten, aber was genau v bedeutet kann uns egal sein, denn v verändert sich nie,
egal wie oft wir uns versuchen in Ogame einzuloggen.
is_utf8 überprüft also ob irgendetwas utf8 ist, das braucht uns aber auch nicht zu interessieren, da wir den Wert immer bei 0 lassen können.
uni_url scheint die Url von dem Uni
zu sein, auf dem wir uns einloggen wollen.
login ist unser Account name mit dem wir versuchen uns einzuloggen und pass ist unser Passwort.
Zu guter letzt haben wir noch den Wert submitInput, der scheint festzulegen, was wir machen wollen, ob wir uns registrieren wollen oder einloggen.
-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
5. Kommunikation zwischen Server und Spieler (=Browser)

Wenn wir uns Einloggen wollen, sieht das so aus.
Wenn wir 12 Jäger bauen wollen, sieht das so aus :

Der Server erkennt also meistens nur an den Cookies alleine, ob diese Person bereits eingeloggt ist oder nicht.
-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
6. Grundlegendes zu TCP/UDP in AutoIT

TCP und UDP sind verschiedene Verbindungsarten .
Der größte Unterschied zwischen TCP und UDP ist der, dass Packets, die über TCP
geschickt wurden immer sooft geschickt werden, bis sie ankommen.
Das heißt, wenn mal ein paar Packets, die über TCP geschickt worden sind, verschwinden, werden sie einfach nocheinmal geschickt.
Der Nachteil daran ist, dass TCP im allgemeinen viel langsamer ist als UDP, da UDP die Daten nur ein einziges mal schickt,
gehen die Daten beim verschicken verloren, ist es UDP vollkommen egal, denn UDP erwartet keine Antwort vom Server, ob die
Packets angekommen sind oder nicht, es schickt einfach immer weiter Packets.
Da wir sicher gehen wollen, dass unsere Packets ankommen nehmen wir TCP für unsere Bots.

Wir fangen ersteinmal mit den grundlegenden Sachen an.
Immer wenn wir einen TCP Befehl ausführen wollen, dann müssen wir davor ersteinmal die TCP-Befehle "aktivieren".
Wenn wir die Befehle nicht mehr brauchen müssen wir sie auch wieder "deaktivieren".
Skript :
PHP Code:
TCPStartup() ; TCP-Befehle aktivieren
TCP-Befehle
TCPShutdown
() ; TCP-Befehle deaktivieren 
Nun wissen wir fast schon genug um mit den Bots anfangen zu können, aber bervor wir uns mit
den großen Dingen beschäftigen, probieren wir noch ein paar TCP-Befehle aus.
-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
7. Spielerreien mit TCP-Befehlen in AutoIT

Damit wir wissen wohin unsere TCP-Packets geschickt werden sollen, müssen wir irgendwie
die IP-Adresse vom Ziel herausfinden, dafür gibt es zwar auch ein Addon, aber ich mache es immer mit folgendem Skript :

PHP Code:
TCPStartup()
$ip TCPNameToIP("www.google.de")
TCPShutdown()
Msgbox(0,"IP","IP Adresse von google.de ist : "&$ip
Man sollte das http:\\ immer weg lassen, wenn man die IP-Adresse herausfinden will, denn sonst kann es zu Problemen kommen.
Das selbe geht auch Rückwärts :
PHP Code:
#include <iNet.au3>
TCPStartup()
$ip TCPNameToIP("www.google.de")
$name=_TCPIpToName($ip)
TCPShutdown()
Msgbox(0,"IP","IP Adresse von google.de ist : "&$ip&" und der Name ist : "&$name
-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
8. Erstellen eines kleinen Packet Botes

Wir machen einfach nur einen Einloggbot für Ogame, der die Metalmine einmal ausbaut.

Also wie immer starten wir Live Http Headers und loggen uns auf der Ogameseite ein.

Unser Packet, das vom Browser geschickt wurde sollte in etwa so ausschauen :

Code:
POST /game/reg/login2.php HTTP/1.1
Host: andromeda.ogame.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://ogame.de/
Content-Type: application/x-www-form-urlencoded
Content-Length: 93
uni_id=101&v=2&is_utf8=0&uni_url=andromeda.ogame.de&login=Spielername&pass=&submitInput=Login
Bevor wir damit anfangen können einen Bot damit zu machen,
müssen wir erstmal wissen was das alles bedeutet.
POST /game/reg/login2.php HTTP/1.1, das Ist also der Kopf, dieser ist immer für diese eine Aktion gleich (also bei uns
ist es das Einloggen).
Host: andromeda.ogame.de, das ist sozusagen der Hauptserver,also über diesen Server sind alle Informationen des Servers Andromeda gespeichert.
Dieser Wert User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 ist einfach eine Information über den
Browser,der benutzt wird, welche Version usw.
Der nächste Wert, also Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, sagt aus was alles für Texte empfangen werden können.
Dieser Wert, Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3, gibt an was für Sprachen der Server aktzeptiert.
Accept-Encoding: gzip,deflate legt fest welche Verschlüsselungen der Browser "beherrscht", diesen Wert brauchen wir nicht, denn unser Browsergamebot wird keine Verschlüsselung haben.
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 gibt an welche Buchstaben vom Server empfangen werden können.
Keep-Alive: 300 und Connection: keep-alive sagt etwas über den Verbindungstyp aus und wie lange eine Verbindung maximal andauern darf.
Referer: ist die Seite von welcher man auf die jetztige Seite navigiert hat.
Was genau Content-Type: application/x-www-form-urlencoded ist, weiß ich auch nicht, aber das ist nicht so wichtig.
Der Content-Type ist bei jeder Internetseite gleich.
Content-Length: 93 (93=Anzahl der Buchstaben im Post-Zusatz.)
uni_id=101&v=2&is_utf8=0&uni_url=andromeda.ogame.d e&login=Spielername&pass=&submitInput=Login ist der "Post-Zusatz".
Nachdem wir alles herausgefunden haben, können wir mit der eigentlich Abreit anfangen.

Es gibt 3 Funktionen, die uns das ganze enorm vereinfachen :
PHP Code:
#include<String.au3>

Func GetCookies($sQuellcode)
    
Local $sCookies$i$aCookies
    $sCookies 
''
    
$aCookies _StringBetween($sQuellcode'Set-Cookie: '';'1)
    For 
$i 0 To UBound($aCookies) - 1
        $sCookies 
&= $aCookies[$i] & ';'
    
Next
    
Return $sCookies
EndFunc   
;==>GetCookies

Func TCPRequest
($sIp$sHost,$msg=0$sSeite ""$sPost ''$sCookies ''$sReferer ''$iMaxTime 10000)
    
Local $sPacket$iSocket$iTimer

    
If $sPost '' Then
        $sPacket 
'GET /' $sSeite ' HTTP/1.1' & @CRLF
    
Else
        
$sPacket 'POST /' $sSeite ' HTTP/1.1' & @CRLF
    
EndIf
    
$sPacket &= 'Host: ' $sHost & @CRLF _
            
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)' & @CRLF _
            
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF _
            
'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF _
            
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' & @CRLF _
            
'Keep-Alive: 300' & @CRLF _
            
'Content-Type: application/x-www-form-urlencoded' & @CRLF _
            
'Connection: keep-alive' & @CRLF
    
If $sReferer <> '' Then
        $sPacket 
&= 'Referer: ' $sReferer & @CRLF
    
EndIf
    If 
$sCookies <> '' Then
        $sCookies
=StringStripCR($sCookies)
        
$sCookies=StringStripWS($sCookies,8)
        
$sPacket &= 'Cookie: ' $sCookies & @CRLF
    
EndIf
    If 
$sPost <> '' Then
        $sPacket 
&= 'Content-Length: ' StringLen($sPost) & @CRLF
    
EndIf
    
$sPacket &= @CRLF
    
If $sPost <> '' Then
        $sPacket 
&= $sPost
    
EndIf
    If 
$msg=1 Then
    MsgBox
(0,"Packet",$sPacket)
    EndIf
    
TCPStartup()
    If @
error Then Return SetError(10"")
    
$iSocket TCPConnect($sIp80)
    If @
error Then Return SetError(20"")
    
TCPSend($iSocket$sPacket)
    If @
error Then Return SetError(30"")
    
$iTimer TimerInit()
    Do
        
$sRecv TCPRecv($iSocket1024)
        If 
TimerDiff($iTimer) > $iMaxTime Then Return SetError(40"")
    
Until $sRecv <> ""
    
Do
        
$sRecv &= TCPRecv($iSocket1024)
    
Until @error Or StringInStr($sRecv'</html>')
    
TCPCloseSocket($iSocket)
    
TCPShutdown()
    Return 
$sRecv
EndFunc   
;==>TCPRequest

Func Change
($string)
    
$string StringReplace($string"%""%25")
        
$string StringReplace($string"†""%E2%80%A0")
    
$string StringReplace($string"ä""%C3%A4")
    
$string StringReplace($string"ö""%C3%B6")
    
$string StringReplace($string"ü""%C3%BC")
    
$string StringReplace($string"!""%21")
    
$string StringReplace($string'"'"%22")
    
$string StringReplace($string"§""%C2%A7")
    
$string StringReplace($string"$""%24")
    
$string StringReplace($string"&""%26")
    
$string StringReplace($string"/""%2F")
    
$string StringReplace($string"+""%2B")
    
$string StringReplace($string" ""+")
    
$string StringReplace($string"(""%28")
    
$string StringReplace($string")""%29")
    
$string StringReplace($string"=""%3D")
    
$string StringReplace($string"?""%3F")
    
$string StringReplace($string"[""%5B")
    
$string StringReplace($string"]""%5D")
    
$string StringReplace($string"{""%7B")
    
$string StringReplace($string"}""%7D")
    
$string StringReplace($string"ß""%C3%9F")
    
$string StringReplace($string",""%2C")
    
$string StringReplace($string":""%3A")
    
$string StringReplace($string";""%3B")
    
$string StringReplace($string"#""%23")
    
$string StringReplace($string"~""%7E")
    
$string StringReplace($string"²""%C2%B2")
    
$string StringReplace($string"³""%C2%B3")
    
$string StringReplace($string"<""%3C")
    
$string StringReplace($string">""%3E")
    
$string StringReplace($string"|""%7C")
    
$string StringReplace($string"^""%5E")
    
$string StringReplace($string"°""%C2%B0")
    
$string StringReplace($string"´""%C2%B4")
    
$string StringReplace($string"@""%40")
    
$string StringReplace($string"€""%E2%82%AC")
    Return 
$string
EndFunc   
;==>Change 
1. Funktion : GetCookies($SourceCode), diese Funktion sucht sich alle Cookies heraus und speichert sie in einer Variable (Diese Funktion ist nicht von mir, sie ist von AMrK, www. *************/coding-bereich-autoit-bot-community/tutorials/autoit/2284-video-tut-tcp-reihe/).
2. TCPRequest($sIp, $sHost,$msg=0, $sSeite = "", $sPost = '', $sCookies = '', $sReferer = '', $iMaxTime = 10000), diese Funktion ist extrem hilfreich,
sie erspart uns nämlich das Umständliche TCP-Connect usw. (Diese Funktion ist nicht von mir, sie ist von AMrK, www. *************/coding-bereich-autoit-bot-community/tutorials/autoit/2284-video-tut-tcp-reihe/).
Diese Funktion schickt ein Packet ab und gibt den Quelltext als return zurück.
Der erste Wert $sIp ist die IP-Adresse,
an der das Packet geschickt werden soll.
Der zweite Wert ist der Host, also in unserem Fall wäre das : andromeda.ogame.de.
Den dritten Wert habe ich hinzugefügt, um überprüfen zu können ob das Packet richtig ausschaut.
Setzt man diesen Wert zu 1 so wird eine Messagebox gezeigt mit dem Packetinhalt, den man abschickt.
Der vierte Wert ist die Seite, zu welcher das Packet geschickt werden soll,
in unserem Beispiel wäre es :
/game/reg/login2.php, die Seite steht immer zwischen
Get bzw Post und HTTP/1.1.
Der fünfte Wert sind die Cookies, die man mitschicken möchte, wir werden fast immer die Cookies, die durch GetCookies ausgelesen wurden, benutzen.
Der nächste Wert, $sReferer ist der Referer, ein Referer gibt immer an von welcher Seite aus man zu der momentanen navigiert hat.

Manche Browsergames sind da sehr pingelig und möchten jeden Referer haben, anderen ist es wiederum egal von wo aus man die Seite aufgerufen hat.
Der Referer wäre in unserem Fall .
Der letzte Wert, $iMaxTime, gibt an wie lange maximal gewartet werden soll, bis der Bot etwas empfangen hat, diesen Wert bei standart zu lassen ist empfehlenswert.

Die letzte Funktion Change($String), wandelt einen
normalen String so um, dass es dem Server passt.
Wenn beispielsweise Äs im Benutzernamen enthalten sind mag der Server diese nicht ohne Umwandlung, also müsste man sie zuerst per Change umwandeln.

Beispiel :
Unser Benutzername lautet : Tästär
Wenn wir aber unseren Benutzernamen unverändert an den Server schicken
, weiß dieser nicht welcher Benutzername gemeint ist, da der Server
den Buchstaben "Ä" nicht kennt.
Wenn wir den Benutzernamen so ändern, dass es der Server versteht,
sieht das so aus :
Code:
T[COLOR="Red"]%C3%A4[/COLOR]st[COLOR="Red"]%C3%A4[/COLOR]r
%C3%A4 wäre für uns also ein ä.

Vorerst werden uns diese 3 Funktionen und Live Http Headers reichen.
Na dann sollten wir mal mit dem Einloggskript anfangen :
Zuerst einmal 3 Inputboxen für die Daten
PHP Code:
$uni=InputBox("Gib die Zahl von deinem Uni ein","Gib die Zahl von deinem Uni ein")
$name=InputBox("Accountname","Gib deinen Accountnamen ein")
$passwort=InputBox("Passwort","Gib dein Passwort ein"
Anschliesend wollen wir natürlich die IP-Adresse, denn sonst geht nichts, also wird das hinzugefügt :
PHP Code:
TCPStartup()
$ip TCPNameToIP('uni'&$uni&'.ogame.de')
TCPShutdown() 
So als nächstes müssen wir unser Post-Packet so verändern, dass es auf fast jedem Server ,
mit jedem Benutzernamen und Passwort funktioniert.
Das schaut dann so aus :
PHP Code:
$post='uni_id=101&v=2&is_utf8=0&uni_url=uni'&$uni&'.ogame.de&login='&$name&'&pass='&$passwort&'&submitInput=Login' 
Als nächstes müssen wir nur noch die Funktion TCPRequest(...) aufrufen mit den passenden Werten und schon sind wir eingeloggt.
PHP Code:
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0"/game/reg/login2.php",$post""'http://ogame.de/'
Aber wir wollen noch die Cookies, die gesetzt werden, denn die brauchen wir immer wenn wir ein Einloggskript gemacht haben, sonst haben wir uns nicht wirklich eingeloggt.
Also wird das hinzugefügt :
PHP Code:
$cookies=GetCookies($source
Endlich können wir den Bot testen, aber wir machen noch eine Msgbox rein, damit wir sehen was wir vom Server geantwortet bekommen haben, das Skript
sollte in etwa so aussehen :
PHP Code:
#include<String.au3>
$uni=InputBox("Gib die Zahl von deinem Uni ein","Gib die Zahl von deinem Uni ein")
$name=InputBox("Accountname","Gib deinen Accountnamen ein")
$passwort=InputBox("Passwort","Gib dein Passwort ein")

TCPStartup()
$ip TCPNameToIP('uni'&$uni&'.ogame.de')
TCPShutdown()

$post='uni_id=101&v=2&is_utf8=0&uni_url=uni'&$uni&'.ogame.de&login='&Change($name)&'&pass='&Change($passwort)&'&submitInput=Login'
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0"/game/reg/login2.php",$post""'http://ogame.de/')
$cookies=GetCookies($source)
MsgBox(0,"test",$source)


Func GetCookies($sQuellcode)
    
Local $sCookies$i$aCookies
    $sCookies 
''
    
$aCookies _StringBetween($sQuellcode'Set-Cookie: '';'1)
    For 
$i 0 To UBound($aCookies) - 1
        $sCookies 
&= $aCookies[$i] & ';'
    
Next
    
Return $sCookies
EndFunc   
;==>GetCookies

Func TCPRequest
($sIp$sHost,$msg=0$sSeite ""$sPost ''$sCookies ''$sReferer ''$iMaxTime 10000)
    
Local $sPacket$iSocket$iTimer

    
If $sPost '' Then
        $sPacket 
'GET /' $sSeite ' HTTP/1.1' & @CRLF
    
Else
        
$sPacket 'POST /' $sSeite ' HTTP/1.1' & @CRLF
    
EndIf
    
$sPacket &= 'Host: ' $sHost & @CRLF _
            
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)' & @CRLF _
            
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF _
            
'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF _
            
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' & @CRLF _
            
'Keep-Alive: 300' & @CRLF _
            
'Content-Type: application/x-www-form-urlencoded' & @CRLF _
            
'Connection: keep-alive' & @CRLF
    
If $sReferer <> '' Then
        $sPacket 
&= 'Referer: ' $sReferer & @CRLF
    
EndIf
    If 
$sCookies <> '' Then
        $sCookies
=StringStripCR($sCookies)
        
$sCookies=StringStripWS($sCookies,8)
        
$sPacket &= 'Cookie: ' $sCookies & @CRLF
    
EndIf
    If 
$sPost <> '' Then
        $sPacket 
&= 'Content-Length: ' StringLen($sPost) & @CRLF
    
EndIf
    
$sPacket &= @CRLF
    
If $sPost <> '' Then
        $sPacket 
&= $sPost
    
EndIf
    If 
$msg=1 Then
    MsgBox
(0,"test",$sPacket)
    EndIf
    
TCPStartup()
    If @
error Then Return SetError(10"")
    
$iSocket TCPConnect($sIp80)
    If @
error Then Return SetError(20"")
    
TCPSend($iSocket$sPacket)
    If @
error Then Return SetError(30"")
    
$iTimer TimerInit()
    Do
        
$sRecv TCPRecv($iSocket1024)
        If 
TimerDiff($iTimer) > $iMaxTime Then Return SetError(40"")
    
Until $sRecv <> ""
    
Do
        
$sRecv &= TCPRecv($iSocket1024)
    
Until @error Or StringInStr($sRecv'</html>')
    
TCPCloseSocket($iSocket)
    
TCPShutdown()
    Return 
$sRecv
EndFunc   
;==>TCPRequest

Func Change
($string)
    
$string StringReplace($string"%""%25")
        
$string StringReplace($string"†""%E2%80%A0")
    
$string StringReplace($string"ä""%C3%A4")
    
$string StringReplace($string"ö""%C3%B6")
    
$string StringReplace($string"ü""%C3%BC")
    
$string StringReplace($string"!""%21")
    
$string StringReplace($string'"'"%22")
    
$string StringReplace($string"§""%C2%A7")
    
$string StringReplace($string"$""%24")
    
$string StringReplace($string"&""%26")
    
$string StringReplace($string"/""%2F")
    
$string StringReplace($string"+""%2B")
    
$string StringReplace($string" ""+")
    
$string StringReplace($string"(""%28")
    
$string StringReplace($string")""%29")
    
$string StringReplace($string"=""%3D")
    
$string StringReplace($string"?""%3F")
    
$string StringReplace($string"[""%5B")
    
$string StringReplace($string"]""%5D")
    
$string StringReplace($string"{""%7B")
    
$string StringReplace($string"}""%7D")
    
$string StringReplace($string"ß""%C3%9F")
    
$string StringReplace($string",""%2C")
    
$string StringReplace($string":""%3A")
    
$string StringReplace($string";""%3B")
    
$string StringReplace($string"#""%23")
    
$string StringReplace($string"~""%7E")
    
$string StringReplace($string"²""%C2%B2")
    
$string StringReplace($string"³""%C2%B3")
    
$string StringReplace($string"<""%3C")
    
$string StringReplace($string">""%3E")
    
$string StringReplace($string"|""%7C")
    
$string StringReplace($string"^""%5E")
    
$string StringReplace($string"°""%C2%B0")
    
$string StringReplace($string"´""%C2%B4")
    
$string StringReplace($string"@""%40")
    
$string StringReplace($string"€""%E2%82%AC")
    Return 
$string
EndFunc   
;==>Change 
So anschliesend müssen wir schauen was uns die Msgbox zeigt und damit müssen wir dann weiter machen, also was zeigt uns die Msgbox ?
Hier ein Bild :


Das schaut gut aus, wir sind aber auf einer Seite, die "refresht" werden muss, gelandet, das können wir in der Msgbox sehen, wo ='refresh' steht. Wir werden die Seite aber nicht neuladen, sondern gleich zur Übersicht navigieren.
Wir starten also wieder Live Http Headers, loggen uns ein,
drücken in Live Http Headers auf löschen, drücken auf Übersicht,
schauen uns das Packet an und fügen es wieder zu unserem Skript hinzu.
Das ist immer das selbe...
Aber dieses mal nicht, denn wir sehen session=b72364bcdb376, das hat
uns schon beim IE-Bot Probleme gemacht.
Wir müssen also schauen ob wir aus dem Packet, das uns der Server geschickt hat herausfinden können, welchen Wert die session hat.
Nach einen kurzen Blick auf die Antwort des Server, sehen wir, dass die session zwsichen session= und &lgn steht, was als nächstes kommt, sollte klar sein... _StringBetween(...)

Wir fügen zu unserem Code also folgendes hinzu :
PHP Code:
$session=_StringBetween($source,"session=","&lgn"
und haben somit die session herausgefunden, das ist wunderbar, der Rest ist wie immer.
Wir lassen nur gleich die neue Antwort vom Server abspeichern und zwar in eine Datei, dann
haben wir einen besseren Überblick und wir können auch einfach kopieren, wenn uns etwas auffält.
Skript :
PHP Code:
#include<String.au3>
$uni=InputBox("Gib die Zahl von deinem Uni ein","Gib die Zahl von deinem Uni ein")
$name=InputBox("Accountname","Gib deinen Accountnamen ein")
$passwort=InputBox("Passwort","Gib dein Passwort ein")

TCPStartup()
$ip TCPNameToIP('uni'&$uni&'.ogame.de')
TCPShutdown()
$post='uni_id=101&v=2&is_utf8=0&uni_url=uni'&$uni&'.ogame.de&login='&Change($name&)'&pass='&Change($passwort)&'&submitInput=Login'
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0"/game/reg/login2.php",$post""'http://ogame.de/')
$cookies=GetCookies($source)

$session=_StringBetween($source,"session=","&lgn")
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0'/game/index.php?page=overview&session='&$session[0]&'&lgn=1',"",$cookies)
FileWrite("test.txt",$source)


Func GetCookies($sQuellcode)
    
Local $sCookies$i$aCookies
    $sCookies 
''
    
$aCookies _StringBetween($sQuellcode'Set-Cookie: '';'1)
    For 
$i 0 To UBound($aCookies) - 1
        $sCookies 
&= $aCookies[$i] & ';'
    
Next
    
Return $sCookies
EndFunc   
;==>GetCookies

Func TCPRequest
($sIp$sHost,$msg=0$sSeite ""$sPost ''$sCookies ''$sReferer ''$iMaxTime 10000)
    
Local $sPacket$iSocket$iTimer

    
If $sPost '' Then
        $sPacket 
'GET /' $sSeite ' HTTP/1.1' & @CRLF
    
Else
        
$sPacket 'POST /' $sSeite ' HTTP/1.1' & @CRLF
    
EndIf
    
$sPacket &= 'Host: ' $sHost & @CRLF _
            
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)' & @CRLF _
            
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF _
            
'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF _
            
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' & @CRLF _
            
'Keep-Alive: 300' & @CRLF _
            
'Content-Type: application/x-www-form-urlencoded' & @CRLF _
            
'Connection: keep-alive' & @CRLF
    
If $sReferer <> '' Then
        $sPacket 
&= 'Referer: ' $sReferer & @CRLF
    
EndIf
    If 
$sCookies <> '' Then
        $sCookies
=StringStripCR($sCookies)
        
$sCookies=StringStripWS($sCookies,8)
        
$sPacket &= 'Cookie: ' $sCookies & @CRLF
    
EndIf
    If 
$sPost <> '' Then
        $sPacket 
&= 'Content-Length: ' StringLen($sPost) & @CRLF
    
EndIf
    
$sPacket &= @CRLF
    
If $sPost <> '' Then
        $sPacket 
&= $sPost
    
EndIf
    If 
$msg=1 Then
    MsgBox
(0,"test",$sPacket)
    EndIf
    
TCPStartup()
    If @
error Then Return SetError(10"")
    
$iSocket TCPConnect($sIp80)
    If @
error Then Return SetError(20"")
    
TCPSend($iSocket$sPacket)
    If @
error Then Return SetError(30"")
    
$iTimer TimerInit()
    Do
        
$sRecv TCPRecv($iSocket1024)
        If 
TimerDiff($iTimer) > $iMaxTime Then Return SetError(40"")
    
Until $sRecv <> ""
    
Do
        
$sRecv &= TCPRecv($iSocket1024)
    
Until @error Or StringInStr($sRecv'</html>')
    
TCPCloseSocket($iSocket)
    
TCPShutdown()
    Return 
$sRecv
EndFunc   
;==>TCPRequest

Func Change
($string)
    
$string StringReplace($string"%""%25")
        
$string StringReplace($string"†""%E2%80%A0")
    
$string StringReplace($string"ä""%C3%A4")
    
$string StringReplace($string"ö""%C3%B6")
    
$string StringReplace($string"ü""%C3%BC")
    
$string StringReplace($string"!""%21")
    
$string StringReplace($string'"'"%22")
    
$string StringReplace($string"§""%C2%A7")
    
$string StringReplace($string"$""%24")
    
$string StringReplace($string"&""%26")
    
$string StringReplace($string"/""%2F")
    
$string StringReplace($string"+""%2B")
    
$string StringReplace($string" ""+")
    
$string StringReplace($string"(""%28")
    
$string StringReplace($string")""%29")
    
$string StringReplace($string"=""%3D")
    
$string StringReplace($string"?""%3F")
    
$string StringReplace($string"[""%5B")
    
$string StringReplace($string"]""%5D")
    
$string StringReplace($string"{""%7B")
    
$string StringReplace($string"}""%7D")
    
$string StringReplace($string"ß""%C3%9F")
    
$string StringReplace($string",""%2C")
    
$string StringReplace($string":""%3A")
    
$string StringReplace($string";""%3B")
    
$string StringReplace($string"#""%23")
    
$string StringReplace($string"~""%7E")
    
$string StringReplace($string"²""%C2%B2")
    
$string StringReplace($string"³""%C2%B3")
    
$string StringReplace($string"<""%3C")
    
$string StringReplace($string">""%3E")
    
$string StringReplace($string"|""%7C")
    
$string StringReplace($string"^""%5E")
    
$string StringReplace($string"°""%C2%B0")
    
$string StringReplace($string"´""%C2%B4")
    
$string StringReplace($string"@""%40")
    
$string StringReplace($string"€""%E2%82%AC")
    Return 
$string
EndFunc   
;==>Change 
Die Cookies brauchen wir nicht erneut zu speichern, wenn wir auf eine andere Seite navigieren, denn die wichtigen Cookies und das ist fast immer so, bekommt man beim LogIn.
Als nächstes schicken wir ein Packet, das uns auf die Gebäudeseite navigiert, wie das funktioniert, solltet ihr inzwischen selbst verstanden haben.
So wir sind nun also auf der Gebäudeseite, wir bauen einfach mal eine Mine und schauen was dabei rauskommt :
Code:
GET /game/index.php?page=b_building&session=b57a787b94fa&modus=add&techid=2&planet=1320734 HTTP/1.1
Host: uni16.ogame.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://uni16.ogame.de/game/index.php?page=b_building&session=b57a787b94fa
Cookie: PHPSESSID=bf037e270fd146a4002c16a17b9d297f; prsess_190705=6b967adc9f8f69ea59a670610ab835e6; login_190705=U_de16%3AShadow992%3Ab97d6ba5f932bfce09a5feb007ceeb7f
Über die Cookies müssen wir uns keine Gedanken machen, wir haben ja alle wichtigen Cookies bereits beim LogIn gespeichert.
So jetzt müssen wir das ganze nur noch in unseren TCPRequest-Befehl einfügen :

PHP Code:
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0'/game/index.php?page=b_building&session='&$session[0]&'&modus=add&techid=2&planet=1320734',"",$cookies
Die Nummer hinter planet= wird bei euch höchstwahrscheinlich anders sein, also müsst ihr euere eigene nehmen.
Wir sind also fertig.
Wir sollten unser Skript sofort testen.
Unser fertiges Skript :
PHP Code:
$uni=InputBox("Gib die Zahl von deinem Uni ein","Gib die Zahl von deinem Uni ein")
$name=InputBox("Accountname","Gib deinen Accountnamen ein")
$passwort=InputBox("Passwort","Gib dein Passwort ein")

TCPStartup()
$ip TCPNameToIP('uni'&$uni&'.ogame.de')
TCPShutdown()

$post='uni_id=101&v=2&is_utf8=0&uni_url=uni'&$uni&'.ogame.de&login='&Change($name)&'&pass='&Change($passwort)&'&submitInput=Login'
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0"/game/reg/login2.php",$post""'http://ogame.de/')
$cookies=GetCookies($source)

$session=_StringBetween($source,"session=","&lgn")
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0'/game/index.php?page=overview&session='&$session[0]&'&lgn=1',"",$cookies)
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0'/game/index.php?page=b_building&session='&$session[0],"",$cookies)
$source=TCPRequest($ip,"uni"&$uni&".ogame.de",0'/game/index.php?page=b_building&session='&$session[0]&'&modus=add&techid=2&planet=1320734',"",$cookies)

Func GetCookies($sQuellcode)
    
Local $sCookies$i$aCookies
    $sCookies 
''
    
$aCookies _StringBetween($sQuellcode'Set-Cookie: '';'1)
    For 
$i 0 To UBound($aCookies) - 1
        $sCookies 
&= $aCookies[$i] & ';'
    
Next
    
Return $sCookies
EndFunc   
;==>GetCookies

Func TCPRequest
($sIp$sHost,$msg=0$sSeite ""$sPost ''$sCookies ''$sReferer ''$iMaxTime 10000)
    
Local $sPacket$iSocket$iTimer

    
If $sPost '' Then
        $sPacket 
'GET /' $sSeite ' HTTP/1.1' & @CRLF
    
Else
        
$sPacket 'POST /' $sSeite ' HTTP/1.1' & @CRLF
    
EndIf
    
$sPacket &= 'Host: ' $sHost & @CRLF _
            
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)' & @CRLF _
            
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF _
            
'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF _
            
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' & @CRLF _
            
'Keep-Alive: 300' & @CRLF _
            
'Content-Type: application/x-www-form-urlencoded' & @CRLF _
            
'Connection: keep-alive' & @CRLF
    
If $sReferer <> '' Then
        $sPacket 
&= 'Referer: ' $sReferer & @CRLF
    
EndIf
    If 
$sCookies <> '' Then
        $sCookies
=StringStripCR($sCookies)
        
$sCookies=StringStripWS($sCookies,8)
        
$sPacket &= 'Cookie: ' $sCookies & @CRLF
    
EndIf
    If 
$sPost <> '' Then
        $sPacket 
&= 'Content-Length: ' StringLen($sPost) & @CRLF
    
EndIf
    
$sPacket &= @CRLF
    
If $sPost <> '' Then
        $sPacket 
&= $sPost
    
EndIf
    If 
$msg=1 Then
    MsgBox
(0,"test",$sPacket)
    EndIf
    
TCPStartup()
    If @
error Then Return SetError(10"")
    
$iSocket TCPConnect($sIp80)
    If @
error Then Return SetError(20"")
    
TCPSend($iSocket$sPacket)
    If @
error Then Return SetError(30"")
    
$iTimer TimerInit()
    Do
        
$sRecv TCPRecv($iSocket1024)
        If 
TimerDiff($iTimer) > $iMaxTime Then Return SetError(40"")
    
Until $sRecv <> ""
    
Do
        
$sRecv &= TCPRecv($iSocket1024)
    
Until @error Or StringInStr($sRecv'</html>')
    
TCPCloseSocket($iSocket)
    
TCPShutdown()
    Return 
$sRecv
EndFunc   
;==>TCPRequest

Func Change
($string)
    
$string StringReplace($string"%""%25")
        
$string StringReplace($string"†""%E2%80%A0")
    
$string StringReplace($string"ä""%C3%A4")
    
$string StringReplace($string"ö""%C3%B6")
    
$string StringReplace($string"ü""%C3%BC")
    
$string StringReplace($string"!""%21")
    
$string StringReplace($string'"'"%22")
    
$string StringReplace($string"§""%C2%A7")
    
$string StringReplace($string"$""%24")
    
$string StringReplace($string"&""%26")
    
$string StringReplace($string"/""%2F")
    
$string StringReplace($string"+""%2B")
    
$string StringReplace($string" ""+")
    
$string StringReplace($string"(""%28")
    
$string StringReplace($string")""%29")
    
$string StringReplace($string"=""%3D")
    
$string StringReplace($string"?""%3F")
    
$string StringReplace($string"[""%5B")
    
$string StringReplace($string"]""%5D")
    
$string StringReplace($string"{""%7B")
    
$string StringReplace($string"}""%7D")
    
$string StringReplace($string"ß""%C3%9F")
    
$string StringReplace($string",""%2C")
    
$string StringReplace($string":""%3A")
    
$string StringReplace($string";""%3B")
    
$string StringReplace($string"#""%23")
    
$string StringReplace($string"~""%7E")
    
$string StringReplace($string"²""%C2%B2")
    
$string StringReplace($string"³""%C2%B3")
    
$string StringReplace($string"<""%3C")
    
$string StringReplace($string">""%3E")
    
$string StringReplace($string"|""%7C")
    
$string StringReplace($string"^""%5E")
    
$string StringReplace($string"°""%C2%B0")
    
$string StringReplace($string"´""%C2%B4")
    
$string StringReplace($string"@""%40")
    
$string StringReplace($string"€""%E2%82%AC")
    Return 
$string
EndFunc   
;==>Change 
Bei mir hat alles wunderbar geklappt.
Ich hoffe bei euch auch.

-------------------------------------------------------------------------------------------------
Kapitel IV : Packetbots
9. Anfertigen eines Botes für ein Browsergame mit erhöhtem Anti-Bot-Schutz

Wir haben ja davor schon gelernt wie man einfache Bots macht, aber dieses mal beschäftigen wir uns mit besonderen Browsergames, nämlich mit denen, die jedemenge Zeugs ins Browsergame eingebaut haben nur um es uns schwerer zu machen, aber das schreckt uns natürlich nicht ab.


Wir nehmen dieses mal Gladiatus als Ziel.
Seite : www. g l a d i a t u s.de (natürlich ohne Leerzeichen)

Wie es scheint hat Epvpers mir automatisch überall Sternchen hingemacht...
Ihr müsst dann selbst ergänzen, überall wo ************* steht, müsste
g l a d i a t u s (natürlich ohne Leerzeichen) stehen.

Zu allererst brauchen wir wieder Benutzername, Passwort und Server.
PHP Code:
$name="Test"
$password="12345"
$server=

So jetzt wollen wir aber auch, dass Sonderzeichen so umgewandelt werden,
dass der Server versteht welchen Benutzernamen und welches Passwort wir meinen, also benutzen wir die Funktion Change(...)

PHP Code:
$name="Test"
$password="12345"
$server=2

$password
=Change($password)
$name=Change($name)

Func Change($string)
    
$string StringReplace($string"%""%25")
        
$string StringReplace($string"†""%E2%80%A0")
    
$string StringReplace($string"ä""%C3%A4")
    
$string StringReplace($string"ö""%C3%B6")
    
$string StringReplace($string"ü""%C3%BC")
    
$string StringReplace($string"!""%21")
    
$string StringReplace($string'"'"%22")
    
$string StringReplace($string"§""%C2%A7")
    
$string StringReplace($string"$""%24")
    
$string StringReplace($string"&""%26")
    
$string StringReplace($string"/""%2F")
    
$string StringReplace($string"+""%2B")
    
$string StringReplace($string" ""+")
    
$string StringReplace($string"(""%28")
    
$string StringReplace($string")""%29")
    
$string StringReplace($string"=""%3D")
    
$string StringReplace($string"?""%3F")
    
$string StringReplace($string"[""%5B")
    
$string StringReplace($string"]""%5D")
    
$string StringReplace($string"{""%7B")
    
$string StringReplace($string"}""%7D")
    
$string StringReplace($string"ß""%C3%9F")
    
$string StringReplace($string",""%2C")
    
$string StringReplace($string":""%3A")
    
$string StringReplace($string";""%3B")
    
$string StringReplace($string"#""%23")
    
$string StringReplace($string"~""%7E")
    
$string StringReplace($string"²""%C2%B2")
    
$string StringReplace($string"³""%C2%B3")
    
$string StringReplace($string"<""%3C")
    
$string StringReplace($string">""%3E")
    
$string StringReplace($string"|""%7C")
    
$string StringReplace($string"^""%5E")
    
$string StringReplace($string"°""%C2%B0")
    
$string StringReplace($string"´""%C2%B4")
    
$string StringReplace($string"@""%40")
    
$string StringReplace($string"€""%E2%82%AC")
    Return 
$string
EndFunc   
;==>Change 
Im Grunde ist es immer das selbe Spiel.
Wir starten also wieder Live Http Headers und scannen unser LogIn-Packet,
bei mir sieht es so aus :
Code:
POST /game/index.php?mod=login HTTP/1.1
Host: s3.*************
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://s3.*************/game/index.php?mod=login
Cookie: Gladiatus=115628%3B011676b540cf92867eacc7ff96fe086e; __utma=165261033.1359272860.1266418538.1266418538.1266418538.1; __utmb=165261033.4.10.1266418538; __utmc=165261033; __utmz=165261033.1266418538.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=116557700.1179734973.1266418543.1266418543.1266418543.1; __utmb=116557700.8.10.1266418543; __utmc=116557700; __utmz=116557700.1266418543.1.1.utmcsr=*************|utmccn=(referral)|utmcmd=referral|utmcct=/game/index.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

user=Test&pass=12345
Was zuerst auffällt sind die Cookies :
Code:
Gladiatus=115628%3B011676b540cf92867eacc7ff96fe086e; 
__utma=165261033.121308203.1266397901.1266397901.1266397901.1; 
__utmb=165261033.4.10.1266397901; 
__utmc=165261033; 
__utmz=165261033.1266397901.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); 
__utma=116557700.1499034904.1266398079.1266398079.1266398079.1; 
__utmb=116557700.21.10.1266398079; 
__utmc=116557700; 
__utmz=116557700.1266398079.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Die Cookies __utma usw. liefern den Server gewisse Informationen
über das Packet, beispielsweise wann es abgeschickt wird, wie
oft man diese Seite schon besucht hat usw.
Die Packets erfüllen ihren Zweck aber auch ohne diese Cookies.

Wir brauchen also nur das :
Code:
Gladiatus=115628%3B011676b540cf92867eacc7ff96fe086e;
Eigentlich brauchen wir diesen Cookie fürs Einloggen auch nicht zwingend,
denn wenn wir diesen Cookie nicht mitschicken, denkt der Server,
dass wir den Cookie gelöscht haben.
Deshalb schickt uns der Server dann den Cookie und erleichtert uns somit die Arbeit.

Anschliesend wollen wir die Ip herausfinden :
PHP Code:
TCPStartup()
$ip TCPNameToIP("s"&$server&".*************")
TCPShutdown() 
Nachdem wir die Ip-Adresse haben, schicken wir unser LogIn-Packet ab.
PHP Code:
$post="user="&$name&"&pass="&$password
$source
=TCPRequest($ip,"s"&$server&".*************"'/game/index.php?mod=login',$post)
$cookies=GetCookies($source
Nachdem wir uns eingeloggt haben, möchten wir eine Expedition machen,
also benutzen wir wieder Live Http headers dafür.

Das habe ich bekommen :
Code:
GET /game/ajax/doExpedition.php?loc=1&d=1&a=1266530558647 HTTP/1.1
Host: s1.*************
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://s1.*************/game/index.php?mod=location&loc=1&sh=12baf1c83577bedcf41c40540c41df99
Cookie: Gladiatus=116454%3B016b101ea69105a1eeb0dc989674261c; __utma=165261033.65925846.1266530412.1266530412.1266530412.1; __utmb=165261033.2.10.1266530412; __utmc=165261033; __utmz=165261033.1266530412.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=114460677.741455675.1266530414.1266530414.1266530414.1; __utmb=114460677.8.10.1266530414; __utmc=114460677; __utmz=114460677.1266530414.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Was wir herausfinden müssen, ist was das d, a usw. in diesem Packet bedeutet.
Wir schauen also mal wie und wann sich das verändert. Wir machen also erneut eine Expedition, nur diesesmal an einem anderem Ort.
Ich wähle wieder die 10min Expedition :
Code:
/game/ajax/doExpedition.php?loc=3&d=1&a=1266530568657
Wie es ausschaut legt loc die Location fest, es scheint, dass
die Orte (Nebelgebirge usw.) von 1 anfangen durchnummeriert sind.
d hat sich nicht verändert.
a hat sich verändert, aber ein wirklicher
Zusammenhang lässt sich nicht erkennen.
Also machen wir wieder Live Http Headers an und nehmen dieses mal die 20min Expedition.
Code:
/game/ajax/doExpedition.php?loc=3&d=2&a=1266530568762
Wie es scheint, ist d die länge der Expedition (also 10, 20 oder 30 min).
a ist irgendetwas anderes, wir können aber einiges ganz sicher über das a aussagen :

1. Es ist kein Md5-Hash (, da immer 32 Zeichen lang)
2. Es hat höchstwahrscheinlich nichts mit unserem Benutzernamen oder Passwort zu tun,
denn diese werden fast immer in Cookies gespiechert.
3. Vermutlich eine Art-Bot-Schutzmaßnahmen, also muss es irgendetwas
mit der Zeit, den Mauskoordinaten oder ähnlichem zu tun haben.

Wir gehen einfach mal in den Quelltext und suchen nach irgendein Stück
Javascript, was uns weiter helfen könnte. Recht viel Javascript sieht man auf den ersten
Blick nicht, nur ein paar unwichtige Dinge von wegen Tracker und einen Timer.

Aber nach ein bisschen Suchen, findet man etwas, was intressant ausschaut.
PHP Code:
<script type="text/javascript" src="js/expedition.js?v0.5.7"></script> 
Wir drücken also mal auf js/expedition.js?v0.5.7 und schauen was wir zu sehen
bekommen.
Ich sehe das :
Code:
function finishExpedition(loc)
{
	sendRequest('ajax/finishExpedition.php?loc=' + loc + '&a='+ new Date().getTime());
}

function buyexpedition(loc)
{
	sendRequest('ajax/doExpedition.php?loc=' + loc + '&buy=1&a='+ new Date().getTime());
}

function buyanalyze(loc)
{
	sendRequest('ajax/doAnalyze.php?loc=' + loc + '&buy=1&a='+ new Date().getTime());
}

function startExpedition(loc, type)
{
	sendRequest('ajax/doExpedition.php?loc=' + loc + '&d=' + type + '&a='+ new Date().getTime());
}

function startAnalyze(loc)
{
	sendRequest('ajax/doAnalyze.php?loc=' + loc + '&a='+ new Date().getTime());
}
Da sehen wir sogar wie das Request aufgebaut ist.
Code:
sendRequest('ajax/doExpedition.php?loc=' + loc + '&d=' + type + '&a='+ new Date().getTime());
Mit unseren Vermutungen hatten wir also Recht, loc ist die location,
d ist der Typ (also wie lange Expedition gemacht werden soll) und
a ist new Date().getTime(). Das ist ein TimeStamp und entsprich in AutoIT dem hier :
PHP Code:
TimerInit() 
So das scheint also eine Botschutzmaßnahme zu sein. Wenn
man die Packets unsauber analysiert, schickt der Bot immer den
selben TimeStamp ab und somit liegt es dem Server nahe, dass
ein Bot benutzt wird, denn Firefox macht das normalerweise nie falsch.

Unser Code schaut mit dem richtigen Request in etwa so aus :
PHP Code:
#include<String.au3>
$name="Test"
$password="12345"
$server=3
$location
=1
$type
=1

TCPStartup
()
$ip TCPNameToIP("s"&$server&".*************")
TCPShutdown()

$post='user='&Change($name)&'&pass='&Change($password)
$source=TCPRequest($ip,"s"&$server&".*************"'/game/index.php?mod=login',$post)
$cookies=GetCookies($source)
$source=TCPRequest($ip,"s"&$server&".*************"'/game/ajax/doExpedition.php?loc='&$location&'&d='&$type&'&a='&TimerInit(),"",$cookies)
MsgBox(0,"test",$source)


Func GetCookies($sQuellcode)
    
Local $sCookies$i$aCookies
    $sCookies 
''
    
$aCookies _StringBetween($sQuellcode,'Set-Cookie: ',';',1)
    For 
$i=0 To UBound($aCookies)-1
        $sCookies 
&= $aCookies[$i]&';'
    
Next
    
Return $sCookies
EndFunc

Func TCPRequest
($sIp$sHost$sSeite ""$sPost ''$sCookies ''$sReferer ''$iMaxTime 10000)
    
Local $sPacket$iSocket$iTimer

    
If $sPost '' Then
        $sPacket 
=    'GET /' $sSeite ' HTTP/1.1' & @CRLF
    
Else
        
$sPacket =    'POST /' $sSeite ' HTTP/1.1' & @CRLF
    
EndIf
    
$sPacket &=    'Host: ' $sHost & @CRLF _
                
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)' & @CRLF _
                
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' & @CRLF _
                
'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' & @CRLF _
                
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' & @CRLF _
                
'Keep-Alive: 300' & @CRLF _
                
'Content-Type: application/x-www-form-urlencoded' & @CRLF _
                
'Connection: keep-alive' & @CRLF
    
If $sReferer <> '' Then
        $sPacket 
&= 'Referer: '&$sReferer & @CRLF
    
EndIf
    If 
$sCookies <> '' Then
        $sPacket 
&= 'Cookie: ' $sCookies & @CRLF
    
EndIf
    If 
$sPost <> '' Then
        $sPacket 
&= 'Content-Length: ' StringLen($sPost) & @CRLF
    
EndIf
    
$sPacket &= @CRLF
    
If $sPost <> '' Then
        $sPacket 
&= $sPost
    
EndIf

    
TCPStartup()
    If @
error Then Return SetError(1,0,"")
    
$iSocket TCPConnect($sIp80)
    If @
error Then Return SetError(2,0,"")
    
TCPSend($iSocket$sPacket)
    If @
error Then Return SetError(3,0,"")
    
$iTimer TimerInit()
    Do
        
$sRecv TCPRecv($iSocket1024)
        If 
TimerDiff($iTimer) > $iMaxTime Then Return SetError(4,0,"")
    
Until $sRecv <> ""
    
Do
        
$sRecv &= TCPRecv($iSocket1024)
    
Until @error OR StringInStr($sRecv'</html>')
    
TCPCloseSocket($iSocket)
    
TCPShutdown()
    Return 
$sRecv
EndFunc


Func Change
($string)
    
$string StringReplace($string"%""%25")
        
$string StringReplace($string"†""%E2%80%A0")
    
$string StringReplace($string"ä""%C3%A4")
    
$string StringReplace($string"ö""%C3%B6")
    
$string StringReplace($string"ü""%C3%BC")
    
$string StringReplace($string"!""%21")
    
$string StringReplace($string'"'"%22")
    
$string StringReplace($string"§""%C2%A7")
    
$string StringReplace($string"$""%24")
    
$string StringReplace($string"&""%26")
    
$string StringReplace($string"/""%2F")
    
$string StringReplace($string"+""%2B")
    
$string StringReplace($string" ""+")
    
$string StringReplace($string"(""%28")
    
$string StringReplace($string")""%29")
    
$string StringReplace($string"=""%3D")
    
$string StringReplace($string"?""%3F")
    
$string StringReplace($string"[""%5B")
    
$string StringReplace($string"]""%5D")
    
$string StringReplace($string"{""%7B")
    
$string StringReplace($string"}""%7D")
    
$string StringReplace($string"ß""%C3%9F")
    
$string StringReplace($string",""%2C")
    
$string StringReplace($string":""%3A")
    
$string StringReplace($string";""%3B")
    
$string StringReplace($string"#""%23")
    
$string StringReplace($string"~""%7E")
    
$string StringReplace($string"²""%C2%B2")
    
$string StringReplace($string"³""%C2%B3")
    
$string StringReplace($string"<""%3C")
    
$string StringReplace($string">""%3E")
    
$string StringReplace($string"|""%7C")
    
$string StringReplace($string"^""%5E")
    
$string StringReplace($string"°""%C2%B0")
    
$string StringReplace($string"´""%C2%B4")
    
$string StringReplace($string"@""%40")
    
$string StringReplace($string"€""%E2%82%AC")
    Return 
$string
EndFunc   
;==>Change 
Wenn wir das jetzt starten, bekommen wir eine ziehmlich kurze Antwort, das
ist recht ungewöhnlich. Wir sollten also mal schauen ob alles
glatt gelaufen ist und tatsächlich, es hat alles geklappt (zumindest bei mir).

Als nächstes wollen wir in der Arena kämpfen (erst ab level 2 verfügbar).
Wir machen also das selbe wie immer starten Live Http Headers und klicken auf "Arena", schauen uns das Packet an und müssen feststellen, dass
wir noch etwas brauchen, nämlich den Wert von sh.

Packet :
Code:
GET /game/index.php?mod=arena&sh=80a7970f8506c6fc94aa3988dc94f3fd HTTP/1.1
Host: s1.*************
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://s1.*************/game/index.php?mod=arena&sh=80a7970f8506c6fc94aa3988dc94f3fd
Cookie: Gladiatus=116454%3B01b366110feeb33c00d4d2e7476f1eb4; __utma=114460677.657830117.1266762405.1266762405.1266762405.1; __utmb=114460677.5.10.1266762405; __utmc=114460677; __utmz=114460677.1266762405.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Sh heißt höchstwahrscheinlich Sessionhash.
D.h. dieser ändert sich nur wenn wir uns ausloggen, nach einen kleinen
Test, sehen wir, dass er sich wirklich nur ändert wenn wir uns ausloggen.
Wir brauchen also den Hash, da wir ihn nicht berechnen lassen können, müssen wir schauen ob wir im Quelltext etwas finden.
Also starten wir unseren Bot und schauen was wir vom Server nach unseren Login als Antwort bekommen.

Ich haben den Sessionhash sehr oft im Quelltext gefunden.
Diese Stelle habe ich mir rausgesucht :
PHP Code:
<class = "menuitem_aktive" href="http://*************/game/index.php?mod=login&sh=987eaa9d09b2b840e0766a7c72c0a91a" title="Login" target="_self">Login</a
Da Ich aber auf Nummer sicher gehen will, nehmen ich noch eine zweite Stelle her von dem der Sessionhash ausgelesen werden soll.

PHP Code:
<meta http-equiv="refresh" content="0; URL=index.php?mod=overview&sh=987eaa9d09b2b840e0766a7c72c0a91a&.................. 
Unser Skript (getCookie usw. habe ich weggelassen) :
PHP Code:
#include<String.au3>
$name="Loler22"
$password="12345"
$server=1
$location
=1
$type
=1
$cookies
=""
$sh=""

TCPStartup()
$ip TCPNameToIP("s"&$server&".*************")
TCPShutdown()

LogIn()

Func LogIn()
$post='user='&Change($name)&'&pass='&Change($password)
$source=TCPRequest($ip,"s"&$server&".*************"'/game/index.php?mod=login',$post)
$cookies=GetCookies($source)
$sh=_StringBetween($source,"mod=login&sh=",'"')
If 
IsArray($sh)<>1 Then
$sh
=_StringBetween($source,"overview&sh=",'&')
EndIf
EndFunc

Func Expedition
()
$source=TCPRequest($ip,"s"&$server&".*************"'/game/ajax/doExpedition.php?loc='&$location&'&d='&$type&'&a='&TimerInit(),"",$cookies)
EndFunc

Func Kampf
()
$source=TCPRequest($ip,"s"&$server&".*************","/game/index.php?mod=arena&sh="&$sh[0],"",$cookies)
EndFunc 
Wir starten wieder Live Http Headers und greifen jemanden an.
Diesesmal brauchen wir a (was wir ja bereits kennen) und did.
Wir gehen also zurück zur Arena schauen uns den Quelltext an, öffnen
Live http Headers und schauen dann
wo did im Quelltext den selben Wert hat,
wie im Packet. Wenn wir das haben, dann lassen wir
es am besten mit _Stringbetween(..)
auslesen und fügen es in unser Skript ein.
Wenn man genau hinschaut und ein bisschen nachdenkt, fällt auf,dass
es noch mehr solche Zahlen gibt.
Diese Zahlen stehen immer vor den Namen der Feinde, sie sind also
ziehmlich sicher eine GegnerId, damit der Server weiß welcher Gegner
angegriffen werden soll.
In unsere Skript wollen wir, dass alle 5 Gegner
einmal angegriffen werden.
Zusätzlich wollen wir, dass Expeditionen nur gemacht werden, wenn
sie auch gemacht werden können.
Mein Code schaut so aus :



-------------------------------------------------------------------------------------------------

Wenn ihr Fragen habt oder etwas nicht verstanden habt, dann sagt bitte bescheid, vielleicht geht es Anderen auch noch so und dann kann ich es vielleicht so erklären, dass man es besser versteht.

Hoffentlich konnte euch dieses Tutorial helfen.
Shadow992 is offline  
Thanks
325 Users
Old 02/13/2010, 11:29   #2

 
Reextion's Avatar
 
elite*gold: 407
Join Date: May 2009
Posts: 1,574
Received Thanks: 728
Edit ...^^
Reextion is offline  
Old 02/13/2010, 11:34   #3
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
Quote:
Originally Posted by Reextion View Post
Schönes Tut =) Hattest du ja schon angekündigt. Mir hats geholfen, hab jetzt dein Script verstanden.. =D Trotzdem ist es schwer komplett auf ne neue Sprache umzusteigen, ich bleib jetzt bei Vb ... Das kann ich am besten >.< Sieht grad so aus als wenn du das Tut nur für mich geschrieben hast xD Noch kein Thanks und keine Antwort ausser meine^^ =P

Sehr schön..

Cu ReExtion
Ich habe es nicht nur für dich geschrieben .
Ich hatte schon länger mit dem gedanken gespielt ein Tut zu machen und
du hast mir halt dann entgültig den Stoß gegeben

Und selbst wenn es keiner mehr liest außer du , waren die Anstrengungen nicht umsonst
Shadow992 is offline  
Thanks
36 Users
Old 02/13/2010, 12:05   #4

 
Reextion's Avatar
 
elite*gold: 407
Join Date: May 2009
Posts: 1,574
Received Thanks: 728
Quote:
Originally Posted by Shadow992 View Post
Ich habe es nicht nur für dich geschrieben .
Ich hatte schon länger mit dem gedanken gespielt ein Tut zu machen und
du hast mir halt dann entgültig den Stoß gegeben

Und selbst wenn es keiner mehr liest außer du , waren die Anstrengungen nicht umsonst

huhu, ich hab auch nicht gesagt das du es nur für mich geschriebne hast, nur gerade im Moment sah es so aus, weil kein andere bis jetzt den Dankebutton gedrückt oder ein Kommentar geschrieben hat =P
Reextion is offline  
Thanks
1 User
Old 02/13/2010, 12:57   #5
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
Quote:
Originally Posted by Reextion View Post
huhu, ich hab auch nicht gesagt das du es nur für mich geschriebne hast, nur gerade im Moment sah es so aus, weil kein andere bis jetzt den Dankebutton gedrückt oder ein Kommentar geschrieben hat =P


PS:Achja xD Magst du mal bitte in meinem Theard vorbeischauen? im Epvpcoders forum xD Da steht was von Hilfe browser bot. Habe ein kleines Problem xD
Ja das stimmt , aber du wirst sehen irgendwann werden es mehr angeschaut bzw ein Thanks gegeben haben .

P.S.
Tut mir leid ich kann dir da leider auch nicht helfen ...
Shadow992 is offline  
Thanks
19 Users
Old 02/14/2010, 14:15   #6
 
elite*gold: 0
Join Date: Jan 2010
Posts: 2
Received Thanks: 0
hoha. das is sehr nützlich.
sir_natun is offline  
Old 02/14/2010, 16:19   #7
 
elite*gold: 0
Join Date: Dec 2009
Posts: 12
Received Thanks: 0
Das script macht nixx außer IE auf und dann ogame in ne neue registerkarte von nem anderem internet xplorer fenster dann passiert nichts..
lionkidd is offline  
Old 02/14/2010, 16:22   #8
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
Quote:
Originally Posted by lionkidd View Post
ick kapier nur bahnhof
Dann solltest du dich vielleicht etwas mehr mit AutoIT und Html bzw. Javascript beschäftigen .
Shadow992 is offline  
Thanks
15 Users
Old 02/14/2010, 16:50   #9
 
elite*gold: 0
Join Date: Dec 2009
Posts: 12
Received Thanks: 0
Quote:
Originally Posted by Shadow992 View Post
Dann solltest du dich vielleicht etwas mehr mit AutoIT und Html bzw. Javascript beschäftigen .
hab dein weiter führendes und das standart ding von remus gelesen naja bei html.net html + css tu gelesen und dann die java links von deinem tut gelesen und verstanden aber bei mir passier da nixx wenn ich das script starte
lionkidd is offline  
Old 02/14/2010, 16:57   #10
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
Quote:
Originally Posted by lionkidd View Post
hab dein weiter führendes und das standart ding von remus gelesen naja bei html.net html + css tu gelesen und dann die java links von deinem tut gelesen und verstanden aber bei mir passier da nixx wenn ich das script starte
Das ist doch klar du sollst ja auch nicht Copy&Paste machen , sondern dein "eigenes" Skript machen , meins bietet nur eine Art Grundgerüst , aber die Details ,w ie Planet usw. musst du selber machen genauso wie bei dir die Session nicht umbedingt zwischen session= und &lgn sein muss ...

Du kannst dich zwar nach meinen Skript richten , aber vieles musst du selber verbessern bzw. hinzufügen .
Shadow992 is offline  
Thanks
16 Users
Old 02/14/2010, 17:01   #11
 
elite*gold: 0
Join Date: Dec 2009
Posts: 12
Received Thanks: 0
ich wollte nur sehen ob das ding funktioniert habe immer das prob gehabt das das script nix mehr macht allerdings nur ie scripts zb loginbot für Darkorbit da is das gleiche passiert
€: geht jetz alles sicherheits optionen aus !!
lionkidd is offline  
Old 02/14/2010, 18:34   #12
 
elite*gold: 20
Join Date: Feb 2007
Posts: 3,080
Received Thanks: 4,294
find ich sehr gut! packetbots sind wohl fast das letzte segment womit ich mich noch nicht mit autoit beschäftigt habe. hoffe der teil wird noch weiter ausgebaut.
kknb is offline  
Old 02/14/2010, 19:03   #13
 
elite*gold: 520
Join Date: Feb 2010
Posts: 754
Received Thanks: 233
Vielen Dank
.J0k3r is offline  
Old 02/14/2010, 21:54   #14
 
elite*gold: 20
Join Date: Feb 2007
Posts: 3,080
Received Thanks: 4,294
hm habe das eben mal soweit ausprobiert und dazu auch ogame zum testen genommen.
doch sobal ich im spiel auf gebäude bauen klicke bekomme ich packete mit denen ich nichts wirklich anfangen kann.

zusätzlich wollte ich noch fragen ob es so möglich ist bauzeiten, restbauzeiten, materialien usw usw auszulesen.

vielleicht bist du so nett und hilfst mir kurz weiter

kknb is offline  
Old 02/14/2010, 22:33   #15
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,876
Quote:
Originally Posted by kknb View Post
hm habe das eben mal soweit ausprobiert und dazu auch ogame zum testen genommen.
doch sobal ich im spiel auf gebäude bauen klicke bekomme ich packete mit denen ich nichts wirklich anfangen kann.

zusätzlich wollte ich noch fragen ob es so möglich ist bauzeiten, restbauzeiten, materialien usw usw auszulesen.

vielleicht bist du so nett und hilfst mir kurz weiter

Das sind die neuen Server , diese Packets sind etwas komplizierter aufgebaut , als die Alten . Probiers mit Uni 1-40 , da sollte alles ohne Probleme laufen .

Damit der Bot trotzdem auf Uni78 läuft , musst du aus dem Quelltext die verschiedenen Werte auslesen und dann in das Packet packen ( das wird meistens etwas umfangreicher) . Wie das genau funktioniert wirst du spätestens bei Punkt 10 erfahren

Materialien kann man ganz leicht auslesen bspw. :
PHP Code:
_Stringbetween($source,"Metall","</b>") ; du musst selber schauen was bei dir hin muss 
Die Restzeit wird schwerer , da sie per Javascript angeziegt wird , aber man kann sie zumindest annähernd bestimmen .
Beispielsweise so :
PHP Code:
$zeit=_Stringbetween($source,"Bauzeit","s")&"s"
$zeit[0]=Stringreplace($zeit[0],"h","*60*60*1000+")
$zeit[0]=Stringreplace($zeit[0],"m","*60*1000+")
$zeit[0]=Stringreplace($zeit[0],"s","*1000")
$MsekZeit=Execute($zeit[0])

$timer=TimerInit()

;do 
something

If Timerdiff($timer) > $MsekZeit+5000 5 sek deswegen damit man ganz sicher sein kann dass es erst wieder gebaut wird wenn das gebäude fertig ist
baue das nächste Gebäude
endif 
Du musst hauptsächlich mit _Stringbetween(...) arbeiten , denn du bekommst vom Server immer den Quelltext als Antwort , also siehst du wenn du dir im Browser den Quelltext anschaust und
im Bot (normalerweise) immer das selbe .
Shadow992 is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Browsergamebots legal?
05/19/2010 - General Coding - 12 Replies
Hallo, ich habe hier im Forum schon öfters gesehen, wie mitglieder bots (für browsergames) gepostet haben und nach einiger zeit wurden deren themen gelöscht/geschlössen, weil sie angeblich urherberrechtsverletzung begangen haben. http://www.elitepvpers.com/forum/browsergames/5237 95-myfreefarm-bot.html Ich habe schon sehr viele google seiten durchwälzt und keine antwort auf meine fragen gefunden, deswegen stelle ich sie hier mit der hoffung eine antwort zu finden. "Ab wann ist ein...
AutoIt Tutorial
01/01/2008 - Dekaron - 2 Replies
Hey, smokedoo or someone out there who created bot and stuff like that, can you please post up a tutorial or vid on how to make at least the most simplest bot out there please. I know there are ppl like me that would just love to know. Thanks!



All times are GMT +2. The time now is 12:31.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.