Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 08:51

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

Advertisement



[Tutorial] Browsergame Bots erstellen | Vb.Net

Discussion on [Tutorial] Browsergame Bots erstellen | Vb.Net within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
Jay Niize's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 4,851
Received Thanks: 3,417
Post [Tutorial] Browsergame Bots erstellen | Vb.Net

Hallo e*pvpler,

heute möchte ich euch in einem Tutorial zeigen, wie ihr einen Browsergamebot erstellen könnt. Diese Methode wird nicht bei allen Browsergames klappen, jedoch wird sie bei vielen funktionieren. Als Beispiel nehme ich hier neopets.com.

1. Start - Projekt erstellen/Vorbereitung

Ihr erstellt ein neues Projekt - ich nehme den Namen "BrowsergameTutorial" - und wählt eine normale Windowsanwendung. Natürlich könnte man es auch in einem Konsolenfenster realisieren, aber wir wollen eine nette GUI haben, mit der wir die Bot-User ansprechen. Nachdem ihr eure Form habt, stellt eure Eigenschaften so ein, wie ihr sie standardmäßig einstellt.

Um die Vorbereitungen abzuschließen sollten wir wissen, wie wir uns standardmäßig einloggen. Deshalb benutze ich das Browser-Plugin .
Wir starten also Live HTTP Headers & stellen sicher, dass der Haken bei "Mitschneiden" sitzt. Wir öffnen einen neuen Tab von unserem Game - in meinem Fall neopets.com und loggen uns ein. Wir switchen wieder rüber auf unser LiveHTTPHeaders und haben folgenden Screen :


Uns interessieren diese Zeilen besonders :

Code:
Content-Length: 68
destination=%252Findex.phtml&username=[I]NAME[/I]&password=[I]PASSWORT[/I]
2. Die Klasse httpRequest

Wir wissen also, dass der obige Code gesendet wird. Das werden wir nun auch mit unserem Programm simulieren. Aber wie? Natürlich machen wir das mit einem HttpWebRequest, bzw. -response. Ich werde nicht genau erklären was welcher Code genau macht, darum bitte ich euch darum euch etwas in HttpWebRequest einzulesen. Falls es euch schon bekannt ist, dann könnt ihr gerne weiterlesen.

Wir erstellen also eine neue Klasse, ich nenne sie mal httpRequest. In dieser Klasse werden wir einige Funktionen erstellen, sodass es uns nachher leichter fällt weitere Aktionen auszuführen.

Wir importieren die bereits vorhandenen Namespaces System.IO,System.Text & System.Net. In der Klasse erstellen wir nun ein paar Variablen, um uns das Leben im späteren Verlauf einfacher zu machen. Wir brauchen eine Variable für den WebRequest, eine weitere Variable für den WebResponse um eine Antwort des Servers zu empfangen und eine letzte Variable für die Cookies, welche gesendet als auch empfangen werden. Somit sollte unsere Klasse bisher so aussehen :

PHP Code:
Imports System.IOSystem.TextSystem.Net

Public Class HttpRequest
    Dim request 
As HttpWebRequest    
    Dim cookies 
As New CookieContainer
    Dim response 
As HttpWebResponse

End 
Class 
Nun sollten wir eine Funktion schreiben, mit der wir eine Antwort, also Response, von dem Server bekommen. Diese Funktion soll im ganzen Projekt benutzt werden dürfen, also erstellen wir sie als Public. Der Parameter sollte die URL übergeben, die weiter benutzt wird.
Die vom request.CookieContainer empfangenen Cookies sollen in unserer Variable cookies gespeichert werden. Unsere request Variable erhält den Wert von CType. In der expression des CTypes erstellen wir einen neuen Webrequest mit dem Parameter - der URL. Der Typname des CTypes wird ein HttpWebRequest sein. Das gleiche erstellen wir nun auch für unsere response Variable, mit dem Unterschied, dass wir in der expression einen GetResponse haben & im Typnamen einen HttpWebResponse. Den Response wollen wir natürlich auch zurückgeben, also schreiben wir für den Return einen neuen Streamreader, der die empfangenen Daten ausliest und als String zurückgibt. Somit schaut unsere Funktion ungefähr so aus :

