"""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()