Browsergame Bot-Programmierung

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich schreibe meine Bots fast immer in Python, weil:

  • die Sprache läuft auf nahezu jeder Plattform

  • es gibt momentan keine andere Sprache, die mit Strings und verschiedenen Kodierungen auch nur annähernd so gut / schnell / effektiv umgehen kann. (Aus Programmierer-Sicht!)

  • Python hat schon alles mit an Bord in der Standardinstallation. (Sowohl reine Sockets, DNS als auch HTTP-Server und -Client, aber auch HTML und robots.txt-Parser, Entity-Decoder, Reguläre Ausdrücke für Binary und Strings, und noch eine Million Sachen mehr.)

  • Python bietet von Hause aus Unterstützung für Threads und Prozesse, sodass du einen Server mit weit mehr als 500 gleichzeitigen Verbindungen vergewaltigen kannst. (Das macht man aber normalerweise nicht, und wenn du schon so viele Verbindungen nutzt, dann verteile die bitte auch auf ebenso viele Server!)

Viele andere Sprachen bieten obige Features auch als Schnittmenge in der Standardbibliothek oder sogar nur mit Drittanbieter-Modulen, aber in der Summe liegt Python hier weit vorn!

Ich möchte dich noch mal darauf hinweisen, dass ich weit über 30 Programmiersprachen beherrsche und in den letzten Jahrzehnten auf zich Plattformen entwickelt habe. Den Hinweis aus dem anderen Kommentar, dass du dich nur auf eine Programmiersprache spezialiseren, und die anderen links liegen lassen sollst, kannst du als Geschwätz von jemandem abhaken, der wohl noch nicht in der Lage war, über den eigenen Tellerrand zu blicken. Solche Leute gibt es leider zu Hauf im Internet, die eigentlich nicht viel können, das dann aber überall empfehlen müssen. :)

Programmiersprachen sind keine "richtigen" Sprachen, enthalten nur wenige Syntaxregeln und ein sehr überschaubares Vokabular. Das komplizierteste dürfte hierbei meistens die Standardbibliothek mit ihren vielen Funktionen / Klassen / Konstanten / Typen sein. Es ist wirklich keine Kunst, mehr als zehn davon "fließend" zu sprechen und auch wirklich regelmäßig anzuwenden. Wenn mir jemand erzählt, dass er schon seit X Jahren programmiert, und sich auf eine oder zwei Programmiersprachen "spezialisiert" hat, denke ich mir immer nur: "Naaajaaaa ..."

Aber ich schweife ab ...

Im Grunde genommen kannst du dein Projekt (einen Browser-Game-Bot) in nahezu jeder Programmiersprache implementieren, aber warumm solltest du Schrauben mit einem Hammer in die Wand dreschen, wenn du einen komfortablen Akku-Schraubendreher zur Hand hast?

Ich rate dir, erst mal für den Anfang eine Sprache zu lernen, und dein Projekt darin zu realisieren. Und wenn du halbwegs sicher darin bist, kannst du dir auch ruhig mal weitere Sprachen angucken!

Wie gesagt, die Stärken von Python im vorliegenden Falle sind das gute String-Handling und eine Standardbibliothek, die keine Wünsche offen lässt. Kannst natürlich auch Java nehmen, und mit StringBuffern oder StringBuildern jonglieren, wenn du ein Maso bist. :)

Wobei (mindestens durch Third-Party-Packages und Bibliotheken) Java und C# (und C++) natürlich auch HTML parsen, eine robots.txt analysieren und mit HTTP-Headern wie Cookies umgehen können, aber warum so kompliziert? :)

Fazit:

Wenn du Python nimmst, brauchst du für einen Browser-Game-Bot weiter nichts! Bei allen anderen Sprachen, benötigst du mit Sicherheit in mindestens einem Punkt Drittanbieter Bibliotheken oder musst in Teilen selber das Rad neu erfinden (was auch eine schöne Übung ist!).

PS: Mein Gutefrage-Bot ist auch in Python geschrieben! :)

PPS: Die meisten Server (vor allem die von dir anvisierten Spiele-Server) erkennen geskriptete Zugriffe, wenn du die Standardfunktionen der meisten Programmbibliotheken benutzt und blocken den Zugriff, bzw. setzen dich auf eine Schwarze Liste! Das ist übrigens auch der Grund, warum z.B. Zugriffe in C# mit "CookieAwareWebClient" oft ins Leere laufen! Am besten du Analysierst die Header (und zwar ALLE Header) mit einem Sniffer wie WireShark, und klonst diese dann in deinem Bot! Das funktioniert eigentlich immer!

Viel Spaß! :)

TeeTier  30.10.2014, 19:19

PS: Falls dein Browsergame in Flash geschrieben ist, kannst du auch einfach die SWF-Datei runterladen, und den Dateiinhalt direkt nach den ersten paar Header-Bytes (16 waren das glaube ich) mit dem zlib-Modul von Python dekomprimieren! (Dieser Schritt geht aber auch mit Java und C# sehr leicht! Stichwort Deflater bzw. DeflateStream!)

Was du dann erhältst, ist die dekomprimierte Flash-Binary, die du mit einem Regulären Ausdruck nach Strings parsen kannst. Oftmals erhält man damit Zugriff auf Schlüssel, Methodennamen oder "geheime" URLs, die einem das Reversing deutlich erleichtern! :)

Ansonsten lerne auf jeden Fall, wie man mit WireShark umgeht! Ohne Wireshark wirst du nicht sehr weit kommen!

0
Tokitari 
Fragesteller
 30.10.2014, 19:30
@TeeTier

Danke für die schnelle und große Hilfe, ich denke ich werde klein anfangen und erstmal ein einfaches BG nehmen wie zum Beispiel Shakes and Fidget (falls dir das was sagt) den kann man ja auch immer weiter ausbauen... erstmal grundunktionen wie zum Beispiel:

Immer Quest machen wenn verfügbar.

Dann später so was einbauen dass der von Gegnern die Gewinnchance berechnet und wenn diese über 50% liegt angreift

Bessere Items kauft und anlegt usw.

Ich werde mich mal mit Phyton auseinandersetzen :)

1
TeeTier  30.10.2014, 19:35
@Tokitari

Also ich kenne deine Browsergames zwar nicht, und beschäftige micht eher mit Sicherheit / Reversing und mehr Low-Level-Sachen, aber das, was du da schreibst klingt so, als wäre es trivial einfach realisierbar.

Ich rechne da mit weit weniger als 100 Zeilen Python-Code. :)

Wie gesagt: Viel Spaß dabei! :)

PS: Perl wäre übrigens auch keine schlechte Wahl! Allerdings ist dabei die Lernkurve für Anfänger steiler ... aber Perl ist auch recht geil, und für dein Vorhaben fast genauso gut geeignet wie Python! Dennoch sehe ich Python hier noch ein Stück weiter vorne. :)

0
Tokitari 
Fragesteller
 30.10.2014, 21:30
@TeeTier

Ich habe mir über die Fritzbox per "Paketmitschnitt" mal ein Wireshark dokument erstellen lassen, also ich habe es schon hinbekommen meine daten (login und passwort) über diese datei wiederzufinden, aber was genau muss ich eigentlich mit Wireshark können? Die "Values" Wie zb Name/Login oder so wissen damit ich die im Bot weiterverwenden kann?

0
TeeTier  30.10.2014, 22:35
@Tokitari

Je nachdem wie paranoid der Betreiber deines Browsergames ist, musst du ebenfalls auch alle (!) anderen Header klonen und darauf achten, dass die Verbindung auch tatsächlich Keep-Alive ist. (Nach Möglichkeit auch die richtige Reihenfolge der Header einhalten, was mit den meisten Standardfunktionen - zugegeben auch unter Python - schwierig ist.)

Wenn jemand auf meine Website zugreift, und im Accept-Encoding Header kein "gzip" zu stehen hat, weiß ich z.B. dass es sich um einen Bot handelt, bei dem der Entwickler zu faul war, die zlib mit einzubinden. Existiert hingegen kein Accept-Language Header, kann man ebenfalls davon ausgehen, dass es ein Bot ist, da die meisten Bibliotheken in der Standardeinstellung diesen Header eben nicht mitsenden, im Gegensatz zu ALLEN aktuellen und veralteten echten Webbrowsern. :)

Viele Leute beschränken sich bei der Bot-Erkennung nur auf User-Agent oder Referer ... genau diese beiden sind aber gerade trivial einfach zu fälschen. Steht in der Anfrage hingegen "Accept: /", dann ist es ein Bot ... den ALLE Browser tragen hier mindesstens "text/html" oder "text/xml" ein ... Nicht so die Standardclients aus Java, C#, C++, Python, etc ...

Außerdem guck dir ruhig mal die Reihenfolge der Requests an, das kann auch wichtig sein! Wenn du z.B. eine JPG-Resource VOR dem Flashgame im SWF-Format lädst, ist das sehr verdächtig.

Naja, da gibt es noch eine Million mehr Sachen, auf die du achten solltest ... das würde hier aber den Rahmen sprengen. Lass einfach mal ein bisschen deine Fantasie spielen! :)

Wenn du vor hast, öfter mal einen Bot zu bauen, oder einen generischen Webcrawler entwickeln möchtest, kann ich dir nur empfehlen, eine eigene HTTP-Client-Bibliothek mit reinen TCP-Sockets zu entwickeln. Dabei hast du dann die absolute Kontrolle über alles was raus geht und rein kommt! :)

0

Zu deinen ProgrammierSprachen ... WTF Java und C# sind inhaltlich das selbe ... beides Programmeirsprachen die Bytecode erzeugen, nur mit ner Vm laufen etc... Java ist etwas älter und bietet vorallem auch Laufzeitumgebungen für Linux und co an während c# "neuer" ist,rasanter entwickelt wird und einige coole features bietet die ich leider in Java vermisse

Lern eine Sprache und die Richtig anstatt 3 irgendwie

JS ist wohl die Sprache die sich für solche Bots am Besten eignet

Tokitari 
Fragesteller
 30.10.2014, 16:57

In so ziemlich jedem Forum wird immer gesagt das man alle etwas können sollte und sich später auf eine spezialisieren sollte. Aber danke für deine Auskunft

1
TeeTier  30.10.2014, 19:12

An deiner Antwort merkt man deutlich, dass du nicht viel Erfahrung mit C#, Java, JavaScript und Programmierung allgemein hast. Ich will da jetzt auch nicht weiter drauf eingehen, guck dir am besten mal meine Antwort an!

Wer tatsächlich nur eine einzige Programmiersprache beherrscht, ist mit Sicherheit nicht professionell, sondern wohl eher ein sogenannter "FachidXot" - wie man solche Leute in Fachkreisen nennt. :)

1
DerNutzer47  30.10.2014, 21:58
@TeeTier

Sehe ich anders ... zumindest als normaler Programmierer spezialisiert man sich auf ein Gebiet (wie zB .Net) und arbeitet dann ausschließlich auf diesen Gebiet - man befasst sich zumeist auch nur mit einen Thema (zB. ASP.Net,Desktopanwendungen,Warenwirtschaftssysteme ...) und nicht mit allen ein bisschen.

Den als normaler Entwickler (in einer Firma) arbeitet man an wenigen wenn nicht sogar nur an einen Projekt und nicht an 100 mit unterschiedlichen Sprachen

1
DerNutzer47  30.10.2014, 22:05
@TeeTier

In was für einer verkorksten Firma muss man den bitteschön arbeiten, die lieber viel Halbwissen als Kompetenz auf seinen Gebiet vroaussetzt ?

natürlich ist etwas wissen rundherum nicht schlecht, braucht man aber als programmier im Alltag eher weniger

0
TeeTier  30.10.2014, 22:47
@DerNutzer47
In was für einer verkorksten Firma muss man den bitteschön arbeiten, die lieber viel Halbwissen als Kompetenz auf seinen Gebiet vroaussetzt ?

Ich rede nicht von viel Halbwissen auf vielen Gebieten, sondern von echtem Fachwissen auf vielen Gebieten.

Ein Softwareentwickler sollte sich nicht schwer damit tun, Neues zu lernen. Im Gegenteil, das gehört zum Beruf ... und wer das nicht tut, der hat die falsche Arbeit gewählt.

Stillstand ist Rückschritt, und - mit Verlaub - bei jemanden, der vorgibt seit vielen Jahren in der Entwicklung tätig zu sein, erwarte ich einfach, dass er einen guten Überblick hat, wozu eben auch eine ganze Reihe an Programmiersprachen zählt.

natürlich ist etwas wissen rundherum nicht schlecht, braucht man aber als programmier im Alltag eher weniger

Ja, so lange bis ein Problem auftritt und du nicht weiter kommst. Während Programmierer A nicht weiter kommt, und seinen Chef anbetteln muss, den Support in Anspruch nehmen zu dürfen (was durchaus mehrere Tage in Anspruch nehmen kann!), skriptet sich Programmierer B schnell eine Lösung und ist pünktlich mit der Arbeit fertig.

Das habe ich GENAU so schon live erlebt! Und genau das ist es, was einen guten von einem schlechten Programmierer unterscheidet.

1
TeeTier  30.10.2014, 23:02
@DerNutzer47
Sehe ich anders ...

Irrelevant wie du das siehst. Erzähl mal Programmieranfängern hier keinen Quatsch, die glauben das am Ende noch!

zumindest als normaler Programmierer spezialisiert man sich auf ein Gebiet (wie zB .Net) und arbeitet dann ausschließlich auf diesen Gebiet ...

Pfff ... jemand der nur .Net kann? Dein Ernst? Solche Leute sind Code-Monkeys, von mir aus auch sehr gute Code-Monkeys, aber keine Programmierer! :)

man befasst sich zumeist auch nur mit einen Thema (zB. ASP.Net,Desktopanwendungen,Warenwirtschaftssysteme ...) und nicht mit allen ein bisschen.

Du machst also dein Leben lang nur immer und immer wieder die gleichen Sachen? Auf Dauer wird das langweilig werden! :)

Und mal ganz im Ernst, wenn jemand es tatsächlich geschafft hat, C# ausreichend gut zu lernen, dann darf man ja wohl erwarten, dass er sich auch noch weitere Sprachen bzw. Wissen über andere Plattformen aneignet.

Das ist genauso, als wenn ein Drittklässler sagt: "Ich kann jetzt ganz hervorragend Rechnen und das reicht mir. Ich werde vermutlich sowieso nie etwas anderes benötigen, also muss ich weder meine Mathekenntnisse vertiefen, noch im Englischunterricht aufpassen. Von wegen, Lernen ist wichtig ... so ein Quatsch."

Ganz ehrlich, was ist das denn bitte für eine Einstellung? Als Programmierer liebt man es neue Dinge zu lernen und kann sich gar nicht genug zusammen reißen, um nicht mal hier und da etwas Unbekanntes auszuprobieren oder seine Nase mal in fremde Themen hineinzustecken ... und meiner persönlichen Erfahrung nach, bleibt man dann auch bei dem ein oder anderen Thema hängen um dies zu vertiefen und u. U. zu professionalisieren.

Du tust so, als ob ein Entwickler-Gehirn mit .Net ausgelastet wäre ... lass dir mal gesagt sein, dass da noch eine Menge Leerlauf drin ist!

Zum Schluss noch eine Bemerkung: Ich bin Chef einer Softwarefirma, und Leute mit deiner Einstellung versuchen sich hier auch manchmal zu bewerben. Das sind dann immer die, die an den simpelsten Aufgaben scheitern, da sie wirklich nur EINE EINZIGE (= ihre persönliche Lieblings-) Sache gut beherrschen, und sonst echt nix!

Das ist so, als wenn ein Bewerber zur Tischlerei geht, als Einstellungstest schnell eine kleine Anrichte zusammenzimmern soll, und das dann mit den Worten "ich habe mich aber auf Türrahmen spezialisiert" ablehnt.

