Pyhton/Java Bot Erkennung von Farbe und klicken bei Koordinate?

1 Antwort

In Python kann man PyAutoGUI verwenden:

import pyautogui
import time

def waitAndClickColor(color):
    while True:
        s = pyautogui.screenshot()
        for x in range(s.width):
            for y in range(s.height):
                if s.getpixel((x, y)) == color:
                    pyautogui.click(x, y)
                    return
        time.sleep(0.5)

waitAndClickColor((255, 0, 0)); # suche nach Rot
waitAndClickColor((0, 255, 0)); # suche nach Grün
waitAndClickColor((0, 0, 255)); # suche nach Blau

In der Funktion waitAndClickColor(color) wird die while True-Schleife solange wiederholt, bis die Farbe auf dem Bildschirm gefunden wird. pyautogui.screenshot() erstellt ein Bildschirmfoto. In den beiden for-Schleifen werden alle Pixel durchlaufen. s.getpixel((x, y)) gibt die Farbe des Pixels an den entsprechenden Koordinaten zurück. Falls das Pixel eine bestimmte Farbe hat, wird an der Stelle ein Klick ausgeführt. time.sleep(0.5) verzögert die nächste Schleifenausführung um eine halbe Sekunde.

Wenn nur an einer bestimmten Stelle die Farbe geprüft werden soll, kann man Folgendes schreiben:

import pyautogui
import time

def waitAndClickColor(x, y, color):
    while not pyautogui.pixelMatchesColor(x, y, color):
        time.sleep(0.5)
    pyautogui.click(x, y)

waitAndClickColor(300, 200, (255, 0, 0)); # warte bis rot
waitAndClickColor(200, 300, (0, 255, 0)); # warte bis grün
waitAndClickColor(400, 500, (0, 0, 255)); # warte bis blau

pyautogui.pixelMatchesColor(x, y, color) überprüft, ob das Pixel an der angegebenen Position eine bestimmte Farbe hat. Das Programm wartet, bis die Farbe dort erscheint, und klickt an der Stelle.

Siehe dazu:

Keksss95511 
Fragesteller
 03.10.2023, 22:32
import pyautogui

oberflaeche_x = 360
oberflaeche_y = 797

ziel_x = 1862
ziel_y = 548

pyautogui.PAUSE = 1/70

oberflaeche_screenshot = pyautogui.screenshot(region=(oberflaeche_x, oberflaeche_y, 0, 0))
oberflaeche_farbtextur = oberflaeche_screenshot.getpixel((0, 0))

while True:
    aktueller_screenshot = pyautogui.screenshot(region=(oberflaeche_x, oberflaeche_y, 0, 0))
    aktuelle_farbtextur = aktueller_screenshot.getpixel((0, 0))

    if aktuelle_farbtextur != oberflaeche_farbtextur:
        pyautogui.click(oberflaeche_x, oberflaeche_y)

        pyautogui.sleep(1)  

        pyautogui.moveTo(ziel_x, ziel_y)
        pyautogui.click()

        oberflaeche_screenshot = aktueller_screenshot
        oberflaeche_farbtextur = aktuelle_farbtextur

Ich habe dies, aber es funktioniert nicht. Ich verstehe das andere nicht so.

0
Verelat777  03.10.2023, 23:05
@Keksss95511

Der Fehler liegt hier:

pyautogui.screenshot(region=(oberflaeche_x, oberflaeche_y, 0, 0))

Du hast für die Breite und Höhe des Ausschnitts jeweils 0 angegeben. Um ein einzelnes Pixel auszulesen, musst Du jeweils 1 eingeben.

Dein Code lässt sich auch deutlich verkürzen bzw. vereinfachen:

oberflaeche_farbtextur = pyautogui.pixel(oberflaeche_x, oberflaeche_y)

while True:
    aktuelle_farbtextur = pyautogui.pixel(oberflaeche_x, oberflaeche_y)

    if aktuelle_farbtextur != oberflaeche_farbtextur:
        pyautogui.click(oberflaeche_x, oberflaeche_y)
        pyautogui.sleep(1)
        pyautogui.click(ziel_x, ziel_y)

        oberflaeche_farbtextur = aktuelle_farbtextur

Du kannst einfach mittels pyautogui.pixel(x, y) das Pixel direkt auslesen.

0
Keksss95511 
Fragesteller
 03.10.2023, 23:17
@Verelat777

Irgendwie klappt es trotzdem nicht. Ich habe dies mal versucht

import pyautogui

oberflaeche_x = 360
oberflaeche_y = 797

ziel_x = 1862
ziel_y = 548

pyautogui.clicks_per_second = 70

def waitAndClickColor(x, y, color):
    while True:
        if pyautogui.pixelMatchesColor(360, 797, 27,31,40):
            pyautogui.click(1862, 548)

            pyautogui.moveTo(ziel_x, ziel_y)
            pyautogui.click()

            break

