Auto Captcha Solver + Mausmakro erstellen und konfiurieren mit pytesseract

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Miimiikrii
User
Beiträge: 1
Registriert: Montag 8. Juli 2024, 19:53

Hallo zusammen,

ich möchte mich vorab schon mal entschuldigen, falls ich hier komplett falsch bin. Ich bin was Python betrifft absoluter Neuling und habe kaum Erfahrung im Programmieren. Daher habe ich das Script per AI erstellen lassen und anschließend immer wieder durchgetestet mit verschiedenen Einstellungen.

Kurz zum Plan:

Ich möchte ein Python Script erstellen, was in einer bestimmten Anwendung in einem vordefinierten Bereich in regelmäßigen Zeitabständen nach einem Popup bzw. Captcha sucht welches immer wieder erscheint. Dieses soll anschließend automatsich gelöst werden, indem die Maus die richtige Antwortmöglichkeit anklickt.

Es handelt sich hierbei um eine Matheaufgabe, die gelöst werden muss. Diese schaut so aus.

https://i.imgur.com/wVyjGSD.png

Folgendes Funktioniert schon.
- Script startet und fängt schon mal an zu arbeiten (sehr schön)
- Es nimmt die richtige Anwendung und der zu scannende Bereich ist entsprechend eingegrenzt.
- Vom Versuch wird entsprechend ein Screenshot erstellt, um zu sehen wie das OCR versucht das Captcha zu lesen und zu interpretieren.

Allerdings erkennt er die Zeichen nicht.

Meldung:

Erfassen des Anwendungsfensters...
Bildvorverarbeitung...
Durchführen der Texterkennung...
Erkannter Text:

Keine gültige Matheaufgabe erkannt.


Kriege dann solch lustige Screenshots: https://i.imgur.com/dYflu0f.png

ich würde jetzt mal vermuten, dass es an irgendwelchen Einstellungen liegt, weil ich kann ja selbst auf dem Schwarz Weiß Screenshot die Zahlen erkennen.

Jemand ne Idee was ich anpassen müsste, damit OCR das ganze erkennt?

Hier mein aktuelles Script:

import pytesseract
import pyautogui
import sympy as sp
import cv2
import numpy as np
import time
import pygetwindow as gw

# Pfad zur Tesseract-Installation anpassen
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def capture_math_problem_region(window_title):
"""Erfassen des spezifischen Anwendungsfensters und Rückgabe des ROI für die Matheaufgabe."""
window = gw.getWindowsWithTitle(window_title)
if window:
window = window[0]
math_width = 350
math_height = 200

# Zentrieren des Matheaufgabenbereichs im Fenster
roi_left = window.left + (window.width - math_width) // 2
roi_top = window.top + (window.height - math_height) // 2
bbox = (roi_left, roi_top, math_width, math_height)

screenshot = pyautogui.screenshot(region=bbox)
return cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
else:
print(f"Fenster mit Titel '{window_title}' nicht gefunden.")
return None

def preprocess_image(image):
"""Bild vorverarbeiten, um die Texterkennung zu verbessern (angepasst für Captchas)."""
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Adaptive Schwellenwertbildung anwenden
binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)
return binary

def extract_math_problem(text):
"""Matheaufgabe aus dem Text extrahieren."""
lines = text.splitlines()
for line in lines:
# Spezifischere Bedingung für die Erkennung der Matheaufgabe
if '=' in line and '?' in line:
print(f"Erkannte mögliche Matheaufgabe: {line}")
return line.split('=')[0].strip()
return None

def is_valid_math_problem(problem):
"""Überprüfen, ob der Text ein gültiger mathematischer Ausdruck ist."""
try:
sp.sympify(problem)
return True
except (sp.SympifyError, SyntaxError):
return False

def solve_math_problem(math_problem):
"""Matheaufgabe lösen."""
expr = sp.sympify(math_problem)
solution = sp.simplify(expr)
return solution

def find_and_click_solution(screenshot, solution):
"""Finden Sie die richtige Antwort und klicken Sie darauf."""
h, w, _ = screenshot.shape
boxes = pytesseract.image_to_boxes(screenshot)
for b in boxes.splitlines():
b = b.split(' ')
if str(solution) in b[0]:
x, y, x2, y2 = int(b[1]), int(b[2]), int(b[3]), int(b[4])
# Klicken Sie auf die Mitte des gefundenen Textbereichs
pyautogui.click(x + (x2 - x) // 2, h - y + (y2 - y) // 2)
return True
return False

def main():
last_check = time.time() # Zeit des letzten Status-Checks
while True:
current_time = time.time()
if current_time - last_check >= 60:
print("Das Skript arbeitet noch...")
last_check = current_time

print("Erfassen des Anwendungsfensters...")
screenshot = capture_math_problem_region("Alphastream")

if screenshot is None:
time.sleep(15)
continue

# Speichern Sie den Screenshot für Debugging-Zwecke
cv2.imwrite("screenshot_math_problem.png", screenshot)

print("Bildvorverarbeitung...")
processed_image = preprocess_image(screenshot)
cv2.imwrite("screenshot_processed.png", processed_image) # Vorverarbeitetes Bild speichern

print("Durchführen der Texterkennung...")
text = pytesseract.image_to_string(processed_image)

print("Erkannter Text:")
print(text)

math_problem = extract_math_problem(text)

if math_problem and is_valid_math_problem(math_problem):
print(f"Erkannte Matheaufgabe: {math_problem}")
try:
solution = solve_math_problem(math_problem)
print(f"Lösung berechnet: {solution}")

if find_and_click_solution(screenshot, solution):
print(f"Lösung {solution} gefunden und angeklickt.")
except Exception as e:
print(f"Fehler beim Lösen der Matheaufgabe: {e}")
else:
print("Keine gültige Matheaufgabe erkannt.")

time.sleep(15) # Pause, um die CPU zu schonen und das Intervall auf 15 Sekunden einzustellen

if __name__ == "__main__":
main()
Antworten