BBBot: Robôs podem votar no Big Brother?

O papel dos robôs nos recordes de votos dos paredões do Big Brother Brasil e como eles funcionam

Izabella Melo
9 min readApr 27, 2020

A primeira coisa que surge na cabeça da maior parte das pessoas quando elas pensam em robôs são os seres quase humanos da ficção científica, os gigantes de metal das indústrias e, a partir desse momento, nesse robô fazendo passinho:

Mas robôs vão muito além disso!

Nos últimos anos, por exemplo, os bots ganharam destaque nos jornais brasileiros depois de serem acusados como principais responsáveis pela alta disseminação de Fake News a partir das eleições presidenciais de 2018. Desde então, usuários do Twitter já estão acostumados com cenas como essa:

Imagem de várias contas postando exatamente a mesma mensagem, no Twitter, indicando o uso de bots.

Mas não só do crime vivem os "robôs sem corpo". Dentre os trabalhos que podem executar, talvez o mais comum seja o de chatbot. Esse tipo de robô é fundamental na automação do atendimento ao cliente de muitas empresas e têm se tornado cada vez mais complexos. Na Google IO de 2018, por exemplo, o Google mostrou como sua assistente pessoal é capaz de se passar por um humano numa ligação para marcar o seu corte de cabelo ou sua reserva no restaurante.

Mas o que é "se passar por humano"?

Em 1950, Alan Turing desenvolveu o Teste de Turing a fim de verificar a capacidade de uma máquina de exibir comportamento inteligente equivalente ao de um humano. Nesse teste, um interrogador deveria conversar com um humano e um computador com o objetivo de identificá-los. Caso não seja identificada, a máquina passa no teste.

E foi do Teste de Turing que surgiram os CAPTCHA's, abreviação de "Completely Automated Public Turing test to tell Computers and Humans Apart" ou, em bom português: "teste de Turing público completamente automatizado para diferenciação entre computadores e humanos". A sigla é autoexplicativa e mostra porque o CAPTCHA deveria ser o maior inimigo de qualquer bot.

Então, afinal, robôs votam no BBB?

A resposta curta é sim. A resposta longa vem logo abaixo:

A explicação aqui será a respeito do BBBot. Outros bots podem ser desenvolvidos de maneiras diferentes, usando ou não ferramentas diferentes, isso não necessariamente terá ligação com sua eficiência.

Para o BBBot, o funcionamento será dividido em duas partes:

  1. simulação de uso do navegador, ou seja, um computador utilizando um determinado site fingindo ser um usuário real
  2. processamento do CAPTCHA, ou seja, fazer a máquina passar nesse Teste de Turing

1. Simulação de uso do navegador

Para isso, usamos o Selenium. Desenvolvedores Web geralmente usam esse tipo de ferramenta para simular a utilização do site que estão desenvolvendo por um usuário real e descobrir se existem bugs que precisam ser corrigidos ou funções que precisam ser implementadas.

O que o Selenium faz é interagir com o código da página da web e executar funções previamente programadas. Para votar no BBB a receita é sempre a mesma:

Ciclo mostrando uma visão geral do funcionamento do bot

Ou seja, o Selenium será programado para executar cada uma dessas ações em sequência e repeti-las indefinidamente.

Fazer login:

O que o início do código faz é definir o tamanho da janela do navegador, abrir o navegador com o site de login da Globo e aguardar por 10 segundos até que o site seja completamente carregado.

loginUrl = "https://minhaconta.globo.com/"
browser.set_window_position(0, 0)
browser.set_window_size(400, 768) # definir tamanho da janela
# abrir navegador na página https://minhaconta.globo.com/
browser.get(loginUrl)
time.sleep(10) # esperar o carregamento da página

A definição do tamanho da janela foi pensada para forçar a responsividade do site a deixar todos os itens que serão clicados à mostra, caso contrário, o Selenium poderá ter problemas ao tentar clicar num item que está fora da área de visualização.

Após o setup inicial, o código pedirá suas credenciais de acesso ao site da Globo para realizar o login, já que é necessário logar numa conta para votar.

Imagem do terminal pedindo e-mail e senha do usuário para logar no site da Globo

