Artigo original: How to Build a Bot and Automate your Everyday Work

A maioria dos trabalhos tem tarefas repetitivas que você pode automatizar, o que libera parte do seu tempo precioso. Isso torna a automação uma habilidade fundamental a ser adquirida.

Um pequeno grupo de engenheiros de automação qualificados e especialistas em domínio pode ser capaz de automatizar muitas das tarefas mais tediosas de equipes inteiras.

Neste artigo, exploraremos os conceitos básicos da automação de fluxo de trabalho usando o Python – uma linguagem de programação poderosa e fácil de aprender. Usaremos o Python para escrever um script de automação fácil e útil que limpará uma pasta específica e colocará cada arquivo em sua pasta correspondente.

Nosso objetivo não será escrever código perfeito ou criar arquiteturas ideais no início. Também não vamos criar nada "ilegal". Em vez disso, veremos como criar um script que limpa automaticamente uma determinada pasta e todos os seus arquivos.

Sumário

1. Áreas de automação e por onde começar

1.1 Automação simples

1.2 Automação com API pública

1.3 Engenharia reversa de API

2. Considerações éticas sobre a automação

3. Criação de um script de limpeza de um diretório

4. Um guia completo sobre a criação de bots e como automatizar seu trabalho diário

Áreas de automação e por onde começar

Vamos começar definindo que tipo de automações existem.

A arte da automação se aplica à maioria dos setores. Para começar, ela ajuda com tarefas como extrair endereços de e-mail de diversos documentos para que você possa fazer um envio em massa de e-mails. Abordagens mais complexas, como a otimização de fluxos de trabalho e processos dentro de grandes corporações, também podem ter a automação como auxílio.

É claro que passar de pequenos scripts pessoais para grandes infraestruturas de automação que substituem pessoas reais envolve um processo de aprendizado e melhoria. Então, vamos ver onde você pode começar sua jornada.

Automação simples

Automações simples permitem um ponto de entrada rápido e direto. Isso pode abranger pequenos processos independentes, como limpezas de projetos e reestruturação de arquivos dentro de diretórios, ou partes de um fluxo de trabalho, como redimensionar automaticamente arquivos já salvos.

Automação de API pública

As automações de API pública são o modo mais comum de automação, uma vez que podemos acessar a maioria das funcionalidades usando solicitações HTTP para APIs hoje em dia. Por exemplo, se você quiser automatizar a maneira como regar seu jardim inteligente em casa.

Para fazer isso, você quer verificar o tempo do dia atual para ver se você precisa regar ou se há chuva chegando.

Engenharia reversa de API

A automação baseada em engenharia reversa de API é mais comum em bots reais e na seção "Bot Imposter" (impostor de bot, em inglês) do gráfico na seção "Considerações éticas" abaixo.

Através da engenharia reversa de uma API, entendemos o fluxo de usuários das aplicações. Um exemplo pode ser o login em um jogo de navegador on-line.

Ao entender o processo de login e autenticação, podemos duplicar esse comportamento com nosso próprio script. Em seguida, podemos criar nossa própria interface para trabalhar com a aplicação, mesmo que os próprios criadores não a forneçam.

Seja qual for a abordagem que você está buscando, sempre considere se ela é legal ou não.

Você não quer se meter em problemas, não é?

Considerações éticas sobre a automação

Alguém no GitHub, um dia, entrou em contato comigo e me disse:

"Curtidas e engajamento são a moeda digital e você está desvalorizando essa moeda."

Isso ficou comigo e me fez questionar a ferramenta que construí exatamente para esse propósito.

O fato de que essas interações e o engajamento podem ser automatizados e "falsificados" cada vez mais leva a um sistema de redes social distorcido e quebrado.

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. Um amigo meu criou a seguinte associação com os "Nove Círculos do Inferno", de Dante, onde, a cada passo, mais perto de se tornar um influenciador social você fica e cada vez menos consciente de como todo esse sistema realmente está quebrado.

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

Nível 1: Limbo quando você não usa bots

Nível 2: Flerte – quando você dá as curtidas e segue manualmente quantas pessoas puder para que elas sigam você de volta/curtam suas publicações

Nível 3: Conspiração – quando você se junta a um grupo no Telegram para dar curtidas e comentar em 10 fotos para que outras 10 pessoas curtam e comentem em sua foto

Nível 4: Infidelidade – quando você usa um assistente virtual de baixo custo para dar curtidas e seguir em seu nome