PHP Code:
Public Function ResponseWeb(ByVal url As String) As String
        request 
CType(HttpWebRequest.Create(url), HttpWebRequest)
        
response CType(request.GetResponse(), HttpWebResponse)
        
request.CookieContainer cookies

        
Return New StreamReader(response.GetResponseStream()).ReadToEnd()
    
End Function 
Nun haben wir das gleiche Spielchen nocheinmal, bloß dass wir noch ein Post als String hinterher hängen. Die Variablenzuweisung request = CType(HttpWebRequest.Create(url), HttpWebRequest) und request.CookieContainer = cookies können wir in unserer neuen Funktion oben stehen lassen. Um ein möglichst echten Post zu simulieren benötigen wir viele Infos aus unserem Live HTTP Headers. Oben im Bild seht ihr z.B Referer, User-Agents und Accepted-Language, welche wir alle simulieren wollen. Also fangen wir mit den UserAgents an. Einfach eine Zuweisung mit euren UserAgents als String für request.UserAgents erstellen. Falls ihr eure nicht nehmen wollt könnt ihr euch eine heraussuchen.

Die Methode ist in diesem Fall Post, also -> request.Method = "POST". Der Content-Typ ist bei fast (!) allen Games "application/x-www-form-urlencoded", also nehmen wir auch den mit. Nun brauchen wir die Accept-Language. Aber warte mal - es gibt keine Eigenschaft hierfür. Also müssen wir uns eben einen neuen Header erstellen. Um einen neuen Header hinzuzufügen erstellen wir eine neue Variable als WebHeaderCollection mit dem Wert der Header, also request.Headers. Dieser Variable fügen wir mit Add einen neuen Wert hinzu - in unserem Fall, wie man oben sieht - "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3".

Unsere bisherige Funktion sieht so aus :
PHP Code:
    Public Function GetResponse(ByVal url As StringByVal post As String) As String
        request 
CType(HttpWebRequest.Create(url), HttpWebRequest)
        
request.CookieContainer cookies
        request
.Method "POST"
        
request.UserAgent "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"
        
request.ContentType "application/x-www-form-urlencoded"
        
Dim NeueHeaderColl As WebHeaderCollection request.Headers
        NeueHeaderColl
.Add("Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")

    
End Function 
Wir schauen wieder auf unseren Live Http Header und sehen Content-Lenght. Das sind die Bytes die gesendet werden, also brauchen wir ein ArrayByteals Byte. In das Array schreiben wir den Byte-Wert von unserem post, welchen wir mit der Encoding.Default.GetBytes ermitteln können. Das würde so aussehen :

PHP Code:
        Dim ArrayByte() As Byte Encoding.Default.GetBytes(post)
        
request.ContentLength ArrayByte.Length 
Um den POST letztendlich zu verschicken brauchen wir einen Streamwriter, der es uns ermöglicht unsere Bytes zu versenden. Logisch, was?
In der Write-Funktion schreiben wir für den Buffer unseren ArrayByte, als Offset 0, da wir diesen in diesem Beispiel nicht brauchen & als Count geben wir die Länge unserer Bytes mit ArrayByte.Length an. Zuletzt übergeben wir der Responsevariable - wie oben auch - den Response wert und lesen es - wie oben auch - mit einem StreamReader aus.

Unsere komplette Klasse sieht also so aus :

PHP Code:
Imports System.IOSystem.TextSystem.Net

Public Class HttpRequest
    Dim cookies 
As New CookieContainer
    Dim request 
As HttpWebRequest
    Dim response 
As HttpWebResponse

    
Public Function GetResponse(ByVal url As String) As String
        request 
CType(HttpWebRequest.Create(url), HttpWebRequest)
        
response CType(request.GetResponse(), HttpWebResponse)
        
request.CookieContainer cookies

        
Return New StreamReader(response.GetResponseStream()).ReadToEnd()
    