Ao mesmo tempo, no código, o Selenium estará procurando por elementos do HTML do site com os IDs login e password. Estes elementos são as caixas de texto na qual suas credenciais serão inseridas para, posteriormente, o botão de entrar ser selecionado.

print("fazendo o login...")
browser.find_element_by_id('login').send_keys(login)
browser.find_element_by_id('password').send_keys(password)
browser.find_elements_by_css_selector('#login-form .button')[0].click()
print("login finalizado...")

Ir para site de votação:

Na próxima etapa, o Selenium pedirá a URL do site na qual está sendo realizada a votação, entrará no site e daremos início à votação de fato.

Imagem do terminal pedindo a URL de votação do site da Globo

Selecionar pessoa:

No terminal, após o carregamento da página, será exibida a pergunta referente à pessoa que o usuário quer selecionar.

Imagem do terminal perguntando se a pessoa gostaria de votar em 1, 2 ou 3

Os números 1, 2 e 3 são referentes a ordem na qual aparecem os brothers, por exemplo, no print abaixo:

No print, a primeira pessoa é a de número 1, a segunda a de número 2 e a terceira, a de número 3

A partir dai, o código busca, na página, os elementos do HTML correspondentes às três pessoas pelo path.

while(1):
try:
element = [browser.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div[4]/div[1]'),
browser.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div[4]/div[2]'),
browser.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div[4]/div[3]')] # procurando as pessoas
break

except:
pass

A procura está dentro de um loop para evitar erros referentes ao carregamento da página, mas pode ser um problema no caso de uma votação com apenas duas pessoas, pois o último elemento nunca será encontrado. Nesse caso, exclui-lo é uma boa opção.

elementBtn = element[idxName]

ac2 = ActionChains(browser)
ac2.move_to_element(elementBtn).click().perform()
time.sleep(3)

O último passo aqui é selecionar a pessoa pelo número que o usuário escolheu pelo terminal e aguardar a abertura do CAPTCHA no site.

Responder CAPTCHA

O código começa procurando o texto inicial pelo nome de sua classe no HTML:

captchaBox = browser.find_elements_by_class_name('gc__2Qtwp')
if captchaBox != []:
if len(captchaBox[0].text) > 2:
break
# separando palavra pedida
imageSearchName = captchaBox[0].text.split(‘\n’)[-1]
print(“procurando por “ + imageSearchName)

E a imagem do CAPTCHA:

while(1):
try:
captcha = browser.find_elements_by_class_name('gc__3_EfD')[0]
break
except:
pass

A imagem é salva na pasta CAPTCHAS e se dá início ao processamento.

Verificar

O código para de executar uma busca pelo CAPTCHA quando o botão "Votar Novamente" é identificado. A partir daí é dado um reload na página para começar novamente.

value = browser.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[3]/div/div/div[1]/div[2]/button')if value.text != '': # texto do botão "Votar Novamente"
vote_succeeded = True
outSideLoop = False
innerLoop = False
break

2. Processamento do CAPTCHA

O CAPTCHA, como todo Teste de Turing, tem em sua principal função reconhecer se são robôs executando determinada tarefa. Apesar de dificultarem várias tarefas, o avanço nas técnicas de reconhecimento de imagem tornaram alguns CAPTCHA’s fáceis de serem quebrados.

Algumas técnicas, por exemplo, usam Aprendizagem de Máquina para identificar as letras existentes em algumas imagens de CAPTCHA

Captcha-Break

Esse não é o caso do BBB, o CAPTCHA da Globo se parece mais com isso:

Esse mesmo CAPTCHA sofreu alteração desde o BBB19 e ficou mais difícil de ser quebrado. O motivo principal da atual dificuldade é que, agora, as imagens mudam. Enquanto no BBB19, para cada palavra, existia apenas um tipo de imagem.

O processamento é feito usando OpenCV, no arquivo processing.py, e funciona da seguinte forma:

  1. Possuímos um dataset de imagens base nomeadas com o nome pedido pela Globo

2. Quando um novo CAPTCHA aparece, buscamos nesse dataset a imagem correspondente ao nome pedido

def findInCaptcha(filename):
processImage(filename)
elementFile = 'BBB20/elementsCaptcha/' + filename
captchaFile = 'BBB20/processedCaptchas/' + filename
template = cv2.imread(elementFile,0)
img = cv2.imread(captchaFile,0)

3. As duas imagens (a nova e a presente no dataset) são processadas, ou seja, são retiradas as linhas com a ajuda de funções do OpenCV

imagem do CAPTCHA
def remove_lines(image):
gray = cv2.bitwise_not(image)
v_image = gray.copy()
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,2))
v_image_eroded = cv2.erode(v_image, vertical_kernel)
v_image_dilated = cv2.dilate(v_image_eroded, vertical_kernel)
return v_image_dilated