waitAndClickColor(oberflaeche_x, oberflaeche_y, (43, 48, 55))

Da passiert auch nichts. Ich möchte einfach das bei einer zone erkennen werden soll oder eine koordinate, wenn da was aufkommt bzw farbartikel halt und die sollen angeklickt werden direkt und dann halt zu einer anderen koordinate dann wieder links klick. ( erkennen, klicken, zu anderer koordinate , wieder klicken )

Wäre echt sehr korrekt wenn du mir helfen würdest ! :))

0
Verelat777  03.10.2023, 23:50
@Keksss95511

Es fehlen die Klammern bei den Farbwerten (Tuple), d. h.:

pyautogui.pixelMatchesColor(360, 797, (27, 31, 40))

Der Code sollte dann funktionieren.

Die Funktion bräuchtest Du in Deinem Falle nicht, da Du die Parameter nicht verwendest und die Funktion nur einmal aufgerufst.

while True:
    if pyautogui.pixelMatchesColor(oberflaeche_x, oberflaeche_y, (27, 31, 40)):
        pyautogui.click(oberflaeche_x, oberflaeche_y)
        pyautogui.click(ziel_x, ziel_y)
        break

moveTo ist unnötig. Die Koordinaten kannst Du direkt in als Parameter der click()-Funktion angeben.

0
Keksss95511 
Fragesteller
 04.10.2023, 00:30
@Verelat777
Geht bei mir immernoch nicht so. Habe das mal ausprobiert. Klappt schon leicht mit der erkennung aber auch nicht zu 100 % bugt sehr rum. Nach der erkennung klickt das skript nicht und wenn dann voll langsam und das skript sendet klicks aber die werden nicht ausgeführt und eine frage :
Bei den screenshots code muss ich persönlich doch nichts machen oder was muss ich nach der ausführung vom code machen ?

 import pyautogui

oberflaeche_x =  839
oberflaeche_y = 804

ziel_x = 1993
ziel_y = 453

pyautogui.clicks_per_second = 70

standard_screenshot = pyautogui.screenshot(region=(oberflaeche_x, oberflaeche_y, 1, 1))
standard_farbtextur = standard_screenshot.getpixel((0, 0))

while True:
    aktueller_screenshot = pyautogui.screenshot(region=(oberflaeche_x, oberflaeche_y, 1, 1))
    aktuelle_farbtextur = aktueller_screenshot.getpixel((0, 0))

    if aktuelle_farbtextur != standard_farbtextur:
        pyautogui.click(oberflaeche_x, oberflaeche_y)

        pyautogui.sleep(1)  

        pyautogui.moveTo(ziel_x, ziel_y)
        pyautogui.click()

        standard_screenshot = aktueller_screenshot
        standard_farbtextur = aktuelle_farbtextur
0
Verelat777  04.10.2023, 01:16
@Keksss95511

Ich gehe davon aus, dass das Auto-Clicker-Programm für ein Computerspiel vorgesehen ist. Bei machen Spielen funktioniert PyAutoGUI nicht. Versuche es stattdessen mit DirectInput; ersetze dazu pyautogui überall mit pydirectinput (siehe StackOverflow und learncodebygaming.com).

0
Keksss95511 
Fragesteller
 04.10.2023, 01:27
@Verelat777
Ne ist nicht für ein game sondern benutze es so im browser...


import pyautogui

 # Koordinaten der Oberfläche, die erkannt werden soll
oberflaeche_x = 839
oberflaeche_y = 804

# Koordinaten, zu denen der Bot nach dem Klick gehen soll
ziel_x = 1993
ziel_y = 453

# Setze die Pause zwischen den Klicks auf 1/70 Sekunden
pyautogui.PAUSE = 1/70

# Variable, um den vorherigen Screenshot zu speichern
vorheriger_screenshot = None

while True:
    # Screenshot des Bildschirms aufnehmen
    screenshot = pyautogui.screenshot()

    # Den aktuellen Screenshot mit dem vorherigen vergleichen
    if vorheriger_screenshot is not None and screenshot != vorheriger_screenshot:
        # Neue Farbtextur erkannt, klicke auf die Oberfläche
        pyautogui.click(oberflaeche_x, oberflaeche_y)

        # Zum Ziel gehen und erneut klicken
        pyautogui.moveTo(ziel_x, ziel_y)
        pyautogui.click()

    # Vorherigen Screenshot aktualisieren
    vorheriger_screenshot = screenshot


Dieser code geht so halb, er spammt richtig die eine koordinate zu der ziel koordinate aber dieses skript erkennt nicht richtig und klickt nicht erst wenn etwas kommt beim bildschirm sondern spammt durchgängig 
0
Verelat777  04.10.2023, 01:58
@Keksss95511

Das Programm klickt durchgängig, wenn sich die Bildschirmanzeige ständig ändert.

Warum versuchst Du es nicht mithilfe von pixelMatchesColor() (siehe oben)?

0