Moin Männers, ich versuche mich heute zum ersten mal an etwas Coding und habe absolut keine Ahnung und ich hab das mit ChatGPT erstellt.
Ich möchte in einem Idle game Monster killen. Mein Problem ist, dass der xpath für die Monster nur die Nummern der möglichen 8 Monsterplätze sind. Deshalb habe ich es mit Screenshot abgleichen versucht, was gar nicht funktioniert hat.
Ich habe hier zu Testzwecken Schritt 2 weggelassen, weil das jedes mal fast 2 Minuten dauert und das Spectre Monster eh gerade auf der Seite vorhanden wäre
Hab gestern Abend noch mit tesseract getestet und hat auch nicht geklappt. Ich nehme das originalbild aus dem Quellcode und auch ein mit Lightshot aufgezeichneter Screenshot.
Ich möchte in einem Idle game Monster killen. Mein Problem ist, dass der xpath für die Monster nur die Nummern der möglichen 8 Monsterplätze sind. Deshalb habe ich es mit Screenshot abgleichen versucht, was gar nicht funktioniert hat.
Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time
import pyautogui # Für das Simulieren von Mausaktionen
# Anmeldedaten direkt im Skript (nicht empfohlen für Produktion)
EMAIL = '---'
PASSWORD = '---'
# Browser-Optionen konfigurieren
options = Options()
options.headless = False
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
# XPaths und Namen zuweisen
XPATHS = {
'login_link': '/html/body/div[2]/div[1]/div/p[2]/a',
'email_field': '//*[@id="email"]',
'password_field': '//*[@id="password"]',
'hunt_button': '//*[@id="game-container"]/div/div[2]/div[1]/div[1]/div[2]/div/div[2]/div[2]/button',
'ogre_button': '//*[@id="game-container"]/div/div[2]/div[1]/div[1]/div[2]/div/div[1]/button[8]/img',
'buffalo_button': '//*[@id="game-container"]/div[2]/div[2]/div[1]/div[1]/div[2]/div/div[1]/button[5]/img',
'spectre_button': '//*[@id="game-container"]/div/div[2]/div[1]/div[1]/div[2]/div/div[1]/button[6]/img'
}
def click_monster(xpath, wait_time):
"""Klickt auf ein Monster, wenn es vorhanden ist, und wartet eine bestimmte Zeit."""
try:
monster_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath)))
monster_button.click()
time.sleep(1) # Warte 1 Sekunde vor dem Mausklick für den Kampf
# Klicke auf die gegebene Position, um den Kampf zu starten
pyautogui.click(x=482, y=758)
time.sleep(wait_time)
return True
except Exception as e:
print(f"Fehler beim Klicken auf Monster mit XPath {xpath}: {e}")
return False
def all_monsters_absent():
"""Überprüft, ob alle Monster auf der Seite nicht vorhanden sind."""
for xpath in XPATHS.values():
if xpath != XPATHS['hunt_button']: # Den "Hunt"-Button überspringen
try:
WebDriverWait(driver, 1).until(EC.presence_of_element_located((By.XPATH, xpath)))
return False
except:
continue
return True
try:
# Schritt 1: Gehe zur Startseite und logge dich ein
driver.get('https://web.idle-mmo.com/')
print("Navigiere zur Startseite...")
login_link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, XPATHS['login_link'])))
login_link.click()
time.sleep(1) # Warte 1 Sekunde, bis die Seite vollständig geladen ist
print("Geben Sie E-Mail-Adresse und Passwort ein...")
email_field = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, XPATHS['email_field'])))
email_field.send_keys(EMAIL)
password_field = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, XPATHS['password_field'])))
password_field.send_keys(PASSWORD)
password_field.send_keys(Keys.RETURN)
time.sleep(1) # Warte 1 Sekunde, um die Anmeldung abzuschließen
# Navigiere zur Battle-Seite
print("Navigiere zur Battle-Seite...")
driver.get('https://web.idle-mmo.com/battle')
time.sleep(1) # Warte 1 Sekunde, bis die Battle-Seite vollständig geladen ist
while True:
# Schritt 2: Klicke auf den "Hunt"-Button und warte 107 Sekunden
print("Klicke auf den 'Hunt'-Button...")
hunt_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, XPATHS['hunt_button'])))
hunt_button.click()
time.sleep(107) # Warte 107 Sekunden
# Schritt 3: Klickt auf die vorhandenen Monster, bis keine mehr vorhanden sind
monster_active = True
while monster_active:
monster_active = False # Nehme an, dass keine Monster vorhanden sind
if click_monster(XPATHS['ogre_button'], 92):
monster_active = True
elif click_monster(XPATHS['buffalo_button'], 104):
monster_active = True
elif click_monster(XPATHS['spectre_button'], 52):
monster_active = True
# Wenn keine Monster mehr vorhanden sind, beginne erneut von Schritt 2
if all_monsters_absent():
print("Keine Monster mehr vorhanden. Beginne erneut von Schritt 2...")
driver.get('https://web.idle-mmo.com/battle')
time.sleep(1) # Warte 1 Sekunde, bis die Battle-Seite vollständig geladen ist
finally:
print("Drücke Enter, um den Browser zu schließen...")
input()
driver.quit()
Ich habe hier zu Testzwecken Schritt 2 weggelassen, weil das jedes mal fast 2 Minuten dauert und das Spectre Monster eh gerade auf der Seite vorhanden wäre
Python:
import cv2
import numpy as np
import pyautogui
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Bild-Pfad
SPECTRE_IMAGE_PATH = r'C:\Users\g-tow\OneDrive\Desktop\Neuer Ordner (6)\spectre.png'
# Browser-Optionen konfigurieren
options = Options()
options.headless = False
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
# XPaths und Namen zuweisen
XPATHS = {
'login_link': '/html/body/div[2]/div[1]/div/p[2]/a',
'email_field': '//*[@id="email"]',
'password_field': '//*[@id="password"]',
'battle_page': 'https://web.idle-mmo.com/battle'
}
def locate_and_click_image(image_path, wait_time):
"""Sucht nach einem Bild auf dem Bildschirm und klickt darauf, wenn es gefunden wird."""
# Screenshot der aktuellen Ansicht
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png') # Speichern des Screenshots
# Bild und Screenshot laden
image = cv2.imread(image_path)
screenshot = cv2.imread('screenshot.png')
# Umwandlung der Bilder in Graustufen für bessere Übereinstimmung
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
screenshot_gray = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
# Bildvergleich durchführen
result = cv2.matchTemplate(screenshot_gray, image_gray, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
if max_val > 0.8: # Schwellwert für die Bilderkennung
# Berechne die Position des gefundenen Bildes
top_left = max_loc
height, width = image_gray.shape[:2]
bottom_right = (top_left[0] + width, top_left[1] + height)
# Klicke auf das Bild
pyautogui.click(x=top_left[0] + width / 2, y=top_left[1] + height / 2)
time.sleep(1) # Warte 1 Sekunde vor dem Mausklick für den Kampf
# Klicke auf die gegebene Position, um den Kampf zu starten
pyautogui.click(x=482, y=758)
time.sleep(wait_time)
return True
return False
def all_monsters_absent():
"""Überprüft, ob alle Monster auf der Seite nicht vorhanden sind."""
return not locate_and_click_image(SPECTRE_IMAGE_PATH, 0) # Keine Wartezeit, nur Prüfung
try:
# Schritt 1: Gehe zur Startseite und logge dich ein
driver.get('https://web.idle-mmo.com/')
print("Navigiere zur Startseite...")
login_link = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, XPATHS['login_link'])))
login_link.click()
time.sleep(1) # Warte 1 Sekunde, bis die Seite vollständig geladen ist
print("Geben Sie E-Mail-Adresse und Passwort ein...")
email_field = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, XPATHS['email_field'])))
password_field = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, XPATHS['password_field'])))
password_field.send_keys(Keys.RETURN)
time.sleep(1) # Warte 1 Sekunde, um die Anmeldung abzuschließen
# Navigiere zur Battle-Seite
print("Navigiere zur Battle-Seite...")
driver.get(XPATHS['battle_page'])
time.sleep(1) # Warte 1 Sekunde, bis die Battle-Seite vollständig geladen ist
while True:
# Schritt 3: Klickt auf die vorhandenen Monster, bis keine mehr vorhanden sind
monster_active = True
while monster_active:
monster_active = locate_and_click_image(SPECTRE_IMAGE_PATH, 52)
# Wenn keine Monster mehr vorhanden sind, lade die Battle-Seite neu
if all_monsters_absent():
print("Keine Monster mehr vorhanden. Lade die Battle-Seite neu...")
driver.get(XPATHS['battle_page'])
time.sleep(1) # Warte 1 Sekunde, bis die Battle-Seite vollständig geladen ist
finally:
print("Drücke Enter, um den Browser zu schließen...")
input()
driver.quit()
Hab gestern Abend noch mit tesseract getestet und hat auch nicht geklappt. Ich nehme das originalbild aus dem Quellcode und auch ein mit Lightshot aufgezeichneter Screenshot.