End Function

    Public Function 
GetResponse(ByVal url As StringByVal post As String) As String
        request 
CType(HttpWebRequest.Create(url), HttpWebRequest)
        
request.CookieContainer cookies
        request
.Method "POST"
        
request.UserAgent "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"
        
request.ContentType "application/x-www-form-urlencoded"
        
Dim NeueHeaderColl As WebHeaderCollection request.Headers
        NeueHeaderColl
.Add("Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")


        
Dim ArrayByte() As Byte Encoding.Default.GetBytes(post)
        
request.ContentLength ArrayByte.Length

        Dim daten 
As Stream request.GetRequestStream()
        
daten.Write(ArrayByte0ArrayByte.Length)

        
response CType(request.GetResponse(), HttpWebResponse)

        Return New 
StreamReader(response.GetResponseStream()).ReadToEnd()

    
End Function
End Class 
3. Der Login

Da wir nun unsere Klasse geschrieben haben können wir uns an den Login machen. Ich habe dafür einen Button & zwei Textboxen erstellt. Einmale eine userBox für den Namen & einmal eine passwortBox für - wer hätte es gedacht - das Passwort. kommen wir nun zum Code. Wie in der httpRequest-Klasse brauchen wir auch hier den Import von System.Text, System.IO & System.Net. Nun widmen wir uns der Sub des Buttons. Dieser soll, wenn die Textbox des Users und die des Passworts beide über 3 Zeichen haben versuchen sich anzumelden.

PHP Code:
If loginBox.Text.Length 3 Then
            MsgBox
("Du hast entweder kein oder zuwenige Zeichen beim Login eingegeben!")
        Else
            If 
pwBox.Text.Length 3 Then
                MsgBox
("Du hast entweder kein oder zuwenige Zeichen beim Passwort eingegeben!")

            Else

                
'hier einloggen
            End If
        End If 
Um es einwenig übersichtlicher zu gestalten füge ich am Anfang eine Variable namens quell als String für den Quelltext ein. Über unserer Sub erstellen wir einen Objektverweis auf unsere Klasse. Ich habe ihn htrequest genannt. Diesen brauchen wir da der Member sonst nicht freigegeben wird.

Nun weisen wir der quell Variable die Funktion GetResponse von unserer Klasse HttpRequest zu. Als ersten Parameter benutzen wir die oberste Zeile unseres Live-HTTP-Headers - login.phtml - und als zweiten Paramter den String, den wir vorhin erforscht haben. Wo unser Name und Passwort steht, hauen wir einfach den Text unserer Textboxen hinein.

Mit dieser Funktion versucht er sich jetzt einzuloggen.

Danach ruft er nocheinmal die Hauptseite auf, da - wenn ich eingeloggt bin - dort etwas steht, was - wenn ich nicht eingeloggt bin - nicht da steht. Das nutzen wir aus und suchen nach dem Wert. Wenn er vorhanden ist sind wir drinnen, wenn nicht - eben nicht. So sieht dann unser Code in der LoginForm aus :

PHP Code:
Public Class Form1
    Dim htrequest 
As HttpRequest
    
Private Sub Button1_Click(sender As System.ObjectAs System.EventArgsHandles Button1.Click
        Dim quell 
As String
        
If userBox.Text.Length 3 Then
            MsgBox
("Du hast entweder kein oder zuwenige Zeichen beim Login eingegeben!")
        Else
            If 
passwortBox.Text.Length 3 Then
                MsgBox
("Du hast entweder kein oder zuwenige Zeichen beim Passwort eingegeben!")

            Else




                
quell htrequest.GetResponse("http://www.neopets.com/login.phtml""destination=%252F&username=" userBox.Text "&password=" passwortBox.Text)
                
quell htrequest.GetResponse("http://www.neopets.com/")
                If 
quell.Contains("Willkommen,"Then
MsgBox
("Yeah wir sind drinnen!")
                Else
                    
MsgBox("lul no. :(")
                
End If

            
End If
        
End If
    
End Sub
End 
Class 
4. Beispiel

Da wir jetzt wissen, wie es funktioniert kann man als Beispiel z.B die Neopunkte abrufen. Wir wechseln mit quell = htrequest.GetResponse("http://www.neopets.com/") auf die Hauptseite und sehen oben "Willkommen,NAME | NP: Neopuntke". Im Quelltext der Seite kann man erkennen, dass sich hinter Neopunkte ein Link ins Inventar verbirgt. Also nehmen wir uns jetzt RegEx zur Hand um den Abschnitt der Neopunkte zu suchen & herauszuschneiden. Ich werde RegEx nicht erklären, es gibt auf e*pvp, sowie auf anderen VB-Foren genug RegEx Tutorials.

Das folgende RegEx-Pattern sucht nach dem Link inventory.phtml und schneidet mit *.? die Neopunkte heraus. Mit sehr unsauberem Substring & Remove entfernen wir sind unnötigen Zeichen und haben unsere Neopunkte:
PHP Code:
         Dim r As Regex = New Regex("<a\sid\=\'npanchor\'\shref\=\""\/inventory\.phtml\""\>.*?</a>")
        Dim m As Match = r.Match(quell)
        Dim cleantxt As String
        If m.Success Then
            Dim g = m.Groups(0)
            cleantxt = g.ToString
            cleantxt = cleantxt.Substring(41)
            cleantxt = cleantxt.Remove(1, 4)
            Label1.Text = cleantxt
        End If 
Mit diesem Bot kann man durch RegEx alles realisieren. Bei dem Spiel Kartoffelzähler können z.B die Bilder aus dem Quelltext gefiltert werden, diese gezählt werden und durch einen weiteren Post an den Server zurückgesendet werden. Dies ist eine Grundlage auf die man sehr viel aufbauen kann.

5. Schlusswort

Ich bedanke mich erst einmal dafür, dass du dir die Mühe gemacht hast diesen Thread hier zu lesen & hoffe dass du etwas gelernt hast. Hast du Fragen oder Verbesserungsvorschläge bitte ich dich, diese in den Thread zu schreiben, sodass ich etwas ausbessern kann - oder die helfen kann.
Viel Spaß beim programmieren. (:

~Greetings
.Zeraki'
Jay Niize is offline  
Thanks
4 Users
Old 10/10/2013, 17:22   #2
 
CallSaul's Avatar
 
elite*gold: 0
Join Date: Oct 2013
Posts: 327
Received Thanks: 65
Hallo!

Ersteinmal, schönes Tutorial.
Struckturierung ist wunderbar gelungen, es mach Spaß es zu lesen.

Allerdings bin ich der Meinung, dass du die einzelnen Befehle etwas näher hättest erleutern können -> eignet sich nur für Leute mit Visual Basic Grundkenntnissen.

Codingstil ist auch i.O.

Alles in allem nett gemacht, und lehrreich.

Gruß, Call Saul
CallSaul is offline  
Old 10/10/2013, 19:15   #3
 
Jay Niize's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 4,851
Received Thanks: 3,417
Hallo CallSaul!

Meiner Meinung nach sollten Leute sowieso schon Grundkenntnisse besitzen, wenn sie den Bereich der Bot-Programmierung anstreben wollen. Und ich persönlich finde, dass wenn man sich das ganze Tutorial mit ein wenig Zeit durchliest, man schon durch den Kontext versteht & lernt wofür die einzelnen Begriffe stehen.

Falls du noch weitere Verbesserungsvorschläge hast, wäre ich dir dankbar. :)

~Grüße
.Zeraki'
Jay Niize is offline  
Old 10/11/2013, 13:41   #4
 
CallSaul's Avatar
 
elite*gold: 0
Join Date: Oct 2013
Posts: 327
Received Thanks: 65
Quote:
Originally Posted by .Zeraki' View Post
Hallo CallSaul!

Meiner Meinung nach sollten Leute sowieso schon Grundkenntnisse besitzen, wenn sie den Bereich der Bot-Programmierung anstreben wollen. Und ich persönlich finde, dass wenn man sich das ganze Tutorial mit ein wenig Zeit durchliest, man schon durch den Kontext versteht & lernt wofür die einzelnen Begriffe stehen.

Falls du noch weitere Verbesserungsvorschläge hast, wäre ich dir dankbar.

~Grüße
.Zeraki'
War nur eine Anmerkung, keine Kritik.

Habe soweit keine Vorschläge mehr, wünsche dir noch viel Erfolg!
CallSaul is offline  
Old 10/25/2013, 16:14   #5
 
elite*gold: 0
Join Date: Sep 2013
Posts: 2
Received Thanks: 0
danke ^ ^
aber ich verstehe nicht ganz
Ich habe auch noch nie ein Spiel gespielt neopets
Kannst du Tutorials für Füllstand, NP, usw.
Ich verstehe es nicht an der dalalam

Dies wurde durch die Video-Tutorials möglich ^ ^
Ich wäre sehr dankbar,
tachian99 is offline  
Old 11/11/2013, 18:29   #6
 
elite*gold: 0
Join Date: Jun 2010
Posts: 90
Received Thanks: 17
Hallo,

habe ein problem...

statt:
Content-Length: 68
destination=%252Findex.phtml&username=NAME&passwor d=PASSWORT

habe ich:
Content-Length: 54
action=login&username=NAME&password=PASSWORT

haste eine lösung für mich ?

inet seite wäre :
dani1414 is offline  
Old 11/12/2013, 09:55   #7
 
elite*gold: 75
The Black Market: 125/0/5
Join Date: Nov 2012
Posts: 2,454
Received Thanks: 321
Quote:
Originally Posted by dani1414 View Post
Hallo,

habe ein problem...

statt:
Content-Length: 68
destination=%252Findex.phtml&username=NAME&passwor d=PASSWORT

habe ich:
Content-Length: 54
action=login&username=NAME&password=PASSWORT

haste eine lösung für mich ?

inet seite wäre :
funktioniert genauso, ist ja nur ein veränderter String wo du abschickst
ҳc3ρ0™ is offline  
Old 11/12/2013, 17:08   #8
 
elite*gold: 0
Join Date: Jun 2010
Posts: 90
Received Thanks: 17
Ok Danke

Hab dann wohl irgendwo anders nen fehler gemacht....
dani1414 is offline  
Reply

Tags
bot erstellen, neopets, tutorial, vb.net, vb.net / c# hack


Similar Threads Similar Threads
[Browsergame Bots & Tools] Alle Browsergame Bots & Tools auf einem Blick
04/12/2014 - Browsergames - 71 Replies
Hallo liebe Community! Da der Thread von AlphaZero schon länger inaktiv geworden ist, erstelle ich einfach mal einen neuen. Das läuft wie folgt ab. Ihr postet einen Bot ein Tool oder was auch immer (sollte schon was mit Browsergames zu tun haben) und ich nehme diese in die Liste mit auf. Sollte ungefähr so aussehen: Name des Tools/Eure persönliche Bewertung des Tools/Link zum Tool (wichtig, müssen elitepvpers.com Links sein!) Adventure Quest World: Bot/Tool | Status | Bewertung |...
[Suche] Tutorial zum erstellen eines Metin2 Bots
05/28/2010 - Metin2 - 15 Replies
Hallo Leutz, ich suche ein Tutorial in dem erklärt wird, wie man einen Bot für ein MMORPG schreibt, speziell für Metin2. Also mit AutoIT kenn ich mich mittlerweile aus, doch weiß ich nicht, wie ich die Scripte von AutoIT in Metin2 zum laufen bringe. Ich hoffe es ist verständlich was ich mein, wenn nicht, nochmal genauer ^^ Ich habe in AutoIT zum Test einen Autopotter gebastelt, ist soweit auch schon fertig, jedoch, wenn ich den jetzt testen will, und Metin2 öffne und den Autpotter...



All times are GMT +1. The time now is 08:51.


Powered by vBulletin®
Copyright ©2000 - 2026, 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 ©2026 elitepvpers All Rights Reserved.