Sådan bygger du en bot og automatiserer dit daglige arbejde

De fleste job har gentagne opgaver, som du kan automatisere, hvilket frigør noget af din værdifulde tid. Dette gør automatisering til en nøglefærdighed at erhverve.

En lille gruppe af dygtige automatiseringsingeniører og domæneeksperter kan muligvis automatisere mange af de mest kedelige opgaver for hele teams.

I denne artikel vil vi udforske det grundlæggende i automatisering af workflow ved hjælp af Python - et kraftfuldt og let at lære programmeringssprog. Vi bruger Python til at skrive et let og nyttigt lille automatiseringsscript, der rydder op i en given mappe og sætter hver fil i den tilsvarende mappe.

Vores mål er ikke at skrive perfekt kode eller skabe ideelle arkitekturer i starten.

Vi bygger heller ikke noget "ulovligt". I stedet vil vi se på, hvordan man opretter et script, der automatisk renser en given mappe og alle dens filer.

Indholdsfortegnelse

  1. Områder med automatisering og hvor man kan starte
    • Enkel automatisering
    • Offentlig API-automatisering
    • API Reverse Engineering
  2. Etiske overvejelser ved automatisering
  3. Oprettelse af et katalogoprydnings script
  4. En komplet guide til oprettelse af botter og automatisering af dit daglige arbejde

Områder med automatisering og hvor man kan starte

Lad os starte med at definere, hvilken slags automatiseringer der er.

Kunsten med automatisering gælder for de fleste sektorer. For det første hjælper det med opgaver som at udtrække e-mail-adresser fra en masse dokumenter, så du kan lave en e-mail-eksplosion. Eller mere komplekse tilgange som optimering af arbejdsgange og processer i store virksomheder.

At gå fra små personlige scripts til store automatiseringsinfrastrukturer, der erstatter faktiske mennesker, involverer naturligvis en proces med læring og forbedring. Så lad os se, hvor du kan starte din rejse.

Enkle automatiseringer

Enkle automatiseringer giver mulighed for et hurtigt og ligetil indgangspunkt. Dette kan dække små uafhængige processer som projektoprydning og omstrukturering af filer inde i mapper eller dele af en arbejdsgang som automatisk at ændre størrelse på allerede gemte filer.

Offentlige API-automatiseringer

Offentlige API-automatiseringer er den mest almindelige form for automatisering, da vi i dag kan få adgang til de fleste funktioner ved hjælp af HTTP-anmodninger til API'er. For eksempel, hvis du vil automatisere vandingen af ​​din selvfremstillede smarte have derhjemme.

For at gøre det skal du kontrollere vejret på den aktuelle dag for at se, om du har brug for vand, eller om der kommer regn.

API Reverse Engineering

API reverse engineering-baseret automatisering er mere almindelig i faktiske bots og "Bot Imposter" sektionen i diagrammet i afsnittet "Etiske overvejelser" nedenfor.

Ved reverse engineering af en API forstår vi brugerflowet af applikationer. Et eksempel kan være login til et online browserspil.

Ved at forstå login- og godkendelsesprocessen kan vi duplikere denne adfærd med vores eget script. Derefter kan vi oprette vores egen grænseflade til at arbejde med applikationen, selvom de ikke selv leverer den.

Uanset hvilken tilgang du sigter mod, skal du altid overveje, om det er lovligt eller ej.

Du vil ikke have dig selv i problemer, gør du? ?

Etiske overvejelser

En eller anden fyr på GitHub kontaktede mig engang og fortalte mig dette:

"Likes og engagement er digital valuta, og du nedvurderer dem."

Dette sidder fast med mig og fik mig til at sætte spørgsmålstegn ved det værktøj, jeg har bygget til netop det formål.

Det faktum, at disse interaktioner og engagementet kan automatiseres og "falskes" mere og mere fører til et forvrænget og brudt socialt mediesystem.

Folk, der producerer værdifuldt og godt indhold, er usynlige for andre brugere og reklamevirksomheder, hvis de ikke bruger bots og andre engagementssystemer.

En af mine venner kom med følgende tilknytning til Dantes “Nine Circles of Hell”, hvor man med hvert skridt tættere på at blive en social influencer bliver mindre og mindre opmærksom på, hvor ødelagt hele dette system faktisk er.

