Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. import cv2
  2. import enum
  3. import numpy as np
  4. import pytesseract
  5. import win32gui
  6. import win32ui
  7. import win32con
  8. import time
  9. from ctypes import windll
  10. from PIL import Image
  11.  
  12. class State(enum.Enum):
  13. START = 1
  14. FISHING = 2
  15. KEYS = 3
  16. CATCH = 4
  17. UNKNOWN = 5
  18. RESTART = 6
  19. END = 7
  20.  
  21.  
  22. class Screenshot(object):
  23. def __init__(self, screen=None, image=None):
  24. self.screen = screen
  25. self.image = image
  26.  
  27. def takeScreenshot(self):
  28. try:
  29. left, top, right, bot = win32gui.GetWindowRect(hwnd)
  30. w = right - left
  31. h = bot - top
  32.  
  33. hwndDC = win32gui.GetWindowDC(hwnd)
  34. mfcDC = win32ui.CreateDCFromHandle(hwndDC)
  35. saveDC = mfcDC.CreateCompatibleDC()
  36.  
  37. saveBitMap = win32ui.CreateBitmap()
  38. saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
  39.  
  40. saveDC.SelectObject(saveBitMap)
  41. saveDC.BitBlt((0,0),(w, h),mfcDC,(0,0),win32con.SRCCOPY)
  42.  
  43. bmpinfo = saveBitMap.GetInfo()
  44. bmpstr = saveBitMap.GetBitmapBits(True)
  45.  
  46. self.screen = Image.frombuffer(
  47. 'RGB',
  48. (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
  49. bmpstr, 'raw', 'BGRX', 0, 1)
  50. finally:
  51. win32gui.DeleteObject(saveBitMap.GetHandle())
  52. saveDC.DeleteDC()
  53. mfcDC.DeleteDC()
  54. win32gui.ReleaseDC(hwnd, hwndDC)
  55.  
  56. def crop(self, area):
  57. img = self.screen.crop(area) # crop image from screenshot
  58. img = np.array(img) # convert to cv2 image
  59. self.image = img[:, :, ::-1].copy()
  60.  
  61. def convertToBinary(self):
  62. img_gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY) # convert to grayscale
  63. self.image = cv2.threshold(img_gray,128,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]
  64.  
  65. def getText(self, config = ''):
  66. return pytesseract.image_to_string(self.image, config=config)
  67.  
  68. def getStartPos(self):
  69. for x in range(0, 50):
  70. for y in range(0, 50):
  71. r, g, b = self.image[x, y]
  72. color = int(r) + int(g) + int(b)
  73. if color_min < color < color_max:
  74. return (x+8, y+7)
  75. return (8, 7)
  76.  
  77. def GetWindow(title_name, exact = False):
  78. def enum_handler(hwnd, all_windows):
  79. all_windows.append((hwnd, win32gui.GetWindowText(hwnd)))
  80. windows = []
  81. hwnds = []
  82. win32gui.EnumWindows(enum_handler, windows)
  83. if exact:
  84. hwnds = [hwnd for hwnd, title in windows if title_name == title.lower()]
  85. else:
  86. hwnds = [hwnd for hwnd, title in windows if title_name in title.lower()]
  87. return hwnds[0] if hwnds else None
  88.  
  89. def GetState():
  90. screen.takeScreenshot()
  91. screen.crop(areas['START'])
  92. screen.convertToBinary()
  93. if screen.getText().lower().startswith('start'):
  94. return State.START
  95. screen.crop(areas['FISHING'])
  96. screen.convertToBinary()
  97. if screen.getText().lower().startswith('fishing'):
  98. return State.FISHING
  99. screen.crop(areas['BITE'])
  100. screen.convertToBinary()
  101. if screen.getText().lower().startswith('bite'):
  102. return State.FISHING
  103. return State.UNKNOWN
  104.  
  105. def Start():
  106. current_state = State.START
  107. state_loops = 0
  108. while current_state != State.END:
  109. if current_state == State.START:
  110. screen.takeScreenshot()
  111.  
  112. screen.crop(areas['START'])
  113. screen.convertToBinary()
  114. if screen.getText().lower().startswith('start'):
  115. # PRESS SPACE
  116. print('START - Press space!')
  117. current_state = State.FISHING
  118. state_loops = 0
  119. time.sleep(30)
  120. else:
  121. current_state = State.UNKNOWN
  122. elif current_state == State.FISHING:
  123. print('FISHING')
  124. screen.takeScreenshot()
  125.  
  126. screen.crop(areas['BITE'])
  127. screen.convertToBinary()
  128. if screen.getText().lower().startswith('bite'):
  129. # PRESS SPACE
  130. print('BITE - Press space!')
  131. current_state = State.KEYS
  132. time.sleep(3)
  133. continue
  134.  
  135. # Check if still fishing
  136. screen.crop(areas['FISHING'])
  137. screen.convertToBinary()
  138. if not screen.getText().lower().startswith('fishing'):
  139. current_state = State.UNKNOWN
  140. time.sleep(2)
  141. elif current_state == State.KEYS:
  142. screen.takeScreenshot()
  143.  
  144. screen.crop(areas['KEYS'])
  145. pos = screen.getStartPos()
  146. img = screen.image[pos[0]:pos[0]+y_len, pos[1]:pos[1]+x_len]
  147.  
  148. # join letters to remove gaps between
  149. letters = []
  150. for i in range(0, 10):
  151. x_pos = i*l_len + i*gap_len
  152. letter = img[:, x_pos:x_pos+l_len]
  153. letters.append(letter)
  154. img = cv2.hconcat(letters)
  155.  
  156. # cv2.imwrite('img.jpg', img)
  157.  
  158. keys = screen.getText(config).upper()
  159. if keys and len(keys) > 1:
  160. # PRESS KEYS
  161. print('KEYS: {0}'.format(keys))
  162. current_state = State.CATCH
  163. state_loops = state_loops + 1
  164. if state_loops > 5:
  165. current_state = State.UNKNOWN
  166. elif current_state == State.CATCH:
  167. # PRESS SPACE
  168. print('CATCHED - START AGAIN!')
  169. current_state = State.START
  170. time.sleep(5)
  171. elif current_state == State.UNKNOWN:
  172. state = GetState()
  173. print('UNKNOWN STATUS - retrieved {0}'.format(str(state)))
  174. if state_loops > 5:
  175. current_state = State.RESTART
  176. elif state != State.UNKNOWN:
  177. current_state = state
  178. state_loops = 0
  179. else:
  180. state_loops = state_loops + 1
  181. time.sleep(1)
  182. elif current_state == State.RESTART:
  183. # TAKE OUT FISHING ROD AND START AGAIN
  184. # PRESS RIGHT MOUSE BUTTON
  185. print('RESTART!')
  186. current_state = State.START
  187. time.sleep(5)
  188. else:
  189. # TAKE OUT FISHING ROD AND START AGAIN
  190. # PRESS RIGHT MOUSE BUTTON
  191. print('DEFAULT STATUS = END')
  192. current_state = State.END
  193.  
  194. # begin of script
  195. pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files/Tesseract-OCR/tesseract'
  196. config = '-c tessedit_char_whitelist=WASD --psm 13'
  197. color_min = 150
  198. color_max = 200
  199. x_len = 355
  200. y_len = 22
  201. l_len = 18
  202. gap_len = 19
  203. areas = {
  204. 'START': (1098, 52, 1160, 82),
  205. 'FISHING': (830, 52, 912, 85),
  206. 'BITE': (842, 52, 891, 82),
  207. 'KEYS': (750, 330, 1160, 430),
  208. }
  209. hwnd = GetWindow('black desert')
  210. screen = Screenshot()
  211.  
  212. if hwnd:
  213. Start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement