Advertisement
egor230

Сделать скриншот чтобы нажать кнопку

Mar 19th, 2025
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.19 KB | Source Code | 0 0
  1. import subprocess, time, re, psutil, mss
  2. from io import BytesIO
  3. import cv2, numpy as np
  4. from PIL import Image
  5. from pynput import keyboard, mouse
  6. from threading import Event
  7. def get_process_info():
  8.   process_info = {}
  9.   for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
  10.     try:
  11.       pid = proc.info['pid']
  12.       name = proc.info['name']
  13.       cmdline = proc.info['cmdline']      # Проверка, что cmdline не является None
  14.       if cmdline is None:
  15.         continue      # Проверка, запущен ли процесс через Wine
  16.       exe_path = next((part for part in cmdline if part.endswith('.exe')), None)
  17.       if exe_path:       # Извлечение части пути, начинающейся с /mnt и включающей .exe
  18.        match = re.search(r'/mnt/.*?\.exe', exe_path)
  19.        if match:
  20.         exe_path = match.group(0)      # print(pid)         # print(exe_path)
  21.         process_info[pid]= exe_path
  22.     except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  23.       continue
  24.   return process_info
  25.  
  26. def replace_path_in_dict(d):
  27.   # Определяем новый префикс
  28.   new_prefix = next(('/'.join(value.split('/')[:4]) + '/' for value in d.values() if value.startswith('/mnt/')), None)
  29.   if new_prefix is None:
  30.     raise ValueError("Не удалось определить новый префикс.")
  31.  
  32.   updated_dict = {}
  33.   for key, value in d.items():
  34.     if value.startswith('/mnt/'):    # Если путь уже начинается с /mnt/, оставляем как есть
  35.       updated_value = value
  36.     else:      # Заменяем X:/ на new_prefix
  37.       updated_value = re.sub(r'^[A-Z]:/', new_prefix, value, count=1)
  38.       # Убираем дублирование /games/games/ или других частей
  39.       parts = updated_value.split('/') # Удаляем повторяющиеся сегменты после new_prefix
  40.       unique_parts = []
  41.       for part in parts:
  42.         if not unique_parts or part != unique_parts[-1]:
  43.           unique_parts.append(part)
  44.       updated_value = '/'.join(unique_parts)
  45.     # Добавляем .exe, если его нет
  46.     if isinstance(updated_value, str) and not updated_value.lower().endswith('.exe'):
  47.       updated_value += '.exe'
  48.     updated_dict[key] = updated_value # Путей обновить значение путей.
  49.  
  50.   return updated_dict
  51. get_user_name = f'''#!/bin/bash
  52. current_user=$(whoami);
  53. echo $current_user
  54. exit;# Завершаем выполнение скрипта
  55. '''
  56. user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()# имя пользователя.
  57. get_main_id = '''#!/bin/bash # Получаем идентификатор активного окна
  58.    active_window_id=$(xdotool getactivewindow 2>/dev/null)
  59.    if [ -n "$active_window_id" ]; then
  60.        process_id_active=$(xdotool getwindowpid "$active_window_id" 2>/dev/null)
  61.        echo "$process_id_active"
  62.    else
  63.        echo "0"  # Или любое значение по умолчанию, если нет активного окна
  64.    fi
  65.    exit'''
  66. def get_pid_and_path_window():# Получаем идентификатор активного окна
  67.  try:   # Регулярное выражение для поиска путей к .exe файлам
  68.    pattern = re.compile(r'(/mnt/.*?\.exe)|([A-Z]:/.*?\.exe)', re.IGNORECASE)
  69.    data_dict = {}   # Один проход по всем процессам пользователя
  70.    for proc in psutil.process_iter(['pid', 'username', 'cmdline']):
  71.     if proc.info['username'] == user and proc.info['cmdline']:
  72.      cmdline = ' '.join(proc.info['cmdline']).replace('\\', '/')
  73.      match = pattern.search(cmdline)
  74.      if match:
  75.       file_path = match.group(0)       # Обработка пути: берём часть после .sh, если есть
  76.       file_path = file_path.split('.sh', 1)[-1].strip() if '.sh' in file_path else file_path       # Уточняем путь до /mnt/... (если требуется)
  77.       match_mnt = re.search(r'/mnt/[^ ]+', file_path)
  78.       if match_mnt:
  79.         file_path = match_mnt.group(0)
  80.       data_dict[proc.info['pid']] = file_path
  81.  
  82.    # Обновляем словарь с помощью внешних функций (если они есть)
  83.    data_dict1 = get_process_info()
  84.    data_dict.update(data_dict1)
  85.    updated_dict = replace_path_in_dict(data_dict)
  86.    process_id_active = int(
  87.      subprocess.run(['bash'], input=get_main_id, stdout=subprocess.PIPE, text=True).stdout.strip())
  88.    return updated_dict, process_id_active# Обновленный словарь путей.
  89.  except:
  90.    pass
  91.  
  92. def crop_center_square_from_image(file_path):
  93.     # Загружаем скриншот в объект Image
  94.     with open(file_path, 'rb') as file:
  95.         screenshot = file.read()
  96.     image = Image.open(BytesIO(screenshot))
  97.     left = 930
  98.     top = 600
  99.     right = 995
  100.     bottom = 665
  101.  
  102.     cropped_image = image.crop((left, top, right, bottom))
  103.     save_path ="cropped_center_square.png"
  104.     # Сохраняем обрезанное изображение
  105.     cropped_image.save(save_path)
  106.     return save_path
  107.  
  108. def take_screenshot(save_path="screenshot.png"):
  109.   """
  110.  Делает скриншот экрана и сохраняет его на жёсткий диск.
  111. :param save_path: Путь для сохранения скриншота (по умолчанию "screenshot.png").
  112.  """
  113.   try: #Определяем область экрана для захвата (весь экран)
  114.     with mss.mss() as sct:
  115.         monitor = sct.monitors[1]  # Основной монитор
  116.         # Захватываем изображение
  117.         img = sct.grab(monitor)
  118.         # Преобразуем в массив NumPy для обработки
  119.         img_np = np.array(img)
  120.         # Преобразуем цветовую схему из BGRA в BGR
  121.         img_bgr = cv2.cvtColor(img_np, cv2.COLOR_BGRA2BGR)
  122.         # Сохраняем скриншот на диск
  123.         cv2.imwrite(save_path, img_bgr)
  124.         # Читаем сохранённый файл как байты
  125.   except Exception as e:
  126.         print(f"Ошибка при создании скриншота: {e}")
  127. def find_image_in_image(main_image_path, template_image_path, threshold=0.45):
  128.     main_image = cv2.imread(main_image_path, cv2.IMREAD_COLOR)  # Загружаем изображение и шаблон
  129.     template = cv2.imread(template_image_path, cv2.IMREAD_COLOR)
  130.     if main_image is None or template is None:    # Проверяем, загрузились ли изображения
  131.         print("Ошибка: Не удалось загрузить изображение или шаблон.")
  132.         return None
  133.     # Применяем Template Matching
  134.     result = cv2.matchTemplate(main_image, template, cv2.TM_CCOEFF_NORMED)
  135.     # Находим максимальное значение совпадения и его координаты
  136.     _, max_val, _, max_loc = cv2.minMaxLoc(result)
  137.     # Проверяем, превышает ли максимальное значение порог
  138.     if max_val >= threshold:
  139.         print(f"Шаблон найден: {max_val:.2f}")
  140.         return max_loc  # Возвращаем координаты (x, y)
  141.     else:
  142.         print(f"Шаблон не найден: {max_val:.2f}")
  143.         return None
  144.  
  145. while 1:
  146.  try:
  147.   data_dict, process_id_active=get_pid_and_path_window()
  148.   if data_dict[process_id_active] =="/mnt/807EB5FA7EB5E954/games/Wolfenstein - The New Order/WolfNewOrder_x64.exe":
  149.     time.sleep(1)
  150.     template_image = "find.png"  #  Путь к шаблону
  151.     take_screenshot()#Сделать скриншот игры
  152.     main_image= crop_center_square_from_image("screenshot.png")# Обрезать скриншот.   print(main_image)
  153.     if find_image_in_image(main_image, template_image):# Найти есть картинка в участке.
  154.         res='xte "keydown E" sleep 0.23 xte "keyup E"'
  155.         subprocess.run(['bash'], input=res, text=True)
  156.  except Exception as e:
  157.     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement