-
Notifications
You must be signed in to change notification settings - Fork 2
/
bot_offline.py
127 lines (104 loc) · 7.95 KB
/
bot_offline.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# python3
# bot for offline game on hrome
import numpy as np
import cv2 # работа с изображениями
from mss.windows import MSS as msss # модуль обработки скрина без сохранения на диск
import mss.tools
import os # для работы с командной строкой (определение экрана)
import time # работа со временем
import pyautogui as pg
import logging # модуль логирования
import subprocess # Запуск приложений windows
import keyboard # работа с нажатиями клавиш
def screen_resolution(): # функция определения разрешения экрана
global screen_width_x, screen_height_y # определяем глобальные переменные
cmd = 'wmic path Win32_VideoController get CurrentHorizontalResolution,CurrentVerticalResolution' # вызываем
# командную строку и через нее определяем разрешение экрана
size_tuple = tuple(map(int, os.popen(cmd).read().split()[-2::])) # считываем данные из командной строки
screen_width_x = size_tuple[0] # сохраняем значения расширения экрана по оси х
screen_height_y = size_tuple[1] # сохраняем значения расширения экрана по оси у
logging.info('%s screen width', screen_width_x) # запись в лог файл ширины экрана
logging.info('%s screen height', screen_height_y) # запись в лог файл высоты экрана
return screen_width_x, screen_height_y # возвращение глобальных переменных
def startlnk(): # функция запуска приложения
subprocess.Popen('C:\Program Files\Google\Chrome\Application\chrome.exe') # запуск приложения
time.sleep(1) # время ожидания запуска
time.sleep(1) # время ожидания
keyboard.send("Ctrl + Shift + T") # открывает последнюю страницу
keyboard.send("windows+up") # разворачивает приложение на все окно
time.sleep(1) # время ожидания
keyboard.send("Ctrl + Shift + R") # обновляем страницу
time.sleep(1) # время ожидания
keyboard.send("space") # начинаем игру нажимая пробел
def ss(template): # функция определения координат изображения
global zero, screen_width_x, screen_height_y, buttonx, buttony # определяем глобальные переменные
try:
buttonx, buttony = pg.locateCenterOnScreen(template, region=(0, 0, screen_width_x, screen_height_y),
confidence=0.7) # опеределяем координаты нашего дракона
# pg.moveTo(buttonx, buttony) # перемещается к искомомму изображению
# pg.doubleClick(buttonx, buttony) # дважды нажимает на искомое изображение
time.sleep(1) # ждем 1 сек.
return buttonx, buttony # возвращаем переменные
except TypeError: # в том случае если изображение не найдено
return zero # возвращаем ноль
def process_image(original_image):
processed_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
processed_image = cv2.Canny(processed_image, threshold1=200, threshold2=300)
return processed_image
def main():
sct = msss() # модуль обработки скрина без сохранения на диск
last_time = time.time() # определяем текущее время
space_time = time.time() # определяем время нажатия пробела
while(True):
img = sct.grab(monitor) # модуль обработки скрина без сохранения на диск
# Save to the picture file
# output = "sct-{top}x{left}_{width}x{height}.png".format(**monitor) # определяем формат изображения
# mss.tools.to_png(img.rgb, img.size, output=output) # сохраняем изображение
# print(output) # название файла
# print('loop took {} seconds'.format(time.time() - last_time)) # отображаем время между анализом изображения
# last_time = time.time()
img = np.array(img) # преобразуем изображение в табличные данные
processed_image = process_image(img) # запускаем функцию
mean = np.mean(processed_image) # переменная которая определяет смену изображения в указанной зоне
# print('mean = ', mean)
delta_time = time.time() - space_time # разница по времени между нажатиями кнопки пробел
if not mean == float(0): # если картинка в указанное области менялась, то..
pg.press('space') # нажатие на пробел
space_time = time.time() # определяем время нажатия пробела
if delta_time > 15: # если долго (более 15 секунд) не нажимают на пробел значит игра закончена
pg.press('space') # для запуска новой игры нажимаем пробел
space_time = time.time() # определяем время нажатия пробела
delta_time = (time.time() - last_time)/60 # длительность игры в минутах
logging.info('%s min - game time', delta_time) # запись в лог файл ширины экрана
if keyboard.is_pressed('q'): # при нажатии на кнопку 'q' выход из программы
break # выход из цикла
# variables (переменные)
screen_width_x = 0 # ширина экрана, координата х - максимальная
screen_height_y = 0 # высота экрана, координата у - максимальная
zero = 0 # пустая переменная
buttonx = 100 # координаты объекта по оси х
buttony = 100 # координаты объекта по оси у
# описываем параметры логирования
logging.basicConfig(filename='app.log', filemode='w', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.info('Start game and logged in')
# примеры логирования с разными уровнями важности
# logging.info('This is an info message')
# logging.debug('This is a debug message')
# logging.warning('This will get logged to a file')
# logging.error('This is an error message')
# logging.critical('This is a critical message')
# исполняемый код
startlnk() # запуск приложения хром
screen_resolution() # определяем разрешение экрана
active_dir = 'media/' + str(screen_width_x) + 'x' + str(screen_height_y) + '/' # активная папка для соответствующего
# разрешения
print(screen_width_x, screen_height_y)
ss(active_dir + "dragon.png") # определение координат дракона на экране
print(buttonx, buttony)
x1 = int(buttonx + (screen_width_x * (150/1920)))
y1 = int(buttony - (screen_height_y * (15/1920)))
x2 = int(screen_width_x * (30/1920))
y2 = int(screen_height_y * (30/1920))
monitor = {'top': y1, 'left': x1, 'width': x2, 'height': y2} # расчет зоны реакции
if __name__ == "__main__":
main()