Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import subprocess, time, re, psutil, mss
- from io import BytesIO
- import cv2, numpy as np
- from PIL import Image
- from pynput import keyboard, mouse
- from threading import Event
- def get_process_info():
- process_info = {}
- for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
- try:
- pid = proc.info['pid']
- name = proc.info['name']
- cmdline = proc.info['cmdline'] # Проверка, что cmdline не является None
- if cmdline is None:
- continue # Проверка, запущен ли процесс через Wine
- exe_path = next((part for part in cmdline if part.endswith('.exe')), None)
- if exe_path: # Извлечение части пути, начинающейся с /mnt и включающей .exe
- match = re.search(r'/mnt/.*?\.exe', exe_path)
- if match:
- exe_path = match.group(0) # print(pid) # print(exe_path)
- process_info[pid]= exe_path
- except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
- continue
- return process_info
- def replace_path_in_dict(d):
- # Определяем новый префикс
- new_prefix = next(('/'.join(value.split('/')[:4]) + '/' for value in d.values() if value.startswith('/mnt/')), None)
- if new_prefix is None:
- raise ValueError("Не удалось определить новый префикс.")
- updated_dict = {}
- for key, value in d.items():
- if value.startswith('/mnt/'): # Если путь уже начинается с /mnt/, оставляем как есть
- updated_value = value
- else: # Заменяем X:/ на new_prefix
- updated_value = re.sub(r'^[A-Z]:/', new_prefix, value, count=1)
- # Убираем дублирование /games/games/ или других частей
- parts = updated_value.split('/') # Удаляем повторяющиеся сегменты после new_prefix
- unique_parts = []
- for part in parts:
- if not unique_parts or part != unique_parts[-1]:
- unique_parts.append(part)
- updated_value = '/'.join(unique_parts)
- # Добавляем .exe, если его нет
- if isinstance(updated_value, str) and not updated_value.lower().endswith('.exe'):
- updated_value += '.exe'
- updated_dict[key] = updated_value # Путей обновить значение путей.
- return updated_dict
- get_user_name = f'''#!/bin/bash
- current_user=$(whoami);
- echo $current_user
- exit;# Завершаем выполнение скрипта
- '''
- user = subprocess.run(['bash'], input=get_user_name, stdout=subprocess.PIPE, text=True).stdout.strip()# имя пользователя.
- get_main_id = '''#!/bin/bash # Получаем идентификатор активного окна
- active_window_id=$(xdotool getactivewindow 2>/dev/null)
- if [ -n "$active_window_id" ]; then
- process_id_active=$(xdotool getwindowpid "$active_window_id" 2>/dev/null)
- echo "$process_id_active"
- else
- echo "0" # Или любое значение по умолчанию, если нет активного окна
- fi
- exit'''
- def get_pid_and_path_window():# Получаем идентификатор активного окна
- try: # Регулярное выражение для поиска путей к .exe файлам
- pattern = re.compile(r'(/mnt/.*?\.exe)|([A-Z]:/.*?\.exe)', re.IGNORECASE)
- data_dict = {} # Один проход по всем процессам пользователя
- for proc in psutil.process_iter(['pid', 'username', 'cmdline']):
- if proc.info['username'] == user and proc.info['cmdline']:
- cmdline = ' '.join(proc.info['cmdline']).replace('\\', '/')
- match = pattern.search(cmdline)
- if match:
- file_path = match.group(0) # Обработка пути: берём часть после .sh, если есть
- file_path = file_path.split('.sh', 1)[-1].strip() if '.sh' in file_path else file_path # Уточняем путь до /mnt/... (если требуется)
- match_mnt = re.search(r'/mnt/[^ ]+', file_path)
- if match_mnt:
- file_path = match_mnt.group(0)
- data_dict[proc.info['pid']] = file_path
- # Обновляем словарь с помощью внешних функций (если они есть)
- data_dict1 = get_process_info()
- data_dict.update(data_dict1)
- updated_dict = replace_path_in_dict(data_dict)
- process_id_active = int(
- subprocess.run(['bash'], input=get_main_id, stdout=subprocess.PIPE, text=True).stdout.strip())
- return updated_dict, process_id_active# Обновленный словарь путей.
- except:
- pass
- def crop_center_square_from_image(file_path):
- # Загружаем скриншот в объект Image
- with open(file_path, 'rb') as file:
- screenshot = file.read()
- image = Image.open(BytesIO(screenshot))
- left = 930
- top = 600
- right = 995
- bottom = 665
- cropped_image = image.crop((left, top, right, bottom))
- save_path ="cropped_center_square.png"
- # Сохраняем обрезанное изображение
- cropped_image.save(save_path)
- return save_path
- def take_screenshot(save_path="screenshot.png"):
- """
- Делает скриншот экрана и сохраняет его на жёсткий диск.
- :param save_path: Путь для сохранения скриншота (по умолчанию "screenshot.png").
- """
- try: #Определяем область экрана для захвата (весь экран)
- with mss.mss() as sct:
- monitor = sct.monitors[1] # Основной монитор
- # Захватываем изображение
- img = sct.grab(monitor)
- # Преобразуем в массив NumPy для обработки
- img_np = np.array(img)
- # Преобразуем цветовую схему из BGRA в BGR
- img_bgr = cv2.cvtColor(img_np, cv2.COLOR_BGRA2BGR)
- # Сохраняем скриншот на диск
- cv2.imwrite(save_path, img_bgr)
- # Читаем сохранённый файл как байты
- except Exception as e:
- print(f"Ошибка при создании скриншота: {e}")
- def find_image_in_image(main_image_path, template_image_path, threshold=0.45):
- main_image = cv2.imread(main_image_path, cv2.IMREAD_COLOR) # Загружаем изображение и шаблон
- template = cv2.imread(template_image_path, cv2.IMREAD_COLOR)
- if main_image is None or template is None: # Проверяем, загрузились ли изображения
- print("Ошибка: Не удалось загрузить изображение или шаблон.")
- return None
- # Применяем Template Matching
- result = cv2.matchTemplate(main_image, template, cv2.TM_CCOEFF_NORMED)
- # Находим максимальное значение совпадения и его координаты
- _, max_val, _, max_loc = cv2.minMaxLoc(result)
- # Проверяем, превышает ли максимальное значение порог
- if max_val >= threshold:
- print(f"Шаблон найден: {max_val:.2f}")
- return max_loc # Возвращаем координаты (x, y)
- else:
- print(f"Шаблон не найден: {max_val:.2f}")
- return None
- while 1:
- try:
- data_dict, process_id_active=get_pid_and_path_window()
- if data_dict[process_id_active] =="/mnt/807EB5FA7EB5E954/games/Wolfenstein - The New Order/WolfNewOrder_x64.exe":
- time.sleep(1)
- template_image = "find.png" # Путь к шаблону
- take_screenshot()#Сделать скриншот игры
- main_image= crop_center_square_from_image("screenshot.png")# Обрезать скриншот. print(main_image)
- if find_image_in_image(main_image, template_image):# Найти есть картинка в участке.
- res='xte "keydown E" sleep 0.23 xte "keyup E"'
- subprocess.run(['bash'], input=res, text=True)
- except Exception as e:
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement