Robot (Informatik): Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 5: Zeile 5:


== Einbinden der Robot-Class ==
== Einbinden der Robot-Class ==
<code>
<code>
  import java.awt.Robot;
  import java.awt.Robot;
</code>
</code>
== Tastatur kontrollieren ==
== Tastatur kontrollieren ==
Die Robot Klasse stellt Zwei Methoden zur Verfügung um die Tastatur zu beeinflussen.
Die Robot Klasse stellt Zwei Methoden zur Verfügung um die Tastatur zu beeinflussen.
Zeile 17: Zeile 17:
=== Beispiele ===
=== Beispiele ===
==== KeyEvent als Parameter ====
==== KeyEvent als Parameter ====
<code>
<code>
  Robo.keyPress(KeyEvent.VK_A);
  Robo.keyPress(KeyEvent.VK_A);
  Robo.keyPress(KeyEvent.VK_A);
  Robo.keyPress(KeyEvent.VK_A);
</code>
</code>


Ausgabe:
Ausgabe:
<code>  
<code>  
  a
  a
</code>
</code>
==== Integer als Parameter ====
==== Integer als Parameter ====
<code>
<code>
  Robo.keyPress(65);
  Robo.keyPress(65);
  Robo.keyPress(65);
  Robo.keyPress(65);
</code>
</code>


Ausgabe:
Ausgabe:
<code>  
<code>  
  a
  a
</code>
</code>
==== Tastenkombination ====
==== Tastenkombination ====
Zuerst wird die Schift-Taste gedrückt gehalten, dann wird A gedrückt gehalten, dann wird Schift losgelassen und schließlich wird die A taste losgelassen.
Zuerst wird die Schift-Taste gedrückt gehalten, dann wird A gedrückt gehalten, dann wird Schift losgelassen und schließlich wird die A taste losgelassen.
<code>
<code>
  Robo.keyPress(KeyEvent.VK_SHIFT);
  Robo.keyPress(KeyEvent.VK_SHIFT);
  Robo.keyPress(KeyEvent.VK_A);
  Robo.keyPress(KeyEvent.VK_A);
  Robo.keyRelease(KeyEvent.VK_SHIFT);
  Robo.keyRelease(KeyEvent.VK_SHIFT);
  Robo.keyRelease(KeyEvent.VK_A);
  Robo.keyRelease(KeyEvent.VK_A);
</code>
</code>
Ausgabe:
Ausgabe:
<code>
<code>
  A
  A
</code>
</code>
== Maus kontrollieren ==
== Maus kontrollieren ==
Die Robot Klasse stellt Drei Methoden zur Verfügung um die Tastatur zu beeinflussen.
Die Robot Klasse stellt Drei Methoden zur Verfügung um die Tastatur zu beeinflussen.
Zeile 62: Zeile 62:
==== Maus bewegen und die rechte Maustaste drücken ====
==== Maus bewegen und die rechte Maustaste drücken ====
Zuerst wird den Mouse Crusor auf den Bildschirm zentriert, und dann wird die linke Maustaste gedrückt und wieder losgelassen
Zuerst wird den Mouse Crusor auf den Bildschirm zentriert, und dann wird die linke Maustaste gedrückt und wieder losgelassen
<code>
<code>
  Robo.mouseMove(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height);
  Robo.mouseMove(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height);
  Robo.mousePress(InputEvent.BUTTON3_DOWN_MASK);
  Robo.mousePress(InputEvent.BUTTON3_DOWN_MASK);
  Robo.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
  Robo.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
</code>
</code>
== Pixel Ansprechen ==
== Pixel Ansprechen ==
Die Bots müssen in der Regel die Pixel analysieren, um z.B. einen Feind zu sehen und auf ihm schießen.<br>
Die Bots müssen in der Regel die Pixel analysieren, um z.B. einen Feind zu sehen und auf ihm schießen.<br>
Zeile 75: Zeile 75:
====Pixel Vergleichen====
====Pixel Vergleichen====
Im folgenden wird einen Pixel auf den Bildschirm mit einen vorgegebnen Pixel verglichen, natrülich kann man den gesamten Bildschirm mit einen Pixel vergleichen, dafür muss man jedoch eine 2x [[Schleife (Informatik)#for-Schleife|for-Schleife]] einbauen.
Im folgenden wird einen Pixel auf den Bildschirm mit einen vorgegebnen Pixel verglichen, natrülich kann man den gesamten Bildschirm mit einen Pixel vergleichen, dafür muss man jedoch eine 2x [[Schleife (Informatik)#for-Schleife|for-Schleife]] einbauen.
<code>
<code>
  Color meinPixel = new Color(0,0,0);
  Color meinPixel = new Color(0,0,0);
  if(meinPixel.equals(Robo.getPixelColor(500,500){
  if(meinPixel.equals(Robo.getPixelColor(500,500){
     //weiterer Programmiercode
     //weiterer Programmiercode
  }
  }
</code>
</code>
====Screenshot erstellen====
====Screenshot erstellen====
Um einen Screenshot zuerstellen, bietet uns die Klasse Robot eine Sinnvolle Methode an.
Um einen Screenshot zuerstellen, bietet uns die Klasse Robot eine Sinnvolle Methode an.
Zeile 95: Zeile 95:
Es wird einen Screenshot ab den Koordinaten (50|100), der 400px breit und 200px hoch ist erstellt und in den BufferedImage img gespeichert.<br>
Es wird einen Screenshot ab den Koordinaten (50|100), der 400px breit und 200px hoch ist erstellt und in den BufferedImage img gespeichert.<br>
dann erstellen wir ein Bild namens screenshot.png und speichern den Screenshot mit Hilfe der write(...) Methode der ImageIO Klasse in der screenshot.png Datei rein.
dann erstellen wir ein Bild namens screenshot.png und speichern den Screenshot mit Hilfe der write(...) Methode der ImageIO Klasse in der screenshot.png Datei rein.
<code>
<code>
  BufferedImage img = Robo.createScreenCapture(new Rectangle(50, 100, 400, 200));
  BufferedImage img = Robo.createScreenCapture(new Rectangle(50, 100, 400, 200));
    try {
try {
      ImageIO.write(img, "png", new File("./screenshot.png"));
    ImageIO.write(img, "png", new File("./screenshot.png"));
    }
}
    catch (IOException e) {
catch (IOException e) {
      e.printStackTrace();
    e.printStackTrace();
    }
}
</code>
</code>


== Warten ==
== Warten ==
Zeile 121: Zeile 121:
Bei den meisten Chatservern ist es so, dass es einen Bot-Blockierer gibt, so schaut der Server wie Schnell der Client seine Nachrichten sendet um gegeben falls eine Nachricht wegen Spam zu blocken,
Bei den meisten Chatservern ist es so, dass es einen Bot-Blockierer gibt, so schaut der Server wie Schnell der Client seine Nachrichten sendet um gegeben falls eine Nachricht wegen Spam zu blocken,
um dies zu verhindern bauen wir eine Verzögerung von etwa 1 Sekunde ein.
um dies zu verhindern bauen wir eine Verzögerung von etwa 1 Sekunde ein.
<code>
<code>
  Robo.keyPress(...);
  Robo.keyPress(...);
  Robo.keyRelease(...);
  Robo.keyRelease(...);
Zeile 128: Zeile 128:
     .
     .
  Robot.delay(1000);
  Robot.delay(1000);
</code>
</code>
Nachdem der Bot die Nachricht getippt hat, wartet er eine Sekunde um Menschlicher zu wirken und um nicht von den Automatischen Bot-Blocker geblockt zuwerden.<br>
Nachdem der Bot die Nachricht getippt hat, wartet er eine Sekunde um Menschlicher zu wirken und um nicht von den Automatischen Bot-Blocker geblockt zuwerden.<br>

Aktuelle Version vom 23. Januar 2022, 18:15 Uhr

Klassendiagram Robot.png

Mithilfe der Robot Klasse aus Java, kann man die sogennanten Bots um einen Aimbot für einen Ballerspiel, einen Farmbot für WoW oder einen Spambot für einen Chat zuprogrammieren. Die Robot Klasse übernimmt die Kontrolle über die Maus und Tastatur, kann Scrrenshots erstellen und kann das Bildschirm nach Pixeln absuchen.

Einbinden der Robot-Class


import java.awt.Robot;

Tastatur kontrollieren

Die Robot Klasse stellt Zwei Methoden zur Verfügung um die Tastatur zu beeinflussen.

  • keyPress(keycode)
  • kyeRelease(keycode)

Die keyPress(keycode) Methode drückt einer bestimmten Taste, dafür muss man der Methode einen Integer wert der Taste oder eine KeyEvent Konstante als Parameter mitgeben.
Die keyRelease(keycode) Methode ist dafür da, einer bestimmten Taste loszulassen.

Beispiele

KeyEvent als Parameter


Robo.keyPress(KeyEvent.VK_A);
Robo.keyPress(KeyEvent.VK_A);

Ausgabe:

 
a

Integer als Parameter


Robo.keyPress(65);
Robo.keyPress(65);

Ausgabe:

 
a

Tastenkombination

Zuerst wird die Schift-Taste gedrückt gehalten, dann wird A gedrückt gehalten, dann wird Schift losgelassen und schließlich wird die A taste losgelassen.


Robo.keyPress(KeyEvent.VK_SHIFT);
Robo.keyPress(KeyEvent.VK_A);
Robo.keyRelease(KeyEvent.VK_SHIFT);
Robo.keyRelease(KeyEvent.VK_A);

Ausgabe:


A

Maus kontrollieren

Die Robot Klasse stellt Drei Methoden zur Verfügung um die Tastatur zu beeinflussen.

  • mouseMove(x,y)
  • mousePress(buttons)
  • mouseRelease(buttons)
  • mouseWheel(wheelAmt)

Die mouseMove(x,y) Methode dient dazu da, um den Mouse Cursor an einer bestimmten stelle zu verschieben.
Die mousePress(buttons) Methode, drückt einer bestimmten Maustaste.
Die mouseRelease(buttons) Methode ist dafür da, einer bestimmten Maustaste loszulassen.
Die mouseWheel(wheelAmt) Methode ist dafür da, um den Mausrad zusteuern (hoch und runter scrollen etc.).

Beispiele

Maus bewegen und die rechte Maustaste drücken

Zuerst wird den Mouse Crusor auf den Bildschirm zentriert, und dann wird die linke Maustaste gedrückt und wieder losgelassen


Robo.mouseMove(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height);
Robo.mousePress(InputEvent.BUTTON3_DOWN_MASK);
Robo.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);

Pixel Ansprechen

Die Bots müssen in der Regel die Pixel analysieren, um z.B. einen Feind zu sehen und auf ihm schießen.
Die Robot Klasse stellt uns ebenfalls eine Methode zur Verfügung die bestimmte Pixel analyisert.

  • getPixelColor(x,y)

Beispiele

Pixel Vergleichen

Im folgenden wird einen Pixel auf den Bildschirm mit einen vorgegebnen Pixel verglichen, natrülich kann man den gesamten Bildschirm mit einen Pixel vergleichen, dafür muss man jedoch eine 2x for-Schleife einbauen.


Color meinPixel = new Color(0,0,0);
if(meinPixel.equals(Robo.getPixelColor(500,500){
   //weiterer Programmiercode
}

Screenshot erstellen

Um einen Screenshot zuerstellen, bietet uns die Klasse Robot eine Sinnvolle Methode an.

  • createScreenCapture(screenRect)

Jedoch ist diese Methode alleine nicht ausreichend, da sie den Screenshot in der Zwischenablage speichert, deswegen benötigen wir die Hilfe von folgenden Klassen:

  • java.awt.Rectangle
  • java.awt.image.BufferedImage
  • java.io.File
  • java.io.IOException
  • javax.imageio.ImageIO

Die Klasse Rectangle deffiniert einen Bereich, der davon einen Screenshot gemacht werden soll. Die Klasse BufferedImage gibt den Screenshot zurück. Die Klasse File erstellt eine leere Datei, wo später das Sreenshot gespeichert wird. Die Klasse ImageIO schreibt den BufferedImage in den erstellten File und so erhalten wir unseren Screenshot. Die Klasse IOException fängt die möglichen Fehlermeldungen ab, die bei den Speichern des Bildes auftreten können.

Hier kommt ein Beispiel: Es wird einen Screenshot ab den Koordinaten (50|100), der 400px breit und 200px hoch ist erstellt und in den BufferedImage img gespeichert.
dann erstellen wir ein Bild namens screenshot.png und speichern den Screenshot mit Hilfe der write(...) Methode der ImageIO Klasse in der screenshot.png Datei rein.


BufferedImage img = Robo.createScreenCapture(new Rectangle(50, 100, 400, 200));
try {
   ImageIO.write(img, "png", new File("./screenshot.png"));
}
catch (IOException e) {
   e.printStackTrace();
}

Warten

Zwischen den jeweiligen Aktionen, sollte man das Programm pausieren, um es dadurch ein bisschen menschlicher zumachen oder um den PC die zeit zulassen, um den Befehl zu ende zuführen.
Die Robot Klasse bietet vier Methoden an, die für diesen vorhaben geeignet sind.

  • delay(ms)
  • setAutoDelay(ms)
  • waitForIdle()
  • setAutoWaitForIdle(isOn)

Die delay(ms) Methode, pausiert das Programm für die angegebenen Zeit in Millisekunden.
Die setAutoDelay(ms) Methode, pausiert das Programm nach jedem Event der durch den Bot ausgeführt wurde (z.B. drücken der Leertaste) für die angegebene Zeit in Millisekunden.
Die waitForIdle() Methode, wartet, bis alle, Ereignisse abgearbeitet sind.
Die setAutoWaitForIdle(isOn) führt nach jedem Event die Methode waitForIdle() aus.

Beispiele

Chatbot

Bei den meisten Chatservern ist es so, dass es einen Bot-Blockierer gibt, so schaut der Server wie Schnell der Client seine Nachrichten sendet um gegeben falls eine Nachricht wegen Spam zu blocken, um dies zu verhindern bauen wir eine Verzögerung von etwa 1 Sekunde ein.


Robo.keyPress(...);
Robo.keyRelease(...);
   .
   .
   .
Robot.delay(1000);

Nachdem der Bot die Nachricht getippt hat, wartet er eine Sekunde um Menschlicher zu wirken und um nicht von den Automatischen Bot-Blocker geblockt zuwerden.