CanalQb - Ubuntu - Script Selenium Grid - Resolvendo Captcha
CanalQb - Ubuntu - Script Selenium Grid - Resolvendo Captcha
Bom amigos, no ultimo post, eu mostrei para vocês como controlar uma pagina remotamente, mas e dai por que eu fiz isso?
Para quem descobriu o Selenium Server agora, sabe que ele serve para varios processos de automação, e neste momento do post apenas vou ensinar a vocês como burlar o captcha da tela do login.
Imagine o cenário, tenho um script que precisa logar em uma pagina, e após, gerenciar uma automação.
Realmente é muito simples fazer isso em um sistema operacional com interface gráfica como por exemplo o Windows, mas e se seu sistema operacional não possuir interface gráfica, como a maioria das versões do Linux, como o Ubuntu 18.04, que você escolha apenas para automação?
Bom resolvendo o problema.
A primeira parte da configuração do selenium grid está no link: https://bit.ly/3WpPW55.
Após você validar que a primeira parte está funcionando, está na hora de criamos um script de teste, e vamos usar uma mineradora que possui como tela inicial o login, senha, e o captcha (nosso drama).
Este é o link da mineradora Miningness: https://bit.ly/3A7gHAU ( se registre para dar uma força)
Infelizmente esse exemplo para teste apenas será valido enquanto ela estiver no ar, rezemos para que dure uns 10 anos, kkkkk
Ao criar o registro, estamos liberados para usar o script, vou dividir em algumas partes, para facilitar.
Nesta primeira parte, vamos importar os módulos
import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.options import Options
Vamos configurar a etapa do acesso remoto, ser tiver dificuldade nesta parte, é por que você não seguiu o primeiro post, mencionado acima.
# Acesso Remotochrome_options_remoto = Options()chrome_options_remoto.add_argument("--disable-dev-shm-usage")driver_remoto = webdriver.Remote(command_executor="http://192.168.0.11:4444/wd/hub",options=chrome_options_remoto)
Lembrando que o IP 192.168.0.11 é meu IP do Windows, descubra qual o seu, e continuamos.
# Abrindo pagina no computador clientedriver_remoto.get("https://miningness.com/login")time.sleep(1)username_field = driver_remoto.find_element(By.NAME, "email").send_keys('variavel_login')password_field = driver_remoto.find_element(By.NAME, "password").send_keys('variavel_senha')captcha_resolvido = Falsewhile not captcha_resolvido:captcha_resolvido = input("\tResolva o captcha e digite 's' para continuar: ").lower() == 's'try:sign_in_button = driver_remoto.find_element(By.XPATH, "//button[@type='submit' and @class='btn btn--yellow']")sign_in_button.click()except:pass
Explicando esta parte acima, simplesmente ele se loga na pagina de login do miningness e então ele informa o login e a senha de acesso, por fim ele fica aguardando até que você resolva o captcha da pagina para ir para a próxima etapa do script.
Observe o print acima, o fundo em preto, é o terminal do meu servidor linux aberto em putty, e a frente é a tela do site, onde possui o captcha resolvido, então de acordo com o print, assim que o captcha for resolvido, voltamos para o putty, e digitamos s e pressionamos o enter.
E o script irá continuar se logando na pagina usando este pedaço do script.
sign_in_button = driver_remoto.find_element(By.XPATH, "//button[@type='submit' and @class='btn btn--yellow']")sign_in_button.click()
Após ele confirmar o processo de login, ele irá pegar todos os cookies, está parte pode até apresentar erro, dependendo do tempo que sua internet precisa para retornar informações, mas precisamos criar a lista de cookies para transferir para o webdriver local, para que nossos scripts continue rodando no computador server.
cookies_remoto = driver_remoto.get_cookies() # Obter os cookies remotosprint(cookies_remoto) #Use essa parte para validar se os cookies foram recebidos.time.sleep(1) # Esperando 1 segundo antes de continuar o Scriptdriver_remoto.quit() #Fechando o navegador remoto, visto que o captcha foi resolvido.
Agora vamos vamos alimentar o webdriver local no servidor Ubuntu, com os dados conseguidos no acesso remoto.
Primeiro iremos preparar o Webdriver local.
chrome_options = Options()chrome_options.add_argument("--headless")chrome_options.add_argument("--no-sandbox")chrome_options.add_argument("--disable-dev-shm-usage")driver_local = webdriver.Chrome(options=chrome_options)
Explicando os itens
- --headless: Essa opção é usada para executar o navegador em modo "headless", ou seja, sem uma interface gráfica. Ao ativar essa opção, o navegador será executado em segundo plano, sem abrir uma janela visível. Isso é útil quando você deseja executar testes automatizados ou raspagem de dados sem a necessidade de interagir com a interface gráfica do navegador.
- --no-sandbox: Essa opção é usada para desativar o "sandbox" do navegador. O sandbox é um mecanismo de segurança que isola o navegador do sistema operacional do computador, fornecendo uma camada adicional de proteção contra ataques maliciosos. No entanto, em alguns casos, essa opção pode ser necessária para contornar problemas de permissões ou restrições de ambiente.
- --disable-dev-shm-usage: Essa opção desativa o uso de uma área de memória compartilhada ("dev/shm") pelo navegador. Por padrão, o Chrome usa essa área de memória compartilhada para criar segmentos de memória temporários durante a execução. No entanto, em alguns ambientes, pode haver restrições ou problemas de permissões relacionados a essa área de memória compartilhada. Ao desativar o seu uso, você pode contornar esses problemas.
Entendido como é possível abrir o Google Chrome ou qualquer outro navegador, sem uma interface gráfica, então podemos continuar. Se deseja aprender como instalar, procure no meu blog, existe alguns posts ensinando instalar o Chromedriver e o Google Chrome, também o Brave.
Agora, vamos carregar uma pagina pode ser qualquer uma do site que você está tratando, no meu caso, é a pagina index do Miningness, vamos ver e tratar os cookies:
driver_local.get("https://miningness.com/")time.sleep(1)# Excluir todos os cookies locaisdriver_local.delete_all_cookies()driver_local.get("https://miningness.com/")# Excluir todos os cookies locaisdriver_local.delete_all_cookies()cookies_locais = {}for cookie in cookies_remoto:nome_cookie = cookie['name']if nome_cookie in cookies_locais:# Opção 1: Substituir o cookie existente# cookies_locais[nome_cookie] = cookie# Opção 2: Atualizar o valor do cookie existentecookies_locais[nome_cookie]['value'] = cookie['value']else:cookies_locais[nome_cookie] = cookiedriver_local.delete_all_cookies()# Adicionar os cookies locais ao WebDriver localfor cookie in cookies_locais.values():cookie_dict = {'name': cookie['name'],'value': cookie['value'],'path': cookie['path'],'domain': cookie['domain'],'secure': cookie['secure'],'httpOnly': cookie['httpOnly'],'expiry': cookie['expiry']}driver_local.add_cookie(cookie_dict)driver_local.get("https://miningness.com/user/profile")time.sleep(1)
Abra a pagina para alimentar os nomes das variáveis que será utilizada.
Espere 1 segundo, ou o tempo que você determinas.
Então exclua os Cookies, isso é uma etapa importante em vários sites, não pule.
Eu repeti essa etapa, para garantir que ele será deletado.
Após garanta uma variável, como uma lista limpa, usando {}
Então você vai migrar os cookies do remoto que você salvou um pouco acima em uma variável, e separar os names e os values.
este processo de cookie, é importante manter em for, conseguir alimentar os cookies, os cookies + sessão, e os cookies + sessão {cookies}, exclusivo do canalqb, então se inscreva no canal do Youtube como gratidão.
Force deletar os cookies novamente, só para reforçar, kkkk
Agora vamos montar os cookies locais no Webdriver local.
Como é possível saber quais names serão usados em 'name': cookie['name'], simples acima eu mostrei um print(cookies_remoto), ele serve para imprimir todos os names e values, então separa através do resultado.
E foi assim que identifiquei os cookies, os cookies + sessão, e os cookies + sessão {cookies}. E devido a isso, conseguimos realizar o login, quebrando o captcha.
Para finalizar, vamos tirar um printscreen da tela do servidor no webdriver local.
driver_local.save_screenshot("screenshot.png")
Finalizando apenas para comparar os cookies criados no local, para relacionar com o remoto
print(driver_local.get_cookies())
time.sleep(1)
E por fim finalizarmos.
driver_local.quit()
Do momento em que o printscreen funcionar, você entende que seu script está funcionando, ou seja, agora você pode incluir seu código e automatizar seus processo em um servidor.
Segue o Script completo: https://cb.run/A19l
Nenhum comentário
Comente só assim vamos crescer juntos!
Observação: somente um membro deste blog pode postar um comentário.