Eu implementei um bot para caçar imagens aleatórias do Imgur

bot imgur google-cloud-platform

Mesmo quando a expedição não traz o resultado esperado, o que se constrói ao longo do caminho acaba se tornando o verdadeiro retorno do projeto.

O Imgur é uma plataforma de hospedagem de imagens, que ficou famosa principalmente porque permite enviar imagens rapidamente e gerar links fáceis de compartilhar.

Cada imagem do site tem um ID alfanumérico de 7 caracteres. Então 26 letras maiúsculas + 26 letras minúsculas + 10 dígitos dá um espaço de busca de cerca de 3 trilhões e meio de imagens (!).

Mas a ideia desse projeto não é ser eficiente. Um programador gringo em 2024 conseguiu encontrar 1 bilhão de imagens hospedadas. Já neste método, a chance de qualquer imagem ser encontrada aleatoriamente é de 0,02% por requisição. Ou, mesmo que fosse realizada uma requisição por segundo, levaria 111 mil anos pra varrer todas as combinações possíveis (um pouco mais do que eu levaria pra aprender C++).

O objetivo mesmo é usar isso como desculpa para aprender algum conceito novo. No meu caso, como nunca tinha trabalhado com Clean Architecture, decidi implementar o projeto com base nisso. Aproveitei também para me aprimorar em cloud, que é o que pretendo falar um pouco nesse post.

O que o bot faz é basicamente, em loop, gerar uma string aleatória de 7 caracteres no formato de um ID do Imgur, fazer uma requisição HTTP para o site utilizando esse ID e, caso seja retornado 200, armazenar a imagem.

O bot foi implementado em Python e funciona bem localmente. Para funcionar em nuvem, o fluxo muda um pouco. Subir um servidor dedicado para rodar isso é meio overkill computacionalmente (e financeiramente). Então o fluxo que modelei foi criar

  • um endpoint HTTP no Cloud Run implementado com FastAPI
  • um bucket no Cloud Storage para armazenar as imagens encontradas
  • um job no Cloud Scheduler para chamar o endpoint a cada minuto
  • variáveis no Secret Manager para armazenar as credenciais de e-mail (que é enviado a cada hit com a imagem em anexo)

Coloquei pra rodar sem parar durante 24 dias, com uma requisição por minuto (que é a resolução mínima), e foram encontradas 48 imagens; o que não é muito, mas é muito mais do que eu esperava.

Apesar de ser um projeto relativamente simples, aprendi bastante sobre o SDK do Python do Google Cloud, integração com o GitHub através do OpenID Connect para deploys automatizados, criação de contas de serviço para realizar ações e autorização de acesso por meio de regras de IAM.

A lição que ficou é que, mesmo que uma ideia pareça inútil, se der pra aprender algo no processo, já vale a pena implementar. E tem vezes que até uma gambiarra mal feita vira algo útil no final (tipo o JavaScript).

O repositório do projeto, se alguém tiver curiosidade: https://github.com/ezgrs/imgurdex (documentei também do zero todo o processo de configuração do Google Cloud).