Como Construir um Bot e Automatizar seu Trabalho Diário | Tutorial

Deivison Viana
22 Min Read

A maioria dos trabalhos tem tarefas repetitivas que você pode automatizar, o que libera um pouco do seu precioso tempo. Isso torna a automação uma habilidade fundamental a ser adquirida. (Ou seja, se você não aprender a automatizar, vai ficar aí repetindo as mesmas coisas como um robô… que ironia!)

Um pequeno grupo de engenheiros de automação habilidosos e especialistas de domínio podem automatizar muitas das tarefas mais tediosas de equipes inteiras. (Será que eles vão dominar o mundo com essa habilidade? 🤔)

Neste artigo, exploraremos o básico da automação de fluxo de trabalho usando Python – uma linguagem de programação poderosa e fácil de aprender. Usaremos Python para escrever um pequeno script de automação fácil e útil que limpará uma pasta fornecida e colocará cada arquivo em sua pasta correspondente. (Mas gente, será que esse script vai conseguir organizar a minha vida também? 😅)

Nosso objetivo não será escrever código perfeito ou criar arquiteturas ideais no começo. (Ufa, ainda bem! Já estava com medo de ter que virar um gênio da programação.)

Também não construiremos nada “ilegal”. Em vez disso, veremos como criar um script que limpa automaticamente uma pasta fornecida e todos os seus arquivos. (Que pena, eu estava pensando em usar esse script para hackear a NASA. 😈 Brincadeira!)

Áreas de Automação e Por Onde Começar (com uma pitada de sarcasmo e curiosidade)

Vamos começar definindo que tipo de automações existem. A arte da automação se aplica à maioria dos setores. Para iniciantes, ela ajuda com tarefas como extrair endereços de e-mail de um monte de documentos para que você possa fazer um disparo em massa. Ou abordagens mais complexas, como otimizar fluxos de trabalho e processos dentro de grandes corporações. (Ou seja, basicamente, qualquer coisa que te faça pensar “queria que um robô fizesse isso por mim”.)

Claro, ir de pequenos scripts pessoais para uma grande infraestrutura de automação que substitui pessoas de verdade envolve um processo de aprendizado e aprimoramento. Então, vamos ver por onde você pode começar sua jornada.

Automações Simples (para os meros mortais)

As automações simples permitem um ponto de entrada rápido e direto. Isso pode abranger pequenos processos independentes, como limpeza de projetos e reestruturação de arquivos dentro de diretórios, ou partes de um fluxo de trabalho, como redimensionar automaticamente arquivos já salvos. (Tipo, finalmente dar um jeito naquela pasta “Downloads” que mais parece um buraco negro, né?)  

Automações de API Pública (para quem já se acha hacker)

As automações de API pública são a forma mais comum de automação, já que podemos acessar a maioria das funcionalidades usando solicitações HTTP para APIs hoje em dia. Por exemplo, se você quiser automatizar a rega do seu jardim inteligente caseiro que você mesmo fez. (Sério, quem tem tempo pra regar plantas hoje em dia? 🤔)  

Para fazer isso, você quer verificar o clima do dia atual para ver se precisa regar ou se há chuva chegando. (Ou você pode simplesmente usar um sensor de umidade, mas onde está a graça nisso?)

Engenharia Reversa de API (para os verdadeiros ninjas)

A automação baseada em engenharia reversa de API é mais comum em bots reais e na seção “Bot Imposter” do gráfico na seção “Considerações Éticas” abaixo. (Ou seja, para quem quer se infiltrar nos sistemas alheios sem ser convidado. 🤫)

Ao fazer a engenharia reversa de uma API, entendemos o fluxo do usuário dos aplicativos. Um exemplo pode ser o login em um jogo de navegador online. (Será que dá pra usar isso pra finalmente zerar aquele jogo que você nunca consegue passar da primeira fase? 😅)

