├── AutoClikerBlum ├── README.md ├── main.py ├── requirements.txt └── template_png │ ├── captcha.png │ ├── close_button.png │ ├── template_play_button.png │ └── template_play_button1.png └── README.md /AutoClikerBlum/README.md: -------------------------------------------------------------------------------- 1 | # AutoCliker-Blum 2 | AutoClicker Blum - это адаптированный и улучшенный автокликер для автоматизации процесса сбора звёздочек в играх Blum. Софт поддерживает рандомизацию сбора звёздочек и автоматический запуск игр, пока не кончатся билеты. 3 | 4 | # Авторство 5 | Обсуждение софта и его работы происходит в [Telegram](https://t.me/YOSHIDACRYPTO). Изначальный код для доработки был взят [ТУТ](https://github.com/ndkwa/blum-autocliker). 6 | 7 | # Инструкция запуска скрипта AutoCliker Blum 8 | 9 | ### Шаг 1: Скачайте и установите Python 10 | Скачайте и установите Python последней версии с [python.org](https://www. 11 | python.org/). 12 | Обязательно отметьте опцию "Add Python to PATH" перед установкой. 13 | 14 | ### Шаг 2: Проверьте установку Python и pip 15 | Откройте командную строку и введите следующие команды для проверки установки Python и pip: 16 | ```sh 17 | python --version 18 | pip --version 19 | ``` 20 | ### Шаг 3: Скачайте код AutoCliker Blum с GitHub 21 | [КЛИК](https://github.com/Tess-OK/AutoClickerBlum) 22 | 23 | ### Шаг 4: Установите зависимости 24 | В командной строке перейдите в папку с файлами проекта и установите зависимости: 25 | ```sh 26 | cd путь/к/вашей/папке 27 | pip install -r requirements.txt 28 | ``` 29 | Для запуска командной строки сразу в нужной папке, можете ввести cmd в адресной строке папки. 30 | 31 | ### Шаг 5: Запустите бота в TelegramDesktop или Web версии. 32 | Скрипт поддерживает обе версии. 33 | 34 | ### Шаг 6: Запустите скрипт 35 | Запустите скрипт командой: 36 | ```sh 37 | python main.py 38 | ``` 39 | ### Шаг 7: Выберите окно с открытым Blum 40 | Укажите предложенный порядковый номер 41 | 42 | ### Шаг 8: Введите значение от 0 до 1 для рандомизации прокликивания звезд, где 1 означает сбор всех звезд. 43 | Выбор величины зависит от множества факторов: размера экрана, окна и т.д. Я выбираю значения 0.04 - 0.06 для сбора около 140-150 звезд. Вам необходимо самостоятельно подобрать необходимое значение. 44 | 45 | ### Шаг 9: Начало работы 46 | Нажмите F6 для начала работы скрипта. 47 | 48 | # Дополнительные рекомендации по работе: 49 | - Уменьшайте размер окна с игрой так, чтобы вокруг него не было полей. Скрипт иногда может кликнуть мимо окна с игрой и появится окно с информацией о закрытии игры. 50 | 51 | 52 | -------------------------------------------------------------------------------- /AutoClikerBlum/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import random 4 | import math 5 | import cv2 6 | import keyboard 7 | import mss 8 | import numpy as np 9 | import pygetwindow as gw 10 | import win32api 11 | import win32con 12 | import warnings 13 | from pywinauto import Application 14 | 15 | # Интервал проверки кнопки "Play" в секундах 16 | CHECK_INTERVAL = 5 17 | 18 | warnings.filterwarnings("ignore", category=UserWarning, module='pywinauto') 19 | 20 | 21 | def list_windows_by_title(title_keywords): 22 | windows = gw.getAllWindows() 23 | filtered_windows = [] 24 | for window in windows: 25 | for keyword in title_keywords: 26 | if keyword.lower() in window.title.lower(): 27 | filtered_windows.append((window.title, window._hWnd)) 28 | break 29 | return filtered_windows 30 | 31 | 32 | class Logger: 33 | def __init__(self, prefix=None): 34 | self.prefix = prefix 35 | 36 | def log(self, data: str): 37 | if self.prefix: 38 | print(f"{self.prefix} {data}") 39 | else: 40 | print(data) 41 | 42 | 43 | class AutoClicker: 44 | def __init__(self, hwnd, target_colors_hex, nearby_colors_hex, threshold, logger, target_percentage): 45 | self.hwnd = hwnd 46 | self.target_colors_hex = target_colors_hex 47 | self.nearby_colors_hex = nearby_colors_hex 48 | self.threshold = threshold 49 | self.logger = logger 50 | self.target_percentage = target_percentage 51 | self.running = False 52 | self.clicked_points = [] 53 | self.iteration_count = 0 54 | self.last_check_time = time.time() 55 | 56 | @staticmethod 57 | def hex_to_hsv(hex_color): 58 | hex_color = hex_color.lstrip('#') 59 | h_len = len(hex_color) 60 | rgb = tuple(int(hex_color[i:i + h_len // 3], 16) for i in range(0, h_len, h_len // 3)) 61 | rgb_normalized = np.array([[rgb]], dtype=np.uint8) 62 | hsv = cv2.cvtColor(rgb_normalized, cv2.COLOR_RGB2HSV) 63 | return hsv[0][0] 64 | 65 | @staticmethod 66 | def click_at(x, y): 67 | try: 68 | if not (0 <= x < win32api.GetSystemMetrics(0) and 0 <= y < win32api.GetSystemMetrics(1)): 69 | raise ValueError(f"Координаты вне пределов экрана: ({x}, {y})") 70 | win32api.SetCursorPos((x, y)) 71 | win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0) 72 | win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0) 73 | except Exception as e: 74 | print(f"Ошибка при установке позиции курсора: {e}") 75 | 76 | def toggle_script(self): 77 | self.running = not self.running 78 | r_text = "вкл" if self.running else "выкл" 79 | self.logger.log(f'Статус изменен: {r_text}') 80 | 81 | def is_near_color(self, hsv_img, center, target_hsvs, radius=8): 82 | x, y = center 83 | height, width = hsv_img.shape[:2] 84 | for i in range(max(0, x - radius), min(width, x + radius + 1)): 85 | for j in range(max(0, y - radius), min(height, y + radius + 1)): 86 | distance = math.sqrt((x - i) ** 2 + (y - j) ** 2) 87 | if distance <= radius: 88 | pixel_hsv = hsv_img[j, i] 89 | for target_hsv in target_hsvs: 90 | if np.allclose(pixel_hsv, target_hsv, atol=[1, 50, 50]): 91 | return True 92 | return False 93 | 94 | def check_and_click_play_button(self, sct, monitor): 95 | current_time = time.time() 96 | if current_time - self.last_check_time >= CHECK_INTERVAL: 97 | self.last_check_time = current_time 98 | templates = [ 99 | cv2.imread(os.path.join("template_png", "template_play_button.png"), cv2.IMREAD_GRAYSCALE), 100 | cv2.imread(os.path.join("template_png", "template_play_button1.png"), cv2.IMREAD_GRAYSCALE), 101 | cv2.imread(os.path.join("template_png", "close_button.png"), cv2.IMREAD_GRAYSCALE), 102 | cv2.imread(os.path.join("template_png", "captcha.png"), cv2.IMREAD_GRAYSCALE) # Добавление нового шаблона 103 | ] 104 | 105 | for template in templates: 106 | if template is None: 107 | self.logger.log("Не удалось загрузить файл шаблона.") 108 | continue 109 | 110 | template_height, template_width = template.shape 111 | 112 | img = np.array(sct.grab(monitor)) 113 | img_gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY) 114 | 115 | res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) 116 | loc = np.where(res >= self.threshold) 117 | 118 | matched_points = list(zip(*loc[::-1])) 119 | 120 | if matched_points: 121 | pt_x, pt_y = matched_points[0] 122 | cX = pt_x + template_width // 2 + monitor["left"] 123 | cY = pt_y + template_height // 2 + monitor["top"] 124 | 125 | self.click_at(cX, cY) 126 | self.logger.log(f'Нажал на кнопку: {cX} {cY}') 127 | self.clicked_points.append((cX, cY)) 128 | break # Остановить проверку после первого найденного совпадения 129 | 130 | 131 | def click_color_areas(self): 132 | app = Application().connect(handle=self.hwnd) 133 | window = app.window(handle=self.hwnd) 134 | window.set_focus() 135 | 136 | target_hsvs = [self.hex_to_hsv(color) for color in self.target_colors_hex] 137 | nearby_hsvs = [self.hex_to_hsv(color) for color in self.nearby_colors_hex] 138 | 139 | with mss.mss() as sct: 140 | keyboard.add_hotkey('F6', self.toggle_script) 141 | 142 | while True: 143 | if self.running: 144 | rect = window.rectangle() 145 | monitor = { 146 | "top": rect.top, 147 | "left": rect.left, 148 | "width": rect.width(), 149 | "height": rect.height() 150 | } 151 | img = np.array(sct.grab(monitor)) 152 | img_bgr = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) 153 | hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV) 154 | 155 | for target_hsv in target_hsvs: 156 | lower_bound = np.array([max(0, target_hsv[0] - 1), 30, 30]) 157 | upper_bound = np.array([min(179, target_hsv[0] + 1), 255, 255]) 158 | mask = cv2.inRange(hsv, lower_bound, upper_bound) 159 | contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 160 | 161 | num_contours = len(contours) 162 | num_to_click = int(num_contours * self.target_percentage) 163 | contours_to_click = random.sample(contours, num_to_click) 164 | 165 | for contour in reversed(contours_to_click): 166 | if cv2.contourArea(contour) < 6: 167 | continue 168 | 169 | M = cv2.moments(contour) 170 | if M["m00"] == 0: 171 | continue 172 | cX = int(M["m10"] / M["m00"]) + monitor["left"] 173 | cY = int(M["m01"] / M["m00"]) + monitor["top"] 174 | 175 | if not self.is_near_color(hsv, (cX - monitor["left"], cY - monitor["top"]), nearby_hsvs): 176 | continue 177 | 178 | if any(math.sqrt((cX - px) ** 2 + (cY - py) ** 2) < 35 for px, py in self.clicked_points): 179 | continue 180 | cY += 5 181 | self.click_at(cX, cY) 182 | self.logger.log(f'Нажал: {cX} {cY}') 183 | self.clicked_points.append((cX, cY)) 184 | 185 | self.check_and_click_play_button(sct, monitor) 186 | time.sleep(0.1) 187 | self.iteration_count += 1 188 | if self.iteration_count >= 5: 189 | self.clicked_points.clear() 190 | self.iteration_count = 0 191 | 192 | 193 | if __name__ == "__main__": 194 | current_dir = os.path.dirname(os.path.abspath(__file__)) 195 | os.chdir(current_dir) 196 | 197 | keywords = ["Blum", "Telegram"] 198 | windows = list_windows_by_title(keywords) 199 | 200 | if not windows: 201 | print("Нет окон, содержащих указанные ключевые слова Blum или Telegram.") 202 | exit() 203 | 204 | print("Доступные окна для выбора:") 205 | for i, (title, hwnd) in enumerate(windows): 206 | print(f"{i + 1}: {title}") 207 | 208 | choice = int(input("Введите номер окна, в котором открыт бот Blum: ")) - 1 209 | if choice < 0 or choice >= len(windows): 210 | print("Неверный выбор.") 211 | exit() 212 | 213 | hwnd = windows[choice][1] 214 | 215 | while True: 216 | try: 217 | target_percentage = input("Введите значение от 0 до 1 для рандомизации прокликивания звезд, где 1 означает сбор всех звезд. (Выбор величины зависит от множества факторов: размера экрана, окна и т.д.) Я выбираю значения 0.04 - 0.06 для сбора около 140-150 звезд. Вам необходимо самостоятельно подобрать необходимое значение: ") 218 | target_percentage = target_percentage.replace(',', '.') 219 | target_percentage = float(target_percentage) 220 | if 0 <= target_percentage <= 1: 221 | break 222 | else: 223 | print("Пожалуйста, введите значение от 0 до 1.") 224 | except ValueError: 225 | print("Неверный формат. Пожалуйста, введите число.") 226 | 227 | logger = Logger("[https://t.me/YOSHIDACRYPTO]") 228 | logger.log("Вас приветствует бесплатный скрипт - автокликер для игры Blum") 229 | logger.log('После запуска мини игры нажимайте клавишу F6 на клавиатуре') 230 | target_colors_hex = ["#c9e100", "#bae70e"] 231 | nearby_colors_hex = ["#abff61", "#87ff27"] 232 | threshold = 0.8 # Порог совпадения шаблона 233 | 234 | auto_clicker = AutoClicker(hwnd, target_colors_hex, nearby_colors_hex, threshold, logger, target_percentage) 235 | try: 236 | auto_clicker.click_color_areas() 237 | except Exception as e: 238 | logger.log(f"Произошла ошибка: {e}") 239 | for i in reversed(range(5)): 240 | print(f"Скрипт завершит работу через {i}") 241 | time.sleep(1) -------------------------------------------------------------------------------- /AutoClikerBlum/requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | opencv-python 3 | keyboard 4 | mss 5 | pygetwindow 6 | pywin32 7 | pywinauto -------------------------------------------------------------------------------- /AutoClikerBlum/template_png/captcha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tess-OK/AutoClickerBlum/e1ae70234ebb43134388a1dbb42cbbf051e41dff/AutoClikerBlum/template_png/captcha.png -------------------------------------------------------------------------------- /AutoClikerBlum/template_png/close_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tess-OK/AutoClickerBlum/e1ae70234ebb43134388a1dbb42cbbf051e41dff/AutoClikerBlum/template_png/close_button.png -------------------------------------------------------------------------------- /AutoClikerBlum/template_png/template_play_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tess-OK/AutoClickerBlum/e1ae70234ebb43134388a1dbb42cbbf051e41dff/AutoClikerBlum/template_png/template_play_button.png -------------------------------------------------------------------------------- /AutoClikerBlum/template_png/template_play_button1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tess-OK/AutoClickerBlum/e1ae70234ebb43134388a1dbb42cbbf051e41dff/AutoClikerBlum/template_png/template_play_button1.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AutoCliker-Blum 2 | AutoClicker Blum - это адаптированный и улучшенный автокликер для автоматизации процесса сбора звёздочек в играх Blum. Софт поддерживает рандомизацию сбора звёздочек и автоматический запуск игр, пока не кончатся билеты. 3 | 4 | # Авторство 5 | Обсуждение софта и его работы происходит в [Telegram](https://t.me/x_0xJohn). Изначальный код для доработки был взят [ТУТ](https://github.com/ndkwa/blum-autocliker). 6 | 7 | # Инструкция запуска скрипта AutoCliker Blum 8 | 9 | ### Шаг 1: Скачайте и установите Python 10 | Скачайте и установите Python последней версии с [python.org](https://www. 11 | python.org/). 12 | Обязательно отметьте опцию "Add Python to PATH" перед установкой. 13 | 14 | ### Шаг 2: Проверьте установку Python и pip 15 | Откройте командную строку и введите следующие команды для проверки установки Python и pip: 16 | ```sh 17 | python --version 18 | pip --version 19 | ``` 20 | ### Шаг 3: Скачайте код AutoCliker Blum с GitHub 21 | [КЛИК](https://github.com/Tess-OK/AutoClickerBlum) 22 | 23 | ### Шаг 4: Установите зависимости 24 | В командной строке перейдите в папку с файлами проекта и установите зависимости: 25 | ```sh 26 | cd путь/к/вашей/папке 27 | pip install -r requirements.txt 28 | ``` 29 | Для запуска командной строки сразу в нужной папке, можете ввести cmd в адресной строке папки. 30 | 31 | ### Шаг 5: Запустите бота в TelegramDesktop или Web версии. 32 | Скрипт поддерживает обе версии. 33 | 34 | ### Шаг 6: Запустите скрипт 35 | Запустите скрипт командой: 36 | ```sh 37 | python main.py 38 | ``` 39 | ### Шаг 7: Выберите окно с открытым Blum 40 | Укажите предложенный порядковый номер 41 | 42 | ### Шаг 8: Введите значение от 0 до 1 для рандомизации прокликивания звезд, где 1 означает сбор всех звезд. 43 | Выбор величины зависит от множества факторов: размера экрана, окна и т.д. Я выбираю значения 0.04 - 0.06 для сбора около 140-150 звезд. Вам необходимо самостоятельно подобрать необходимое значение. 44 | 45 | ### Шаг 9: Начало работы 46 | Нажмите F6 для начала работы скрипта. 47 | 48 | # Дополнительные рекомендации по работе: 49 | - Уменьшайте размер окна с игрой так, чтобы вокруг него не было полей. Скрипт иногда может кликнуть мимо окна с игрой и появится окно с информацией о закрытии игры. 50 | 51 | 52 | --------------------------------------------------------------------------------