Nível 5: Lascívia quando você usa um bot para dar curtidas, sem receber curtidas de volta (mas sem pagar por isso – como, por exemplo, com uma extensão do Chrome)

Nível 6: Promiscuidade quando você usa um bot para dar 50 ou mais curtidas para receber 50 ou mais curtidas, mas sem pagar por isso – como, por exemplo, com uma extensão do Chrome

Nível 7: Avareza ou ganância em excesso – quando você usa um bot para dar curtidas/seguir/comentar em torno de 200 a 700 fotos, ignorando a chance de ser banido

Nível 8: Prostituição – quando você paga por um serviço de terceiros desconhecidos para dar reciprocidade às curtidas/seguidas automatizadas por você, mas esse serviço usa sua conta para dar curtidas/seguir de volta

Nível 9: Fraude/Heresia – quando você compra seguidores e curtidas e tenta se vender para as marcas como um influencer

O nível de uso de bots nas redes sociais é tanto que, se você não usar bots, estará preso no nível 1, o Limbo, sem crescimento no número de seguidores e com baixo engajamento com relação aos seus pares.

Na teoria econômica, isso é conhecido como o dilema do prisioneiro e como jogo da soma zero. Se você não usar bots e eu usar, eu ganho. Se ninguém usar, todos ganham. Como, porém, não há incentivo para que todos não usem bots, todos usam bots. Assim, ninguém ganha.

Cuidado com isso e nunca se esqueça das implicações que todo esse ferramental tem nas redes sociais.
spectrum-bot-intent-ebook
Fonte: SignalSciences.com

Queremos evitar lidar com implicações éticas e ainda trabalhar em um projeto de automação aqui. É por isso que criaremos um script de limpeza de diretório simples, que ajuda você a organizar suas pastas bagunçadas.

Criação de um script de limpeza de um diretório

Agora, queremos examinar um script bastante simples. Ele limpa automaticamente um determinado diretório, movendo esses arquivos para pastas de acordo com a extensão do arquivo.

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

directory_clean_img

Configurando o analisador de argumentos

Como estamos trabalhando com uma funcionalidade 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.

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 auxiliar o usuário quando ele digitar --help.

Nosso argumento será chamado de --path. Os traços duplos na frente do nome informam à biblioteca que esse é um argumento opcional. Por padrão, queremos usar o diretório atual, então defina o valor padrão como ".".

parser = argparse.ArgumentParser(
    description="Limpa o diretório e coloca os arquivos nas respectivas pastas."
)

parser.add_argument(
    "--path",
    type=str,
    default=".",
    help="Caminho do diretório a ser limpo",
)

# analisa os argumentos dados pelo usuário e extrai o caminho
args = parser.parse_args()
path = args.path

print(f"Limpando o diretório {path}")

Isso já termina a seção de análise de argumentos – é bem simples e legível, certo?

Vamos executar o nosso script e ver se tem erros.

python directory_clean.py --path ./test 

=> Limpando o diretório ./test

Uma vez executado, podemos ver o nome do diretório sendo impresso no console. Ótimo!
Vamos usar a biblioteca os para obter os arquivos no caminho fornecido.

Obtendo uma lista de arquivos da pasta

Ao usar o método os.listdir(path) e fornecer a ele um caminho válido, obtemos uma lista de todos os arquivos e pastas dentro desse diretório.

Depois de listar todos os elementos na pasta, queremos diferenciar entre arquivos e pastas, pois não queremos limpar as pastas, apenas os arquivos.

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

# obter todos os arquivos de um diretório
dir_content = os.listdir(path)

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

# filtrar o conteúdo do nosso 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 registrar a quantidade de arquivos movidos 
# e a lista das pastas já criadas para evitar a criação de diversas pastas iguais
moved = 0
created_folders = []

print(f"Limpando {len(docs)} de {len(dir_content)} elementos.")

Como sempre, vamos garantir que nossos usuários recebam feedback. Portanto, adicionamos uma instrução de impressão que dê ao usuário uma indicação sobre quantos arquivos serão movidos.

python directory_clean.py --path ./test 

=> Limpando o diretório ./test
=> Limpando 60 de 60 elementos.

Depois de executar novamente o script do Python, agora, podemos ver que a pasta /test que criei contém 60 arquivos que serão movidos.

Criação de uma pasta para cada extensão de arquivo

O próximo – e mais importante – passo é criar a pasta para cada uma das extensões de arquivo. Queremos fazer isso passando por todos os nossos arquivos filtrados e, se eles tiverem uma extensão para a qual ainda não há uma pasta, criamos uma.

A biblioteca os nos ajuda com funcionalidades mais 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.

# percorre todos os arquivos e os move para as pastas certas
for doc in docs:
    # separar 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 ao final do código acima garante que nosso terminal não fique travado se nosso diretório tiver centenas de arquivos.

Depois de definirmos isso, vamos executar nosso script e ver um resultado semelhante a este:

python directory_clean.py --path ./test 

=> ...
=> .pdf
=> ./test/test17
=> ./test
=> test17

Podemos ver que a implementação acima divide o tipo de arquivo e, em seguida, extrai as partes do caminho completo.

Como temos o tipo de arquivo, agora podemos verificar se já existe uma pasta com o nome desse tipo.

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 do Python. Uma condição simples cuida disso.

Além disso, não queremos mover arquivos ocultos (texto em inglês). Vamos, então, incluir todos os arquivos que comecem com um ponto. O arquivo .DS_Store no macOS é um exemplo de arquivo oculto.

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

    # obtenha o nome da subpasta e crie a pasta se ela não existir
    subfolder_path = os.path.join(path, filetype[1:].lower())

    if subfolder_path not in folders:
    	# cria a pasta

Depois de cuidarmos do script do Python e dos arquivos ocultos, podemos passar para a criação das pastas no sistema.

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 a memória para acompanhar os nomes das pastas.

Para criar outra pasta, a biblioteca os fornece um método chamado os.mkdir(caminho_da_pasta), que recebe um caminho e cria a pasta com o nome dado ali.

Esse método pode lançar uma exceção, nos dizendo que a pasta já existe. Assim, vamos garantir que capturamos esse erro.

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"Pasta {subfolder_path} criada.")
        except FileExistsError as err:
            print(f"Pasta já existe em {subfolder_path}... {err}")

Depois de definir a criação da pasta, vamos executar novamente nosso script.

python directory_clean.py --path ./test 

=> ...
=> Pasta ./test/pdf criada.

Na primeira passagem da execução, podemos ver uma lista de logs nos informando que as pastas com tipos determinados de extensões de arquivo foram criadas.

Movendo cada arquivo para a subpasta correta

A última etapa agora é realmente mover os arquivos para suas novas pastas pai.

Uma coisa importante a entender ao trabalhar com operações de os é que, às vezes, as operações não podem ser desfeitas. É o caso, por exemplo, da exclusão. Portanto, faz sentido primeiro apenas registrar o comportamento que nosso script alcançaria se o executássemos.

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

# Obtém o caminho da nova 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"Arquivo {doc} movido para {new_doc_path}")

Depois de executar nosso script e ver o registro correto, agora podemos remover a hashtag de comentário antes do nosso método os.rename() e dar a ele a sua vez.

# Obtém o caminho da nova 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"Arquivo {doc} movido para {new_doc_path}")

print(f"Renomeados {moved} de {len(docs)} arquivos.")
python directory_clean.py --path ./test 

=> ...
=> Arquivo ./test/test17.pdf movido para ./test/pdf/test17.pdf
=> ...
=> Renomeados 60 de 60 arquivos.

Essa execução final, agora, moverá todos os arquivos para suas pastas apropriadas e nosso diretório estará limpo, sem a necessidade de ações manuais.

Na próxima etapa, poderíamos usar o script que criamos acima e, por exemplo, programá-lo para ser executado todas as segundas-feiras para limpar nossa pasta de Downloads para obter uma estrutura melhor.

É exatamente por isso que estamos criando uma continuação dentro de nosso curso da Udemy, chamado Bot Creation and Workflow Automation (em português, criação de bots e automação de fluxos de trabalho).

Um guia completo para a criação de bots e a automação do seu trabalho diário

Felix e eu criamos um curso em vídeo on-line para ensinar para você a criação de bots, com base no que você aprendeu criando o InstaPy e o Travian-Bot. De fato, ele foi, inclusive, forçado a derrubar o bot por ser eficaz até demais.

Junte-se a nós e comece a aprender (curso da Udemy em inglês, pago).

Se tiver perguntas ou feedback, fique à vontade para entrar em contato conosco pelo Twitter ou diretamente pela seção de discussão do curso.