discovery.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import numpy as np
  2. import cv2
  3. import pyautogui
  4. import time
  5. import pydirectinput
  6. import sys
  7. import win32gui
  8. import win32con
  9. def detect():
  10. print("--- Етап 1. Пошук даних")
  11. start = time.time()
  12. print(" --- Скріншот")
  13. image = pyautogui.screenshot()
  14. img = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
  15. print(" --- Завантаження шаблонів")
  16. template = cv2.imread('temp.png')
  17. template2 = cv2.imread('temp2.png')
  18. locs = []
  19. print(" --- Пошук квадратів по шаблону")
  20. while True:
  21. result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
  22. _ , max_val, _, max_loc = cv2.minMaxLoc(result)
  23. if max_val < 0.5:
  24. break
  25. locs.append(max_loc)
  26. x1 = max_loc[0]
  27. y1 = max_loc[1]
  28. x2 = x1 + 40
  29. y2 = y1 + 40
  30. cv2.rectangle(img, (x1, y1), (x2, y2), (255, 255, 255), -1)
  31. print(" --- Пошук закінчено")
  32. loc = min(locs)
  33. x1 = loc[0]
  34. y1 = loc[1]
  35. x2 = x1 + 440
  36. y2 = y1 + 210
  37. coo1 = [[x1, y1], [x2, y1], [x2, y2], [x1, y2], [x1, y1]]
  38. cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
  39. y1 = y2 + 10
  40. y2 += 220
  41. cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
  42. coo2 = [[x1, y1], [x2, y1], [x2, y2], [x1, y2], [x1, y1]]
  43. print(" --- Пошук кнопки відправки по шаблону")
  44. result = cv2.matchTemplate(img, template2, cv2.TM_CCOEFF_NORMED)
  45. _, max_val, _, max_loc = cv2.minMaxLoc(result)
  46. print(" --- Пошук закінчено")
  47. x1 = max_loc[0] + 20
  48. y1 = max_loc[1] + 20
  49. coo3 = [[x1, y1]]
  50. end = time.time() - start
  51. print(f"--- Етап 1. Завершено за {end} секунд")
  52. return coo1, coo2, coo3
  53. def move_and_click(coo, d, no=False):
  54. for c in coo:
  55. pydirectinput.moveTo(c[0], c[1])
  56. pydirectinput.click()
  57. if no:
  58. time.sleep(np.random.uniform(*d))
  59. def work(d1, d2):
  60. start = time.time()
  61. coo1, coo2, coo3 = detect()
  62. start_1 = time.time()
  63. print("--- Етап 2. Малювання і відправка")
  64. print(" --- Малювання квадрату 1")
  65. move_and_click(coo1, d2)
  66. print(" --- Малювання квадрату 2")
  67. move_and_click(coo2, d2)
  68. print(" --- Відправка")
  69. move_and_click([coo3[0], coo3[0], coo3[0]], d2, True)
  70. end = time.time() - start
  71. print(f"--- Етап 2. Завершено за {(time.time() - start_1)} секунд.")
  72. if end <= 13:
  73. pause = (13 - end) + np.random.uniform(*d2) + d1
  74. print(" ---- Етап 1 + Етап 2 виконано менше ніж за 13 секунд.")
  75. print(f" ---- Додаткова випадкова пауза {pause} секунд")
  76. time.sleep(pause)
  77. def main(rep, d1, d2):
  78. print(f"Буде зроблено {rep} повторів")
  79. print(f"Затримка перед наступним завданням {d1} секунд")
  80. print(f"Затримка між кліками миші між {d2[0]} і {d2[1]} секунд")
  81. print("Робота почнеться через 5 секунд. Перемкніться на гру із відкритим"\
  82. " Діскавері")
  83. time.sleep(5)
  84. for _ in range(rep):
  85. print(f"{''.join([' ' for _ in range(30)])}-- {(_ + 1)} / {rep} --")
  86. try:
  87. work(d1, d2)
  88. time.sleep(d1)
  89. except ValueError as e:
  90. print("ОЧІКУВАНА ПОМИЛКА: \n", e)
  91. print(f"Повторна спроба через {d1} секунд.")
  92. print("Якщо так і продовжиться збільш затримку між завданнями")
  93. time.sleep(d1)
  94. work(d1, d2)
  95. def help_():
  96. print(f"""
  97. {sys.argv[0]} має такі параметри:
  98. -h,--help - виклик цієї справки(також буде виведено без аргументів, але
  99. продовжить роботу із параметрами по замовчанню)
  100. -r <ціле число> - кількість повторів (по замовчанню = 100)
  101. -d1 <ціле число> - затримка перед наступним завданням у секундах
  102. (по замовчанню = 2)
  103. -d2 <ціле число/дріб-ціле число/дріб>
  104. - випадкова затримка між кліками миші в секундах
  105. (по замовчанню = 0.6-1)
  106. """)
  107. def args_manager(arg, one=False):
  108. if arg in sys.argv:
  109. return True if one else sys.argv[sys.argv.index(arg)+1]
  110. return False
  111. if __name__ == "__main__":
  112. print("Вікно командного рядка закріплено поверх інших вікон.")
  113. hwnd = win32gui.GetForegroundWindow()
  114. rect = list(win32gui.GetWindowRect(hwnd))
  115. rect[2] = 700
  116. rect[3] = 480
  117. win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST, *rect ,0)
  118. am = args_manager
  119. if len(sys.argv) < 2:
  120. help_()
  121. if am("-h", True) or am("--help", True):
  122. help_()
  123. exit(0)
  124. rep = 100
  125. d1 = 3
  126. d2 = [0.6, 1]
  127. try:
  128. if am("-r"):
  129. rep = int(am("-r"))
  130. if am("-d1"):
  131. d1 = int(am("-d1"))
  132. if am("-d2"):
  133. d2_ = am("-d2").split("-")
  134. d2 = [float(d2_[0]), float(d2_[1])]
  135. except Exception as e:
  136. print(f"Щось пішло не так. Помилка:\n{e} ")
  137. win32gui.SetWindowPos(hwnd,win32con.HWND_NOTOPMOST, *rect ,0)
  138. print("Вікно командного рядка відкріплено")
  139. exit(1)
  140. try:
  141. start = time.time()
  142. main(rep, d1, d2)
  143. end = time.time() - start
  144. print(f"Загальний час виконання {end} секунд ({(end / 60)} хвилин)")
  145. except ValueError as e:
  146. print(f"ПОМИЛКА:\n{e} ")
  147. print("""
  148. Можливо вікно проекту Діскавері щось перекриває.
  149. Спробуй знову, але так, щоб нічого не перекривало
  150. кнопку відправки і лівий верхній квадрат із 25 малих
  151. сірих квадратів.
  152. Або збільш затримку між завданнями
  153. """)
  154. except Exception as e:
  155. print(f"НЕОЧІКУВАНА ПОМИЛКА:\n{e} ")
  156. exit(1)
  157. finally:
  158. win32gui.SetWindowPos(hwnd,win32con.HWND_NOTOPMOST, *rect ,0)
  159. print("Вікно командного рядка відкріплено")