A imagem do CAPTCHA acima, depois de passar pela função remove_lines:

imagem processada

4. Procuramos a imagem processada do dataset na imagem processada do CAPTCHA e retornamos sua localização

res = cv2.matchTemplate(img,template,cv2.TM_SQDIFF_NORMED)

5. O mouse é enviado para a posição correspondente e o Selenium executa o clique

posX = points[0] — captcha.size[‘width’]/2
posY = points[1] — captcha.size[‘height’]/2
ac.move_to_element(captcha).move_by_offset(posX, posY).click().perform()

6. Quando a imagem não está presente no dataset, salvamos e recortamos manualmente.

Como usar o BBBot?

Antes de qualquer coisa, os pré-requisitos e suas instalações para os sistemas MacOS e Linux são:

sudo apt-get install python3
sudo pip3 install selenium
  • OpenCV para o processamento de imagem do captcha
sudo pip3 install opencv-python
wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-macos.tar.gz
tar -xvzf geckodriver*
chmod +x geckodriver
sudo mv geckodriver /usr/local/bin/

Depois que os pré-requisitos estiverem corretamente instalados, basta dar clone no projeto do Github, colocar para rodar e dar os dados necessários.

git clone https://github.com/izmcm/BBBot.git
python3 script.py

O resultado deve ser mais ou menos assim (um pouco mais lento, claro):

E o que a Globo faz para evitar isso?

Depois de ganhar mais de 1.5 bilhão de votos num paredão, alguns se perguntaram o que, afinal, a Globo anda fazendo para barrar a utilização de bots nas votações do BBB. A verdade é que, apesar de não parecer, eles têm feito até bastante coisa para evitar que os bots tomem conta.

As principais que podemos observar são:

1. Mudanças no HTML: foi comum, durante vários paredões, mudanças no nome de classes e IDs do HTML da página. Não da pra dizer com certeza que isso foi feito apenas para parar os bots, mas funcionou muitas vezes. Evitar usar classes e IDs e optar pelo path, apesar de menos legível, foi uma decisão que tentava burlar esse tipo de mudança constante.

2. Mudança no CAPTCHA: além da mudança em relação ao BBB19 e a dificuldade que eu tenho, como humana, de acertar as imagens do CAPTCHA atual, também houve adição de novas imagens durante o decorrer do programa.

3. Blacklist de login: durante o BBB20 vários usuários disseram que a Globo poderia estar jogando o login de algumas pessoas, após um número considerável de erros, numa blacklist. Isso fazia com que os votos passassem a não ser computados e ficassem apenas "processando…" para sempre. Às vezes voltavam a funcionar após algumas horas, às vezes só criando uma conta nova.

[Editado dia 05/05/20]

4. Bloqueio de requisições: aparentemente as requisições geradas pelo navegador robô utilizado pelo Selenium possuem uma propriedade que as permite serem bloqueadas pela Globo. Para os votos serem computador, seria necessário um Proxy para alterar essas requisições. Mais informações no link.

Agradecimentos especiais a Caio Gomes que atualizou o processamento do novo CAPTCHA e a toda a galera que contribuiu com issues e PRs no projeto durante todo o BBB20 ❤

Gostou do BBBot? Siga o projeto no Github, dê uma estrela, abra issues e mande PRs, deixe suas palminhas e #FicaEmCasa ;)

--

--

Izabella Melo
Izabella Melo

Written by Izabella Melo

Brasileira, recifense, estudante de Engenharia da Computação na UFPE, desenvolvedora iOS e pesquisadora em privacidade de dispositivos iOS

No responses yet