import asyncio
import random
import sys
from datetime import datetime
from playwright.async_api import async_playwright
USER_DATA_DIR = "./user_data"
URL = "https://gag.gg/vote"
async def click_vote_button():
async with async_playwright() as p:
print(f"[{datetime.now().strftime('%H:%M:%S')}] Запуск браузера...")
# На Windows запускаем в фоновом режиме (headless=True)
context = await p.chromium.launch_persistent_context(
user_data_dir=USER_DATA_DIR,
headless=True,
args=[
"--start-maximized",
"--disable-blink-features=AutomationControlled"
]
)
page = await context.new_page()
await page.set_extra_http_headers({
"Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"
})
try:
print(f"Переход на {URL}...")
await page.goto(URL, wait_until="networkidle", timeout=60000)
await asyncio.sleep(random.uniform(3, 6))
auth_identifiers = ["login", "sign in", "roblox", "авторизоваться", "войти"]
page_text = (await page.content()).lower()
if any(id_text in page_text for id_text in auth_identifiers) and "vote" not in page_text:
print("⚠️ Предупреждение: Возможно, сессия устарела и требуется повторный вход!")
print("Поиск зеленой кнопки голосования (Like)...")
selectors = [
"button:has-text('Like')",
"button:has-text('Vote')",
"button.green",
"button[class*='like']",
"button[class*='vote']",
".like-button",
"svg[class*='green']",
"button:has(svg)"
]
vote_button = None
for selector in selectors:
try:
element = page.locator(selector).first
if await element.is_visible(timeout=2000):
vote_button = element
print(f"Кнопка найдена по селектору: {selector}")
break
except Exception:
continue
if vote_button:
await vote_button.hover()
await asyncio.sleep(random.uniform(0.5, 1.5))
await vote_button.click()
print(f"[{datetime.now().strftime('%H:%M:%S')}] Успешно проголосовали!")
await asyncio.sleep(5)
else:
print("❌ Кнопка голосования не найдена. Возможно, лимит голосов исчерпан.")
except Exception as e:
print(f"❌ Произошла ошибка во время выполнения: {e}")
finally:
await context.close()
async def main():
print("Бот для GaG.gg запущен и работает на Windows...")
while True:
try:
await click_vote_button()
except Exception as e:
print(f"Критическая ошибка в главном цикле: {e}")
delay = 3600 + random.randint(-240, 420)
next_run_min = delay // 60
print(f"Следующий цикл через {next_run_min} мин. Ожидание...\n")
await asyncio.sleep(delay)
if __name__ == "__main__":
if sys.platform == 'win32':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main())