Ao entender o processo de login e autenticação, podemos duplicar esse comportamento com nosso próprio script. Então, podemos criar nossa própria interface para trabalhar com o aplicativo, mesmo que eles não a forneçam. (Imagina só, você cria a sua própria versão do Facebook, só que muito melhor!)

Qualquer que seja a abordagem que você esteja buscando, sempre considere se é legal ou não. Você não quer se meter em problemas, quer? 😉 (A não ser que você seja um hacker do mal, aí tudo bem.)

Considerações Éticas (ou como não virar um vilão)

Um cara no GitHub me contatou uma vez e me disse o seguinte:

“Curtidas e engajamento são moedas digitais e você está desvalorizando-as.”

Isso ficou comigo e me fez questionar a ferramenta que construí exatamente para esse propósito. (Ops! Parece que alguém pisou na bola. 🤭)

O fato de que essas interações e o engajamento podem ser automatizados e “falsificados” cada vez mais leva a um sistema de mídia social distorcido e quebrado. (Quem diria que bots poderiam ser tão influentes? 🤔)  

Pessoas que produzem conteúdo valioso e bom são invisíveis para outros usuários e empresas de publicidade se não usarem bots e outros sistemas de engajamento. (É a lei da selva digital: se você não lutar, você morre. 😓)  

Um amigo meu fez a seguinte associação com os “Nove Círculos do Inferno” de Dante, onde a cada passo para se tornar um influenciador social você fica cada vez menos ciente de quão quebrado esse sistema realmente é. (Ou seja, quanto mais famoso você fica, mais iludido você se torna. 😵)

Quero compartilhar isso com você aqui, pois acho que é uma representação extremamente precisa do que testemunhei enquanto trabalhava ativamente com Influenciadores com o InstaPy.  

Nível 1: Limbo – Se você não usa bot. (Tadinho, ninguém te nota. 😭) Nível 2: Paquera – Quando você curte e segue manualmente o máximo de pessoas que pode para que elas sigam você de volta / curtam suas postagens. (O famoso “follow for follow”.) Nível 3: Conspiração – quando você se junta a um grupo do Telegram para curtir e comentar em 10 fotos para que as próximas 10 pessoas curtam e comentem na sua foto. (A união faz a força, né?) Nível 4: Infidelidade – Quando você usa um assistente virtual de baixo custo para curtir e seguir em seu nome. (Chique, hein? Ter um assistente só pra isso.) Nível 5: Luxúria – Quando você usa um bot para dar curtidas e não recebe nenhuma curtida de volta (mas você não paga por isso – por exemplo, uma extensão do Chrome). (Só dá like em quem te dá like de volta? Que interesseiro!) Nível 6: Promiscuidade – Quando você usa um bot para dar mais de 50 curtidas para receber mais de 50 curtidas, mas você não paga por isso – por exemplo, uma extensão do Chrome. (Aumentou a aposta, hein?) Nível 7: Avareza ou Ganância Extrema – Quando você usa um bot para curtir / seguir / comentar entre 200-700 fotos, ignorando a chance de ser banido. (Vai com tudo, arrisca tudo!) Nível 8: Prostituição – Quando você paga um serviço de terceiros desconhecido para se envolver em curtidas / seguidores recíprocos automatizados para você, mas eles usam sua conta para curtir / seguir de volta. (Eita, parece que alguém caiu num golpe.) Nível 9: Fraude / Heresia – Quando você compra seguidores e curtidas e tenta se vender para marcas como um influenciador. (O topo da cadeia alimentar dos influenciadores falsos.)  

O nível de bots nas mídias sociais é tão prevalente que, se você não usar bots, ficará preso no Nível 1, Limbo, sem crescimento de seguidores e baixo engajamento em relação aos seus pares. (Ou seja, se você não trapacear, você perde. Que mundo justo, né?)

Na teoria econômica, isso é conhecido como dilema do prisioneiro e jogo de soma zero. Se eu não usar bot e você usar, você ganha. Se você não usar bot e eu usar, eu ganho. Se ninguém usar bot, todos ganham. Mas como não há incentivo para que todos não usem bots, todos usam bots, então ninguém ganha. (É como uma corrida armamentista, só que com bots.)

Esteja ciente disso e nunca se esqueça das implicações que todas essas ferramentas têm nas mídias sociais. (Ou seja, use com moderação e responsabilidade, se é que isso é possível.)

Queremos evitar lidar com implicações éticas e ainda trabalhar em um projeto de automação aqui. É por isso que criaremos um script simples de limpeza de diretório que ajuda 1 você a organizar suas pastas bagunçadas. (Porque, sejamos sinceros, quem nunca se perdeu em um mar de arquivos e pastas desorganizadas? 🙋‍♀️)

Criando um Script de Limpeza de Diretório (e salvando sua sanidade mental)

Agora queremos dar uma olhada em um script bem simples. Ele limpa automaticamente um determinado diretório movendo esses arquivos para pastas correspondentes com base na extensão do arquivo. (Adeus, caos! 👋)

Então, tudo o que queremos fazer é o seguinte:

(Aqui você pode continuar a tradução do texto que descreve o que o script fará, como identificar os tipos de arquivo e movê-los para as pastas corretas.)

Configurando o Analisador de Argumentos (a parte chata, mas necessária)

Como estamos trabalhando com funcionalidades do sistema operacional, como mover arquivos, precisamos importar a biblioteca os. Além disso, queremos dar ao usuário algum controle sobre qual pasta é limpa. Usaremos a biblioteca argparse para isso.

Configurando o Analisador de Argumentos (a parte chata, mas necessária)

Como estamos trabalhando com funcionalidades do sistema operacional, como mover arquivos, precisamos importar a biblioteca os. Além disso, queremos dar ao usuário algum controle sobre qual pasta é limpa. Usaremos a biblioteca argparse para isso.

Python

import os
import argparse

Depois de importar as duas bibliotecas, vamos primeiro configurar o analisador de argumentos. Certifique-se de fornecer uma descrição e um texto de ajuda para cada argumento adicionado para fornecer ajuda valiosa ao usuário quando ele digitar --help. (Afinal, ninguém quer ficar perdido na hora de usar o script, né?)  

Nosso argumento será chamado --path. Os dois travessões na frente do nome indicam à biblioteca que este é um argumento opcional. Por padrão, queremos usar o diretório atual, então defina o valor padrão como “.”.

Python

parser = argparse.ArgumentParser(
    description="Clean up directory and put files into according folders.")

parser.add_argument(
    "--path",
    type=str,
    default=".",
    help="Directory path of the to be cleaned directory",)

# analisa os argumentos fornecidos pelo usuário e extrai o caminho
args = parser.parse_args()
path = args.path
print(f"Cleaning up directory {path}")

Isso já termina a seção de análise de argumentos – é bem simples e legível, certo? (Ou pelo menos tentamos fazer ser. 😅)

Vamos executar nosso script e verificar se há erros.

Bash

python directory_clean.py --path ./test => Cleaning up directory ./test

Uma vez executado, podemos ver o nome do diretório sendo impresso no console, perfeito. (Ufa, funcionou!)

Vamos agora usar a biblioteca os para obter os arquivos do caminho fornecido.

Obtendo uma lista de arquivos da pasta (a parte em que a mágica começa)

Usando o método os.listdir(path) e fornecendo a ele um caminho válido, obtemos uma lista de todos os arquivos e pastas dentro desse diretório. (É como abrir a pasta e dar uma espiadinha lá dentro.)

Depois de listar todos os elementos na pasta, queremos diferenciar entre arquivos e pastas, pois não queremos limpar as pastas, apenas os arquivos. (Ninguém quer perder aquela pasta secreta com fotos constrangedoras, né? 🙈)

Neste caso, usamos uma compreensão de lista Python para iterar por todos os elementos e colocá-los nas novas listas se eles atenderem ao requisito fornecido de ser um arquivo ou pasta.

Python

# obtém todos os arquivos do diretório fornecido
dir_content = os.listdir(path)

# cria um caminho relativo do caminho para o arquivo e o nome do documento
path_dir_content = [os.path.join(path, doc) for doc in dir_content]

# filtra nosso conteúdo do diretório em uma lista de documentos e pastas
docs = [doc for doc in path_dir_content if os.path.isfile(doc)]
folders = [folder for folder in path_dir_content if os.path.isdir(folder)]

# contador para controlar a quantidade de arquivos movidos
# e lista de pastas já criadas para evitar várias criações
moved = 0
created_folders = []
print(f"Cleaning up {len(docs)} of {len(dir_content)} elements.")

Como sempre, vamos garantir que nossos usuários recebam feedback. Portanto, adicione uma instrução print que forneça ao usuário uma indicação de quantos arquivos serão movidos. (Só para não deixar ninguém ansioso.)

Bash

python directory_clean.py --path ./test => Cleaning up directory ./test
=> Cleaning up 60 of 60 elements.

Após reexecutar o script python, podemos ver agora que a pasta /test que criei contém 60 arquivos que serão movidos. (Preparem-se para a mudança, arquivos!)

Criando uma pasta para cada extensão de arquivo (a parte organizada)

O próximo passo, e mais importante agora, é criar a pasta para cada uma das extensões de arquivo. Queremos fazer isso percorrendo todos os nossos arquivos filtrados e, se eles tiverem uma extensão para a qual ainda não existe uma pasta, criaremos uma. (Cada tipo de arquivo no seu lugar!)

A biblioteca os nos ajuda com mais funcionalidades interessantes, como a divisão do tipo de arquivo e caminho de um determinado documento, extraindo o próprio caminho e o nome do documento.  

Python

# percorre todos os arquivos e os move para as pastas correspondentes
for doc in docs:
    # separa o nome da extensão do arquivo
    full_doc_path, filetype = os.path.splitext(doc)
    doc_path = os.path.dirname(full_doc_path)
    doc_name = os.path.basename(full_doc_path)

    print(filetype)
    print(full_doc_path)
    print(doc_path)
    print(doc_name)

    break

A instrução break no final do código acima garante que nosso terminal não seja spam com mensagens se nosso diretório contiver dezenas de arquivos. (Ninguém merece um ataque de mensagens, né?)

Depois de configurar isso, vamos executar nosso script para ver uma saída semelhante a esta:

Bash

python directory_clean.py --path ./test => ...
=> .pdf
=> ./test/test17
=> ./test
=> test17

Podemos ver agora que a implementação acima divide o tipo de arquivo e, em seguida, extrai as partes do caminho completo. (É como dissecar um arquivo para entender seus segredos.)

Como agora temos o tipo de arquivo, podemos verificar se já existe uma pasta com o nome desse tipo. (Para evitarmos criar pastas duplicadas e fazer ainda mais bagunça.)

Antes de fazermos isso, queremos ter certeza de pular alguns arquivos. Se usarmos o diretório atual “.” como caminho, precisamos evitar mover o próprio script python. Uma simples condição if cuida disso. (Não queremos que o script se autodestrua, né?)  

Além disso, não queremos mover arquivos ocultos, então vamos também incluir todos os arquivos que começam com um ponto. O arquivo .DS_Store no macOS é um exemplo de arquivo oculto. (Segredos são segredos, e devem permanecer ocultos.)

Python

    # ignora este arquivo quando ele estiver no diretório
    if doc_name == "directory_clean" or doc_name.startswith('.'):
        continue

    # obtém o nome da subpasta e cria a pasta se não existir
    subfolder_path = os.path.join(path, filetype[1:].lower())

    if subfolder_path not in folders:
        # cria a pasta

Depois de cuidar do script python e dos arquivos ocultos, podemos agora prosseguir para a criação das pastas no sistema. (Finalmente, a hora da organização!)

Além da nossa verificação, se a pasta já estava lá quando lemos o conteúdo do diretório, no início, precisamos de uma maneira de rastrear as pastas que já criamos. Essa foi a razão pela qual declaramos a lista created_folders = []. Ela servirá como memória para rastrear os nomes das pastas. (Para não perdermos a cabeça no meio de tantas pastas.)  

