Решил попробовать написать ботов для slither.io ради интереса, реализовал это на selenium на откуда сразу несколько проблем - работа со вкладками замедляет запуск ботов и с большим кол-вом ботов (даже с 10) уже перестает закидывать ботов в игру, понятное дело проблемы с нагрузкой на процессор и с памятью. Подскажите можно ли реализовать данную идею с Python и какие библиотеки использовать? На данный момент функционал такой: TARGET_SERVER_ID - сервер на который закидывать ботов MAX_TABS_PER_BROWSER - максимальное кол-во вкладок в одном браузере TOTAL_BOTS - общее кол-во ботов NICKNAME - единый никнейм для всех ботов import math import time import threading from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # ----------------------------- # Настройки # ----------------------------- TOTAL_BOTS = 10 MAX_TABS_PER_BROWSER = 5 NICKNAME = "Sosiska" URL = "http://slither.com/io" BUTTON_SELECTOR = "div.btnt.nsi.sadg1" # Кнопка Play TARGET_SERVER_ID = "3215" def pick_server_in_tab(driver, wait): try: choose_server_button = wait.until( EC.element_to_be_clickable((By.ID, "csrv")) ) choose_server_button.click() time.sleep(1) all_servers = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.svi.nsi")) ) print("Все доступные сервера:") for s in all_servers: print(" >", repr(s.text)) found = False for server_div in all_servers: text = server_div.text.strip() if TARGET_SERVER_ID in text: driver.execute_script("arguments[0].scrollIntoView(true);", server_div) time.sleep(0.3) driver.execute_script("arguments[0].click();", server_div) print(f"Сервер {TARGET_SERVER_ID} выбран!") found = True break if not found: raise Exception(f"Сервер {TARGET_SERVER_ID} не найден!") time.sleep(1) except Exception as e: print(f"Ошибка при выборе сервера: {e}") def set_nickname(driver, wait, nickname): try: nick_input = wait.until( EC.presence_of_element_located((By.ID, "nick")) ) nick_input.clear() nick_input.send_keys(nickname) print(f"Установлен ник: {nickname}") time.sleep(1) except Exception as e: print(f"Ошибка при установке ника: {e}") def run_browser_instance(browser_index, tabs_count): chrome_options = Options() chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") # chrome_options.add_argument("--headless") driver = webdriver.Chrome(options=chrome_options) driver.get("about:blank") for i in range(tabs_count - 1): driver.execute_script(f"window.open('{URL}', '_blank');") tab_handles = driver.window_handles for handle in tab_handles: driver.switch_to.window(handle) driver.get(URL) wait = WebDriverWait(driver, 30) for tab_index, handle in enumerate(tab_handles): driver.switch_to.window(handle) pick_server_in_tab(driver, wait) set_nickname(driver, wait, NICKNAME) try: while True: for tab_index, handle in enumerate(tab_handles): driver.switch_to.window(handle) try: button = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, BUTTON_SELECTOR)) ) ActionChains(driver).move_to_element(button).click(button).perform() print(f"[Браузер {browser_index} - Вкладка {tab_index}] Кнопка Play нажата") except Exception as e: print(f"[Браузер {browser_index} - Вкладка {tab_index}] Нет кнопки Play или ошибка: {e}") time.sleep(0.5) # задержка между вкладками time.sleep(5) # небольшая пауза после обхода вкладок except KeyboardInterrupt: print(f"[Браузер {browser_index}] Остановка скрипта (Ctrl+C).") finally: driver.quit() def main(): num_browsers = math.ceil(TOTAL_BOTS / MAX_TABS_PER_BROWSER) print(f"Нужно открыть {TOTAL_BOTS} ботов -> {num_browsers} браузеров, каждый до {MAX_TABS_PER_BROWSER} вкладок.") threads = [] remaining_bots = TOTAL_BOTS for i in range(num_browsers): tabs_for_this_browser = min(remaining_bots, MAX_TABS_PER_BROWSER) remaining_bots -= tabs_for_this_browser t = threading.Thread( target=run_browser_instance, args=(i, tabs_for_this_browser), daemon=True ) t.start() threads.append(t) try: for t in threads: t.join() except KeyboardInterrupt: print("Главный поток: KeyboardInterrupt - завершаем программу.") if __name__ == "__main__": main() Код import math import time import threading from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # ----------------------------- # Настройки # ----------------------------- TOTAL_BOTS = 10 MAX_TABS_PER_BROWSER = 5 NICKNAME = "Sosiska" URL = "http://slither.com/io" BUTTON_SELECTOR = "div.btnt.nsi.sadg1" # Кнопка Play TARGET_SERVER_ID = "3215" def pick_server_in_tab(driver, wait): try: choose_server_button = wait.until( EC.element_to_be_clickable((By.ID, "csrv")) ) choose_server_button.click() time.sleep(1) all_servers = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.svi.nsi")) ) print("Все доступные сервера:") for s in all_servers: print(" >", repr(s.text)) found = False for server_div in all_servers: text = server_div.text.strip() if TARGET_SERVER_ID in text: driver.execute_script("arguments[0].scrollIntoView(true);", server_div) time.sleep(0.3) driver.execute_script("arguments[0].click();", server_div) print(f"Сервер {TARGET_SERVER_ID} выбран!") found = True break if not found: raise Exception(f"Сервер {TARGET_SERVER_ID} не найден!") time.sleep(1) except Exception as e: print(f"Ошибка при выборе сервера: {e}") def set_nickname(driver, wait, nickname): try: nick_input = wait.until( EC.presence_of_element_located((By.ID, "nick")) ) nick_input.clear() nick_input.send_keys(nickname) print(f"Установлен ник: {nickname}") time.sleep(1) except Exception as e: print(f"Ошибка при установке ника: {e}") def run_browser_instance(browser_index, tabs_count): chrome_options = Options() chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") # chrome_options.add_argument("--headless") driver = webdriver.Chrome(options=chrome_options) driver.get("about:blank") for i in range(tabs_count - 1): driver.execute_script(f"window.open('{URL}', '_blank');") tab_handles = driver.window_handles for handle in tab_handles: driver.switch_to.window(handle) driver.get(URL) wait = WebDriverWait(driver, 30) for tab_index, handle in enumerate(tab_handles): driver.switch_to.window(handle) pick_server_in_tab(driver, wait) set_nickname(driver, wait, NICKNAME) try: while True: for tab_index, handle in enumerate(tab_handles): driver.switch_to.window(handle) try: button = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, BUTTON_SELECTOR)) ) ActionChains(driver).move_to_element(button).click(button).perform() print(f"[Браузер {browser_index} - Вкладка {tab_index}] Кнопка Play нажата") except Exception as e: print(f"[Браузер {browser_index} - Вкладка {tab_index}] Нет кнопки Play или ошибка: {e}") time.sleep(0.5) # задержка между вкладками time.sleep(5) # небольшая пауза после обхода вкладок except KeyboardInterrupt: print(f"[Браузер {browser_index}] Остановка скрипта (Ctrl+C).") finally: driver.quit() def main(): num_browsers = math.ceil(TOTAL_BOTS / MAX_TABS_PER_BROWSER) print(f"Нужно открыть {TOTAL_BOTS} ботов -> {num_browsers} браузеров, каждый до {MAX_TABS_PER_BROWSER} вкладок.") threads = [] remaining_bots = TOTAL_BOTS for i in range(num_browsers): tabs_for_this_browser = min(remaining_bots, MAX_TABS_PER_BROWSER) remaining_bots -= tabs_for_this_browser t = threading.Thread( target=run_browser_instance, args=(i, tabs_for_this_browser), daemon=True ) t.start() threads.append(t) try: for t in threads: t.join() except KeyboardInterrupt: print("Главный поток: KeyboardInterrupt - завершаем программу.") if __name__ == "__main__": main()