Ehrlich ... solche Leute würde ich nicht einstellen! :)

1
DerNutzer47  31.10.2014, 00:33
@TeeTier
Du tust so, als ob ein Entwickler-Gehirn mit .Net ausgelastet wäre ... lass dir mal gesagt sein, dass da noch eine Menge Leerlauf drin ist!

Hab ich nie behauptet ... ich berichte bloß davon das er später (sofern er programmierer werden will) nur diesen einen Teil verwenden wird - Ende

Ein Wirtschaftinformatiker baut halt sehr oft Warenwirtschaftssysteme und programmiert keine Controller, Ein Gamedevelopper wird auch gewisse bereiche der Informatik nie benutzen usw ...

Zusatzwissen schadet ihn persönlich nicht, wird er aber eben nur selten im Beruf brauchen

Was für ne Firma wechselt den Ständig die Programmiersprache,ihre Frameworks u.ä. ... das ist nicht nur inkosequent sonder auch unglaublich unproduktiv ... die Firmen die ich kenne halten seit Jahren an ihren Frameworsk und deren Programmiersprache fest.

Man ist nicht unbedingt gleich ein Code-Affe nur weil man an nur einen Endprodukt arbeidet.

0
TeeTier  31.10.2014, 10:08
@DerNutzer47
ich berichte bloß davon das er später (sofern er programmierer werden will) nur diesen einen Teil verwenden wird - Ende

Nein, das kommt so gut wie nie vor! Man stößt eher früher als später an seine Grenzen, vor allem wenn man sich beharrlich weigert, über den Tellerrand schauen zu wollen - Ende :)

Ein Wirtschaftinformatiker baut halt sehr oft Warenwirtschaftssysteme und programmiert keine Controller,

Sag ich doch, Code-Monkey! :)

Wer will denn freiwillig für den Rest seines Lebens Warenwirtschaftssysteme programmieren? Und selbst wenn, wird man selbst auf diesem Gebiet irgendwann an seine Grenzen stoßen!

Ein Gamedevelopper wird auch gewisse bereiche der Informatik nie benutzen usw ...

Natürlich! Aber wenn ein Spieleprogrammierer "nur" Python oder "C#" kann, und sich niemals mit C / C++ oder gar Assembler beschäftigt hat, wird er mangels Erfahrung schlechteren Code schreiben, als jemand, der ebenso gut C# beherrscht aber tiefgehende Vorkenntnisse im Low-Level-Bereich hat. Denn letzterer weiß einfach, was C# intern so alles für Schweinereien macht, und findet so auch schneller Performance-Flaschenhälse und dergleichen.

Und aus meiner jahrelangen Erfahrung kann ich dir sagen, dass Leute, die sich mit Assembler und Low-Level Theading bzw. IPC auskennen, DEUTLICH besseren C# oder Java Code schreiben, als diejenigen, die keinen blassen Schimmer von ersteren Themen haben. Letztere sind dann oft selber der Meinung, dass sie sich "außerordentlich gut" in C# und .Net auskennen. (Solche Leute kommen oft direkt von der Uni und halten sich für die absoluten Cracks!) :)

Ganz ehrlich, wenn ich jemanden für ein .Net Projekt brauche, und diese Person kennt sich wirklich "nur" in .Net aus, dann nehme ich lieber jemanden, der schon mal Linux-Treiber entwickelt oder sich mit Reverse-Engineering beschäftigt hat. Denn sobald sich die Anforderungen des Projektes auch nur leicht ändern, ist bei dem .Net-Menschen Sense ... und es dauert Wochen oder eher Monate, bis dieser sich in das eingearbeitet hat, was der Linux-Treiber-Mensch sowieso aus dem Effeff kann.

Wissen in .Net alleine (!) ist nichts (!) womit man sich brüsten sollte! Es zeugt eher von Unwilligkeit, seinen Horizont zu erweitern! :)