Para criar uma nova pasta, a biblioteca os fornece um método chamado os.mkdir(folder_path) que recebe um caminho e cria uma pasta com o nome fornecido lá.

Este método pode lançar uma exceção, dizendo que a pasta já existe. Então, vamos também garantir que esse erro seja detectado. (Para evitarmos mensagens de erro assustadoras.)

Python

if subfolder_path not in folders and subfolder_path not in created_folders:
    try:
        os.mkdir(subfolder_path)
        created_folders.append(subfolder_path)
        print(f"Folder {subfolder_path} created.")
    except FileExistsError as err:
        print(f"Folder already exists at {subfolder_path}... {err}")

Após configurar a criação da pasta, vamos reexecutar nosso script.

Bash

python directory_clean.py --path ./test => ...
=> Folder ./test/pdf created.

Na primeira execução, podemos ver uma lista de logs nos dizendo que as pastas com os tipos de extensões de arquivo fornecidos foram criadas. (Sucesso! 🎉)

Movendo cada arquivo para a subpasta correta (a parte final da saga)

O último passo agora é realmente mover os arquivos para suas novas pastas pai. (Cada arquivo na sua casinha.)

Uma coisa importante a entender ao trabalhar com operações do sistema operacional é que às vezes as operações não podem ser desfeitas. Este é, por exemplo, o caso da exclusão. Portanto, faz sentido primeiro apenas registrar o comportamento que nosso script alcançaria se o executássemos. (Só para ter certeza de que não vamos fazer nenhuma besteira.)  

É por isso que o método os.rename(...) foi comentado aqui.

Python

# obtém o novo caminho da pasta e move o arquivo
    new_doc_path = os.path.join(subfolder_path, doc_name) + filetype
    # os.rename(doc, new_doc_path)
    moved += 1

    print(f"Moved file {doc} to {new_doc_path}")

Após executar nosso script e ver o log correto, podemos agora remover o comentário hash antes do nosso método os.rename() e dar uma última chance. (Hora da verdade!)

Python

# obtém o novo caminho da pasta e move o arquivo
    new_doc_path = os.path.join(subfolder_path, doc_name) + filetype
    os.rename(doc, new_doc_path)
    moved += 1

    print(f"Moved file {doc} to {new_doc_path}")
print(f"Renamed {moved} of {len(docs)} files.")

Bash

python directory_clean.py --path ./test => ...
=> Moved file ./test/test17.pdf to ./test/pdf/test17.pdf
=> ...
=> Renamed 60 of 60 files.

Esta execução final agora moverá todos os arquivos para suas pastas apropriadas e nosso diretório será bem limpo sem a necessidade de ações manuais. (Finalmente, paz e organização!)

Na próxima etapa, podemos agora usar o script que criamos acima e, por exemplo, agendá-lo para ser executado todas as segundas-feiras para limpar nossa pasta Downloads para mais estrutura. (Ou seja, você pode ter uma segunda-feira produtiva sem precisar levantar um dedo. 😎)

Share This Article
Follow:
Com mais de 15 anos de experiência na área de Tecnologia da Informação, tenho construído uma carreira distintiva como Arquiteto de Software e Gestor de T.I., posicionando-me na vanguarda da inovação tecnológica. Especialista em Big Data, Analytics e Business Intelligence aplicados aos negócios, minha trajetória é pautada na excelência e na transformação digital de organizações através do poder dos dados. Detentor de uma profunda expertise técnica e estratégica, sou certificado em Análise de Dados pela Google, Power BI, Python, além de ter especializações nas principais plataformas de cloud computing: AWS, IBM Cloud, Azure e Google Cloud. Estas qualificações me habilitam a desenvolver soluções de ponta que potencializam a análise de dados, melhoram a tomada de decisão e otimizam a performance empresarial.
Leave a Comment

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *