137 lines
4.5 KiB
Python
137 lines
4.5 KiB
Python
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
|
||
import random
|
||
|
||
GRUPO = "𝑩𝒂𝒕𝒆 𝒑𝒂𝒑𝒐"
|
||
BOT_PREFIX = "🤖 *ManyBot:* "
|
||
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}\n{texto}"
|
||
|
||
# -----------------------------
|
||
driver, wait = iniciar_driver()
|
||
abrir_grupo(driver, wait)
|
||
ultima_mensagem = None
|
||
|
||
def jogo():
|
||
n = random.randint(1, 100)
|
||
print(f"[JOGO] Jogo iniciado! Número escolhido: {n}")
|
||
enviar_mensagem(driver, wait, bot_msg("Hora do jogo! Tentem adivinhar qual número de 1 a 100 eu estou pensando!"))
|
||
|
||
while True:
|
||
try:
|
||
tentativa = pegar_ultima_mensagem(driver)
|
||
if not tentativa or tentativa == ultima_mensagem:
|
||
time.sleep(CHECK_INTERVAL)
|
||
continue
|
||
|
||
print(f"[JOGO] Nova tentativa: '{tentativa}'")
|
||
time.sleep(CHECK_INTERVAL)
|
||
|
||
if tentativa.isdigit():
|
||
num = int(tentativa)
|
||
|
||
if num == n:
|
||
enviar_mensagem(driver, wait, bot_msg(f"Parabéns! Você acertou!! O número era: {n}"))
|
||
break
|
||
elif num > n:
|
||
enviar_mensagem(driver, wait, bot_msg(f"Quase! Um pouco menor. Sua resposta: {num}"))
|
||
elif num < n:
|
||
enviar_mensagem(driver, wait, bot_msg(f"Quase! Um pouco maior. Sua resposta: {num}"))
|
||
|
||
except Exception as e:
|
||
print(f"[ERRO] {type(e).__name__}: {e}")
|
||
time.sleep(1)
|
||
|
||
def processar_comando(texto):
|
||
tokens = texto.split()
|
||
|
||
if tokens[0] == "!many":
|
||
if len(tokens) == 1: # se só tiver "!many"
|
||
return bot_msg(
|
||
"E aí?! Aqui está a lista de todos os meus comandos:\n"
|
||
"- `!many ping` -> testa se estou funcionando\n"
|
||
"- `!many jogo` -> jogo de adivinhação\n"
|
||
"E ai, vai querer qual? 😄"
|
||
)
|
||
|
||
elif tokens[1] == "ping":
|
||
return bot_msg("pong 🏓")
|
||
|
||
elif tokens[1] == "jogo":
|
||
jogo()
|
||
|
||
return 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) |