Jeg vil dele dette med dig her, da jeg synes, det er en yderst nøjagtig gengivelse af, hvad jeg var vidne til, mens jeg aktivt arbejdede med Influencers med InstaPy.

Niveau 1: Limbo - Hvis du slet ikke bot

Niveau 2: Flirt - Når du manuelt kan lide og følge så mange mennesker som muligt for at få dem til at følge dig tilbage / lide dine indlæg

Niveau 3: Konspiration - når du tilmelder dig en Telegram-gruppe for at kunne lide og kommentere 10 fotos, så vil de næste 10 personer kunne lide og kommentere dit foto

Niveau 4: Utroskab - Når du bruger en billig Virtual Assistant til at kunne lide og følge på dine vegne

Niveau 5: Begær - Når du bruger en bot til at give likes, og ikke modtager nogen likes tilbage (men du betaler ikke for det - for eksempel en Chrome-udvidelse)

Niveau 6: Promiskuitet - Når du bruger en bot til at give 50+ likes for at få 50+ likes, men du betaler ikke for det - for eksempel en Chrome-udvidelse

Niveau 7: Avarice eller Extreme Grådighed - Når du bruger en bot til at like / følge / kommentere mellem 200–700 fotos, ignorerer chancen for at blive forbudt

Niveau 8: Prostitution - Når du betaler en ukendt tredjepartstjeneste for at deltage i automatiske gensidige likes / følger for dig, men de bruger din konto til at like / følge tilbage

Niveau 9: Bedrageri / kætteri - Når du køber tilhængere og likes og prøver at sælge dig selv til brands som en influencer

Niveauet for aftapning på sociale medier er så udbredt, at hvis du ikke boter, vil du sidde fast i niveau 1, Limbo , uden følgevækst og lavt engagement i forhold til dine jævnaldrende.

I økonomisk teori er dette kendt som en fængdes dilemma og nul-sum spil . Hvis jeg ikke bot, og du bot, vinder du. Hvis du ikke bot og jeg bot, vinder jeg. Hvis ingen bots, vinder alle. Men da der ikke er noget incitament for alle til ikke at bot, botser alle, så ingen vinder.

Vær opmærksom på dette og glem aldrig de implikationer, som hele dette værktøj har på sociale medier.

Vi vil undgå at håndtere etiske implikationer og stadig arbejde på et automatiseringsprojekt her. Dette er grunden til, at vi opretter et simpelt katalogoprydnings script, der hjælper dig med at organisere dine rodede mapper.

Oprettelse af et katalogoprydnings script

Vi vil nu se på et ret simpelt script. Det renser automatisk en given mappe op ved at flytte disse filer til i henhold til mapper baseret på filtypen.

Så alt hvad vi vil gøre er dette:

Opsætning af Argument Parser

Da vi arbejder med operativsystemfunktionalitet som at flytte filer, skal vi importere osbiblioteket. Derudover ønsker vi at give brugeren en vis kontrol over, hvilken mappe der renses. Vi bruger argparsebiblioteket til dette.

import os import argparse

Efter at have importeret de to biblioteker, lad os først opsætte argumentparseren. Sørg for at give en beskrivelse og en hjælpetekst til hvert tilføjet argument for at give værdifuld hjælp til brugeren, når de skriver --help.

Vores argument vil blive navngivet --path. De dobbelte streger foran navnet fortæller biblioteket, at dette er et valgfrit argument. Som standard vil vi bruge den aktuelle mappe, så indstil standardværdien til at være ".".

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", ) # parse the arguments given by the user and extract the path args = parser.parse_args() path = args.path print(f"Cleaning up directory {path}")

Dette afslutter allerede afsnittet om analyse af argumenter - det er ret simpelt og læsbart, ikke?

Lad os udføre vores script og kontrollere for fejl.

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

Når de er udført, kan vi se katalognavnet blive udskrevet til konsollen, perfekt.

Lad os nu bruge osbiblioteket til at hente filerne på den givne sti.

Henter en liste over filer fra mappen

Ved at bruge os.listdir(path)metoden og give den en gyldig sti får vi en liste over alle filer og mapper inde i den mappe.

Efter at have listet alle elementer i mappen vil vi skelne mellem filer og mapper, da vi ikke ønsker at rydde op i mapperne, kun filerne.

