"""2. Адаптированный бот для конкретного сайта""" from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options import fake_useragent import random import time import requests class OlgaVoteBot: def __init__(self): self.target_url = "https://eure-trainer-gesucht.de/trainer-innen/bayern/80331-munchen/sektion-oberland-des-dav-ev/olga-b" self.heart_selectors = [ # Основные селекторы для немецких сайтов "//button[contains(@class, 'like')]", "//button[contains(@class, 'vote')]", "//a[contains(@class, 'like')]", "//span[contains(@class, 'like')]", "//div[contains(@class, 'like')]", "//button[contains(@onclick, 'like')]", "//button[contains(@onclick, 'vote')]", "//*[contains(@class, 'herz')]", # Немецкое "сердце" "//*[contains(@class, 'stern')]", # Немецкое "звезда" "//*[contains(@data-action, 'like')]", "//*[contains(@data-function, 'vote')]", "//img[contains(@src, 'heart')]", "//img[contains(@alt, 'Like')]", "//img[contains(@alt, 'Herz')]", # Селекторы для рейтинга звездами "//span[contains(@class, 'rating')]//a[1]", "//div[contains(@class, 'stars')]//a[1]", "//*[contains(@class, 'star')][1]" ] def setup_driver(self): """Настройка драйвера со случайными параметрами""" options = Options() # Случайный User-Agent ua = fake_useragent.UserAgent() options.add_argument(f'--user-agent={ua.random}') # Опции для обхода детекции options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # Случайное окно браузера width = random.randint(1200, 1920) height = random.randint(800, 1080) options.add_argument(f'--window-size={width},{height}') driver = webdriver.Chrome(options=options) # Скрытие WebDriver признаков driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") driver.execute_cdp_cmd('Network.setUserAgentOverride', { "userAgent": ua.random }) return driver def find_olga_heart(self, driver): """Поиск сердечка на странице Оли""" wait = WebDriverWait(driver, 10) for selector in self.heart_selectors: try: print(f"Пробуем селектор: {selector}") element = wait.until(EC.element_to_be_clickable((By.XPATH, selector))) # Проверяем, видимо ли элемент и находится в области просмотра if element.is_displayed() and element.is_enabled(): print(f"✅ Найден элемент: {selector}") return element except Exception as e: continue # Дополнительный поиск по тексту (немецкие варианты) text_selectors = [ "//*[contains(text(), 'Like')]", "//*[contains(text(), 'Gefällt mir')]", # Немецкий "нравится" "//*[contains(text(), 'Bewerten')]", # Немецкий "оценить" "//*[contains(text(), '❤')]", "//*[contains(text(), '★')]", "//*[contains(text(), 'Sterne')]" # Немецкий "звезды" ] for selector in text_selectors: try: element = wait.until(EC.element_to_be_clickable((By.XPATH, selector))) if element.is_displayed(): print(f"✅ Найден по тексту: {selector}") return element except: continue print("❌ Элемент голосования не найден") return None def human_like_interaction(self, driver, element): """Человекоподобное взаимодействие с элементом""" try: # Прокрутка к элементу driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", element) time.sleep(random.uniform(0.5, 1.5)) # Случайное движение мыши action = webdriver.ActionChains(driver) # Движение к элементу с небольшими отклонениями action.move_to_element_with_offset(element, random.randint(-5, 5), random.randint(-5, 5)) action.pause(random.uniform(0.1, 0.3)) action.move_to_element(element) action.pause(random.uniform(0.2, 0.5)) # Клик action.click() action.perform() print("✅ Клик выполнен") return True except Exception as e: print(f"❌ Ошибка при клике: {e}") return False def simulate_human_browsing(self, driver): """Имитация человеческого просмотра страницы""" # Случайная прокрутка scroll_scripts = [ "window.scrollTo(0, document.body.scrollHeight * 0.3);", "window.scrollTo(0, document.body.scrollHeight * 0.7);", "window.scrollTo(0, document.body.scrollHeight);", "window.scrollBy(0, 500);" ] for script in random.sample(scroll_scripts, random.randint(1, 3)): driver.execute_script(script) time.sleep(random.uniform(1.0, 2.5)) def single_vote_attempt(self): """Одна попытка голосования""" driver = None try: print("\n=== Новая попытка голосования ===") # Настройка драйвера driver = self.setup_driver() # Загрузка страницы driver.get(self.target_url) time.sleep(random.uniform(3, 7)) # Имитация просмотра self.simulate_human_browsing(driver) # Поиск и клик на сердечко heart_element = self.find_olga_heart(driver) if heart_element: success = self.human_like_interaction(driver, heart_element) # Проверка результата time.sleep(random.uniform(2, 4)) # Сделаем скриншот для анализа driver.save_screenshot(f"vote_attempt_{int(time.time())}.png") if success: print("🎉 Голосование успешно!") return True else: print("⚠️ Элемент не найден, сохраняем скриншот для анализа") driver.save_screenshot("debug_no_element.png") return False except Exception as e: print(f"❌ Ошибка в попытке голосования: {e}") return False finally: if driver: driver.quit() def run_voting_campaign(self, total_votes=5): """Запуск кампании голосования""" successful_votes = 0 for attempt in range(total_votes): print(f"\n{'='*50}") print(f"Попытка {attempt + 1} из {total_votes}") print(f"Успешных голосов: {successful_votes}") print(f"{'='*50}") # Очистка cookies через новый сеанс браузера if self.single_vote_attempt(): successful_votes += 1 # Случайный интервал между попытками if attempt < total_votes - 1: # Не ждать после последней попытки delay = random.uniform(60, 300) # 1-5 минут print(f"⏰ Следующая попытка через {delay/60:.1f} минут") time.sleep(delay) print(f"\n🎊 Кампания завершена! Успешных голосов: {successful_votes}/{total_votes}") # Демонстрация работы (без реального запуска) def demonstrate_approach(): bot = OlgaVoteBot() print(""" ДЕМОНСТРАЦИЯ ПОДХОДА ДЛЯ САЙТА: https://eure-trainer-gesucht.de/trainer-innen/bayern/80331-munchen/sektion-oberland-des-dav-ev/olga-b Стратегия: 1. Анализ структуры страницы для поиска элемента голосования 2. Множественные селекторы для немецкого сайта 3. Человекоподобное поведение 4. Ротация User-Agent и параметров 5. Случайные интервалы между действиями Для реального использования необходимо: 1. Установить зависимости: selenium, fake-useragent, beautifulsoup4 2. Скачать ChromeDriver 3. Провести детальный анализ конкретного элемента голосования """) # Только анализ без реального голосования analyze_target_page() if __name__ == "__main__": demonstrate_approach()