commit 75ab583958f3a7a0280af07255392ec2badecea1 Author: synt-xerror <169557594+synt-xerror@users.noreply.github.com> Date: Wed Mar 11 16:22:52 2026 -0300 stable version diff --git a/main.py b/main.py new file mode 100644 index 0000000..08c282d --- /dev/null +++ b/main.py @@ -0,0 +1,91 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.common.keys import Keys +from webdriver_manager.chrome import ChromeDriverManager +import time +import pyperclip + +GRUPO = "notes" +BOT_PREFIX = "🤖 *BOT:* " +PROFILE_DIR = "/home/syntax/whatsapp-profile" +CHECK_INTERVAL = 0.5 + +def iniciar_driver(): + print("[DRIVER] Iniciando Chrome...") + opts = Options() + opts.add_argument(f"--user-data-dir={PROFILE_DIR}") + opts.add_argument("--profile-directory=Default") + opts.add_argument("--no-sandbox") + opts.add_argument("--disable-dev-shm-usage") + opts.add_argument("--disable-extensions") + opts.add_argument("--disable-gpu") + driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts) + driver.get("https://web.whatsapp.com") + wait = WebDriverWait(driver, 120) + print("[DRIVER] Aguardando QR Code ou login...") + wait.until(EC.presence_of_element_located((By.ID, "pane-side"))) + print("[DRIVER] WhatsApp Web carregado.") + return driver, wait + +def abrir_grupo(driver, wait): + print(f"[GRUPO] Procurando '{GRUPO}'...") + grupo_box = wait.until(EC.presence_of_element_located((By.XPATH, f'//span[@title="{GRUPO}"]'))) + grupo_box.click() + print(f"[GRUPO] Aberto.") + +def pegar_ultima_mensagem(driver): + msgs = driver.find_elements(By.CSS_SELECTOR, "[data-testid='selectable-text'] span") + if not msgs: + return None + return msgs[-1].text + +def enviar_mensagem(driver, wait, texto): + print(f"[ENVIO] Enviando: '{texto}'") + caixa = wait.until(EC.element_to_be_clickable(( + By.CSS_SELECTOR, "footer div[contenteditable='true'][role='textbox']" + ))) + caixa.click() + + pyperclip.copy(texto) + caixa.send_keys(Keys.CONTROL, 'v') + + time.sleep(0.3) + caixa.send_keys(Keys.ENTER) + print("[ENVIO] Mensagem enviada.") + +def bot_msg(texto): + return f"{BOT_PREFIX}{texto}" + +def processar_comando(texto): + if texto == "!bot ping": + return bot_msg("pong 🏓") + return None + +# ----------------------------- +driver, wait = iniciar_driver() +abrir_grupo(driver, wait) +ultima_mensagem = None + + +while True: + try: + texto = pegar_ultima_mensagem(driver) + if not texto or texto == ultima_mensagem: + time.sleep(CHECK_INTERVAL) + continue + + print(f"[MSG] Nova mensagem: '{texto}'") + ultima_mensagem = texto + time.sleep(CHECK_INTERVAL) + + resposta = processar_comando(texto) + if resposta: + enviar_mensagem(driver, wait, resposta) + + except Exception as e: + print(f"[ERRO] {type(e).__name__}: {e}") + time.sleep(1) \ No newline at end of file