I dette tilfælde bruger vi en Python-listeforståelse til at gentage alle elementerne og placere dem i de nye lister, hvis de opfylder det givne krav om at være en fil eller mappe.

# get all files from given directory dir_content = os.listdir(path) # create a relative path from the path to the file and the document name path_dir_content = [os.path.join(path, doc) for doc in dir_content] # filter our directory content into a documents and folders list 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)] # counter to keep track of amount of moved files # and list of already created folders to avoid multiple creations moved = 0 created_folders = [] print(f"Cleaning up {len(docs)} of {len(dir_content)} elements.")

Lad os som altid sørge for, at vores brugere får feedback. Så tilføj en udskriftserklæring, der giver brugeren en indikation om, hvor mange filer der flyttes.

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

Efter genudførelse af python-scriptet kan vi nu se, at den /testmappe, jeg oprettede, indeholder 60 filer, der flyttes.

Oprettelse af en mappe til hver filtypenavn

Det næste og mere vigtige trin nu er at oprette mappen til hver af filtypenavnet. Vi ønsker at gøre dette ved at gå gennem alle vores filtrerede filer, og hvis de allerede har en udvidelse, som der ikke er nogen mappe for, skal du oprette en.

Den osBiblioteket hjælper os med mere flot funktionalitet som opdelingen af filtype og sti af et givet dokument, udtrække den vej selv og navnet på dokumentet.  

# go through all files and move them into according folders for doc in docs: # separte name from file extension 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

The break statement at the end of the code above makes sure that our terminal does not get spammed if our directory contains dozens of files.

Once we've set this up, let's execute our script to see an output similar to this:

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

We can now see that the implementation above splits off the filetype and then extracts the parts from the full path.

Since we have the filetype now, we can check if a folder with the name of this type already exists.

Before we do that, we want to make sure to skip a few files. If we use the current directory "." as the path, we need to avoid moving the python script itself. A simple if condition takes care of that.

In addition to that, we don't want to move Hidden Files, so let's also include all files that start with a dot. The .DS_Store file on macOS is an example of a hidden file.

 # skip this file when it is in the directory if doc_name == "directory_clean" or doc_name.startswith('.'): continue # get the subfolder name and create folder if not exist subfolder_path = os.path.join(path, filetype[1:].lower()) if subfolder_path not in folders: # create the folder

Once we've taken care of the python script and hidden files, we can now move on to creating the folders on the system.

In addition to our check, if the folder already was there when we read the content of the directory, in the beginning, we need a way to track the folders we've already created. That was the reason we declared the created_folders = [] list. It will serve as the memory to track the names of folders.

To create a new folder, the os library provides a method called os.mkdir(folder_path) that takes a path and creates a folder with the given name there.

This method may throw an exception, telling us that the folder already exists. So let's also make sure to catch that error.

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}")

After setting up the folder creation, let's re-execute our script.

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

On the first run of execution, we can see a list of logs telling us that the folders with the given types of file extensions have been created.

Moving each file into the right subfolder

The last step now is to actually move the files into their new parent folders.

An important thing to understand when working with os operations is that sometimes operations can not be undone. This is, for example, the case with deletion. So it makes sense to first only log out the behavior our script would achieve if we execute it.

This is why the os.rename(...) method has been commented here.

# get the new folder path and move the file 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}")

After executing our script and seeing the correct logging, we can now remove the comment hash before our os.rename() method and give it a final go.

# get the new folder path and move the file 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.")
python directory_clean.py --path ./test => ... => Moved file ./test/test17.pdf to ./test/pdf/test17.pdf => ... => Renamed 60 of 60 files.

This final execution will now move all the files into their appropriate folders and our directory will be nicely cleaned up without the need for manual actions.

In the next step, we could now use the script we created above and, for example, schedule it to execute every Monday to clean up our Downloads folder for more structure.

That is exactly what we are creating as a follow-up inside of our Bot Creation and Workflow Automation Udemy course.

A Complete Guide to Bot Creation and Automating Your Everyday Work

Felix and I built an online video course to teach you how to create your own bots based on what we've learned building InstaPy and his Travian-Bot. In fact, he was even forced to take down since it was too effective.

Join right in and start learning.

Hvis du har spørgsmål eller feedback, er du velkommen til at kontakte os på Twitter eller direkte i diskussionsafsnittet på kurset?