Untitled
unknown
plain_text
2 years ago
7.4 kB
5
Indexable
# -*- coding: utf-8 -*- """ Created on Thu Mar 23 00:09:06 2023 @author: salihcanturan """ from pytesseract import pytesseract import threading import pygetwindow from pynput.keyboard import Key, Controller import win32api, win32con from win32gui import GetWindowText, GetForegroundWindow from PIL import ImageFont import pyautogui import mss import numpy as np import cv2 import time import pyuac import keyboard import pickle import uuid from unidecode import unidecode from DatasetLoader import getItemIconDictionary import re path_to_tesseract = r'C:\Program Files\Tesseract-OCR\tesseract.exe' pytesseract.tesseract_cmd = path_to_tesseract print('Is user admin?', pyuac.isUserAdmin()) WINDOW_NAME = 'Harbi2 | shaula666' titles = pygetwindow.getAllTitles() stopApp = False screenshot = None dogrulama_screenshot = None active_window = None imageDataset = getItemIconDictionary() controller = Controller() def click(x, y): old = pyautogui.position() win32api.SetCursorPos((x,y)) time.sleep(0.1) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) time.sleep(0.1) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) win32api.SetCursorPos(old) def string_benzerligi(str1, str2): str1 = str1[:-4] str1 = str1.lower() str2 = str2.lower() str1 = re.sub('[^A-Za-z]+', '', unidecode(str1)) str2 = re.sub('[^A-Za-z]+', '', unidecode(str2)) toplam_benzerlik = 0 for karakter in set(str1 + str2): toplam_benzerlik += min(str1.count(karakter), str2.count(karakter)) return 100.0 * toplam_benzerlik / (len(str1) + len(str2)) + 1 def mse_benzerligi(img1, img2): return np.mean((img1[:,:,:3].astype("float") - img2.astype("float")) ** 2) metinThreadDone = True def clickMetinThread(region, ratio): global metinThreadDone metinThreadDone = False found = False x = None y = None # Metin tespit kısa kodu tüm piksellere bakar. for i in range(100, len(screenshot)-50, 2): for j in range(0, len(screenshot[0]), 2): blue = screenshot[i, j][0] green = screenshot[i, j][1] red = screenshot[i, j][2] if abs(150 - blue) < 40 and abs(46 - green) < 20 and abs(95 - red) < 20: found = True x = int(region['left']+j*(1/ratio)) y = int(region['top']+i*(1/ratio)) break if found: break if found: click(x, y) controller.press('q') time.sleep(1.5) controller.release('q') if found: time.sleep(10) metinThreadDone = True def updateScreenshotThread(): global dogrulama_screenshot, screenshot sct = mss.mss() window = pygetwindow.getWindowsWithTitle(WINDOW_NAME) if len(window) == 0: return window = window[0] left, top = window.topleft right, bottom = window.bottomright region = {'top': top, 'left': left, 'width': right-left, 'height': bottom-top} raw_screenshot = sct.grab(region) raw_screenshot = np.array(raw_screenshot)[:,:,:3] ratio = 1000 / raw_screenshot.shape[0] width = int(raw_screenshot.shape[1] * ratio) height = int(raw_screenshot.shape[0] * ratio + 0.001) raw_screenshot = cv2.resize(raw_screenshot, (width, height), interpolation=cv2.INTER_AREA) screenshot = raw_screenshot.copy() dogrulama_screenshot = raw_screenshot[203:446, 405:884, :] return ratio, region, np.sum(dogrulama_screenshot[20:30, 0:100]) / \ np.prod(dogrulama_screenshot[20:30, 0:100].shape) < 10 def mainThread(): global stopApp, screenshot, active_window, metinThreadDone i = 0 while True: pack = updateScreenshotThread() if pack is None: time.sleep(0.5) continue ratio, region, validation_came = pack active_window = GetWindowText(GetForegroundWindow()) if not validation_came: if metinThreadDone and active_window == WINDOW_NAME: metinThread = threading.Thread(target=clickMetinThread, args=(region, ratio,)).start() time.sleep(0.1) continue if screenshot is None: time.sleep(0.1) continue if active_window != WINDOW_NAME: print(GetWindowText(GetForegroundWindow())) cv2.imshow("DOGRULAMA TESPIT", resized) if cv2.waitKey(1) == ord('x'): stopApp=True cv2.destroyAllWindows() break continue text_img = dogrulama_screenshot[5:40, 50:400, :] text = pytesseract.image_to_string(text_img, lang="tur") max_val = 0 max_key = None for key in imageDataset: if max_val < string_benzerligi(key, text): max_val = string_benzerligi(key, text) max_key = key image_to_compare = imageDataset[max_key] resized = cv2.resize(dogrulama_screenshot, (dogrulama_screenshot.shape[1]*2, dogrulama_screenshot.shape[0]*2), interpolation=cv2.INTER_AREA) resized = cv2.rectangle(resized, (100, 10), ((800, 80)), (0, 255, 0), 1) slots = [] for j in range(9): slots.append(cv2.resize(dogrulama_screenshot[45:165,10+j*52:50+j*52], (4, 12), interpolation=cv2.INTER_AREA)) min_fark = 9999999 match_idx = 0 for idx, slot in enumerate(slots): if min_fark > mse_benzerligi(image_to_compare, slot): match_idx = idx min_fark = mse_benzerligi(image_to_compare, slot) resized = cv2.rectangle(resized, (124, 90), ((204, 330)), (0, 255, 0), -1) for j in range(9): resized[90:330, 20+104*j:100+104*j] = cv2.resize(slots[j], (80, 240), interpolation=cv2.INTER_AREA) for j in range(9): if j == match_idx: print(text) print(max_key) click(int(region['left'] + (405 + 30+j*52) * (1/ratio)), int(region['top'] + (203 + 105) * (1/ratio)) ) time.sleep(0.1) cv2.rectangle(resized, (20+j*104, 90), ((100+j*104, 330)), (0, 255, 0), 5) else: cv2.rectangle(resized, (20+j*104, 90), ((100+j*104, 330)), (255, 0, 0), 1) font = cv2.FONT_HERSHEY_DUPLEX fontScale = 2 thickness = 2 cv2.putText(resized, re.sub('[^A-Za-z]+', '', unidecode(text)), (200, 70), font, fontScale, (0,255,0), thickness, cv2.LINE_AA) cv2.putText(resized, unidecode(max_key), (100, 400), font, fontScale, (0,255,0), thickness, cv2.LINE_AA) cv2.imshow("DOGRULAMA TESPIT", resized) if cv2.waitKey(1) == ord('x'): cv2.destroyAllWindows() stopApp=True break i += 1 mainThread()
Editor is loading...