Aber die Tatsache, dass du "Wirtschaftsinformatiker" anführst, zeigt schon, dass du und ich unterschiedliche Vorstellungen von einem Programmierer haben. Bei uns arbeitet kein einziger Wirtschaftsinformatiker ... von denen hat es nicht ein einziger durch die Einstellungstests geschafft. ... Naja, die fangen dann halt bei SAP oder der Telekom an ... man sieht ja, was dabei raus kommt. :)

Was für ne Firma wechselt den Ständig die Programmiersprache,ihre Frameworks u.ä. ... das ist nicht nur inkosequent sonder auch unglaublich unproduktiv ...

Von ständigem Wechsel war nie die Rede. Du scheinst nicht zu verstehen, worauf ich hinaus will ... es geht weder um die Firma, noch um die Programmiersprache, noch um irgendwelche Frameworks ... es geht um den Programmierer und dessen Bildung an sich!

Und ja, als .Net Programmierer wirst du aus mehreren Gründen davon profitieren Bash-Skripting zu können ... kannst du dir jetzt vielleicht nicht vorstellen, aber lerne es einfach mal ... und in ein paar Monaten reden wir noch mal drüber!

Man ist nicht unbedingt gleich ein Code-Affe nur weil man an nur einen Endprodukt arbeidet.

Das stimmt natürlich, siehe vorherigen Absatz! Aber wenn man seit 20 Jahren an ein und der selben Software arbeitet und sich zwischendurch weder rechts noch links umschaut, sollte man sich vielleicht mal überlegen, ob da nicht irgendwas festgefahren sein könnte. (Betonung liegt auf "sein könnte"! "Muss" nämlich nicht! Die Wahrscheinlichkeit ist aber exorbitant hoch!)

Merke dir mal eins: Du WIRST von ALLEM profitieren, was du lernst, völlig EGAL womit du normalerweise arbeitest! Das gilt vor allem für den IT-Bereich! Wenn dir das nicht klar ist, dann mangelt es dir an praktischer Erfahrung, und du solltest erst mal noch ein paar Jahre (mindestens 5 bis 10) länger als Programmierer arbeiten!

Schönen Tag noch und danke für die Diskussion! :)

PS: In dem Buch "97 Things Every Programmer Should Know" (Amazon-Link!) finden sich viele alltägliche (und teilweise ausgelutschte) Hinweise für Leute wie dich. Ein Profi wird in diesem Buch nichts neues entdecken, aber ich denke, du solltest es vielleicht ein oder zwei mal lesen, darüber nachdenken und die Konzepte verinnerlichen. In diesem Buch selbst gibt es noch weitere Querverweise zu anderen Büchern, die du dir - sofern Interesse besteht - ebenfalls zu Gemüte führen solltest.

Und ja, dort kommen als Gastautoren auch weltberühmte C#-Cracks zu Worte, die das Erlernen von "Erlang" empfehlen! Denk einfach mal drüber nach, warum die das wohl schreiben! :)

1

Nun was verstehst du unter einen Bot für Browsergames? Geht es um Flashgames? HTML5 Games? Im Falle HTML5 könnte man z.B. einfach Clientseitig im Browser via JavaScript Eingaben tätigen.

Ansonsten gilt das richtige Werkzeug für den Job und das ist immer abhängig vom Ziel. Deins ist hier aber ziemlich schwammig formuliert.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012
Tokitari 
Fragesteller
 30.10.2014, 16:56

Bei diesem Spiel kann man "laufen" das läuft über eine Karte ab wo jedes Feld eine Koordinate hat. Auf jedem Feld kann man auf Monster treffen, und diese per Klick angreifen (Das es Datenbänke für dieses Spiel gibt würde es auch leicht gehen einen Rechner zu erstellen der berechnet ob man überlebt oder nicht) Dann gibt es ein Ort wo man Aufträge annehmen kann z.B. suche in diesem Gebiet nach diesem Gegenstand. Dann müsste man für jeden Auftrag eine Route machen: z.B. Wende den Gegenstand X and um zum ort Y zu gelangen, laufe diese route, sammel alle gegenstände auf, wenn gegenstand Z gefunden wende gegenstand X an um wieder zum Ort zu gelangen wo es die Aufträge gibt.

0