Pyhton/Java Bot Erkennung von Farbe und klicken bei Koordinate?
Hey,
ich wollte fragen, wie man bzw ob jemand, weiß wie ich ein automatischen bot programmiere, der auf dem Bildschirm eine farbe erkennt (ein aufblinken von einem feld) Dann dies anklickt und auf eine andere Koordinate vom bildschirm ausführt? Also dann das der bot wo anders wieder ein anderes feld anklickt.
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:
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.
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 ! :))
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.
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
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).
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
Das Programm klickt durchgängig, wenn sich die Bildschirmanzeige ständig ändert.
Warum versuchst Du es nicht mithilfe von pixelMatchesColor() (siehe oben)?
Ich habe dies, aber es funktioniert nicht. Ich verstehe das andere nicht so.