Kako izraditi bota i automatizirati svoj svakodnevni posao

Većina poslova ima ponavljajuće zadatke koje možete automatizirati, što oslobađa dio vašeg dragocjenog vremena. To automatizaciju čini ključnom vještinom za stjecanje.

Mala skupina vještih inženjera automatizacije i stručnjaka za domene možda će moći automatizirati mnoge najzamornije zadatke čitavih timova.

U ovom ćemo članku istražiti osnove automatizacije tijeka rada pomoću Pythona - moćnog i lakog za učenje programskog jezika. Upotrijebit ćemo Python za pisanje jednostavne i korisne male skripte za automatizaciju koja će očistiti datu mapu i staviti svaku datoteku u odgovarajuću mapu.

Naš cilj neće biti pisanje savršenog koda ili stvaranje idealnih arhitektura u početku.

Također nećemo graditi ništa "ilegalno". Umjesto toga, pogledati ćemo kako stvoriti skriptu koja automatski čisti datu mapu i sve njezine datoteke.

Sadržaj

  1. Područja automatizacije i gdje započeti
    • Jednostavna automatizacija
    • Javna API automatizacija
    • API inverzni inženjering
  2. Etička razmatranja automatizacije
  3. Stvaranje skripte za čišćenje direktorija
  4. Cjelovit vodič za izradu botova i automatizaciju vašeg svakodnevnog posla

Područja automatizacije i gdje započeti

Počnimo s definiranjem kakve automatizacije postoje.

Umijeće automatizacije odnosi se na većinu sektora. Za početak pomaže kod zadataka poput izdvajanja adresa e-pošte iz gomile dokumenata kako biste mogli napraviti e-poštu. Ili složeniji pristupi poput optimizacije tijekova rada i procesa unutar velikih korporacija.

Naravno, prelazak s malih osobnih skripti na veliku infrastrukturu automatizacije koja zamjenjuje stvarne ljude uključuje proces učenja i poboljšanja. Pa da vidimo gdje možete započeti svoje putovanje.

Jednostavne automatizacije

Jednostavne automatizacije omogućuju brzu i jednostavnu ulaznu točku. To može obuhvatiti male neovisne procese poput čišćenja projekata i prestrukturiranja datoteka unutar direktorija ili dijelova radnog tijeka poput automatske promjene veličine već spremljenih datoteka.

Javne API automatizacije

Javne API automatizacije najčešći su oblik automatizacije budući da danas većini funkcija možemo pristupiti pomoću HTTP zahtjeva za API-je. Na primjer, ako želite automatizirati zalijevanje vlastitog pametnog vrta kod kuće.

Da biste to učinili, želite provjeriti vrijeme tekućeg dana kako biste vidjeli trebate li zalijevati ili dolazi li kiša.

API inverzni inženjering

Automatizacija temeljena na obrnutom inženjeringu API-a češća je kod stvarnih botova i odjeljka "Bot Imposter" grafikona u odjeljku "Etička razmatranja" u nastavku.

Reverznim inženjeringom API-ja razumijemo protok korisnika. Jedan od primjera može biti prijava u internetsku igru ​​preglednika.

Razumijevanjem postupka prijave i provjere autentičnosti to ponašanje možemo duplicirati vlastitom skriptom. Tada možemo stvoriti vlastito sučelje za rad s aplikacijom, iako je oni sami ne pružaju.

Bez obzira na pristup kojem ciljate, uvijek razmislite je li legalan ili ne.

Ne želite se upasti u nevolje, zar ne? ?

Etička razmatranja

Neki tip iz GitHub-a jednom me kontaktirao i rekao mi ovo:

"Lajkovi i angažman digitalna su valuta i vi ih obezvrijedite."

To me zalijepilo i natjeralo me da preispitam alat koji sam izradio upravo u tu svrhu.

Činjenica da se te interakcije i angažmani mogu automatizirati i sve više “lažirati” dovodi do iskrivljenog i slomljenog sustava društvenih medija.

Ljudi koji proizvode vrijedan i dobar sadržaj nevidljivi su za druge korisnike i oglašivačke tvrtke ako ne koriste botove i druge sustave za angažman.

Moj prijatelj smislio je sljedeću povezanost s Danteovim „Devet krugova pakla“ gdje sa svakim korakom bliže postajanju društvenim utjecajem postajete sve manje i manje svjesni koliko je zapravo cijeli taj sustav slomljen.

Želim ovo podijeliti s vama ovdje jer mislim da je to izuzetno točan prikaz onoga čemu sam svjedočio dok sam aktivno radio s Influencersima s InstaPyjem.

Razina 1: Limbo - ako uopće ne botate

Razina 2: flert - kada ručno lajkate i slijedite što više ljudi kako biste ih natjerali da vas prate / lajkaju vaše postove

Razina 3: Zavjera - kada se pridružite grupi Telegram da biste lajkali i komentirali 10 fotografija, tako da će se sljedećih 10 osoba svidjeti i komentirati vašu fotografiju

Razina 4: nevjera - kada koristite jeftinog virtualnog asistenta da biste lajkali i slijedili u vaše ime

Razina 5: Požuda - kada koristite bota za davanje lajkova i zauzvrat ne primite nijedno lajkanje (ali ga ne plaćate - na primjer, proširenje za Chrome)

Razina 6: Promiskuitet - kada botom dajete 50+ lajkova, dobivate 50+ lajkova, ali ga ne plaćate - na primjer, proširenje za Chrome

Razina 7: Škrtost ili ekstremna pohlepa - kada koristite bota da biste lajkali / pratili / komentirali između 200–700 fotografija, zanemarujući mogućnost dobivanja zabrane

Razina 8: Prostitucija - kada platite nepoznatu uslugu treće strane da biste sudjelovali u automatskim uzajamnim lajkovima / praćenjima umjesto vas, ali oni koriste vaš račun da bi lajkali / pratili

Razina 9: Prijevara / krivovjerje - kada kupujete sljedbenike i lajkove i pokušavate se prodati brandovima kao influencer

Razina botiranja na društvenim mrežama toliko je rasprostranjena da ćete zaglaviti na razini 1, Limbo , bez rasta sljedbenika i slabog angažmana u odnosu na svoje vršnjake.

U ekonomskoj teoriji to je poznato kao zatvorenikova dilema i igra nulte sume . Ako ja ne botam, a ti bota, ti pobjeđuješ. Ako vi ne botate, a ja botam, ja pobjeđujem. Ako se nitko ne bota, svi pobjeđuju. Ali budući da ne postoji poticaj za sve da se ne botuju, svi se botuju, pa nitko ne pobjeđuje.

Budite svjesni toga i nikada ne zaboravite na implikacije koje ovaj cijeli alat ima na društvenim mrežama.

Želimo izbjeći bavljenje etičkim implikacijama i ovdje još uvijek raditi na projektu automatizacije. Zbog toga ćemo stvoriti jednostavnu skriptu za čišćenje direktorija koja vam pomaže organizirati neuredne mape.

Stvaranje skripte za čišćenje direktorija

Sada želimo pogledati prilično jednostavnu skriptu. Automatski čisti određeni direktorij premještanjem tih datoteka u odgovarajuće mape na temelju nastavka datoteke.

Dakle, sve što želimo učiniti je sljedeće:

Postavljanje Parsera za argumente

Budući da radimo s funkcionalnošću operativnog sustava poput premještanja datoteka, moramo uvesti osknjižnicu. Uz to, želimo korisniku dati određenu kontrolu nad time koja se mapa čisti. Za to ćemo koristiti argparseknjižnicu.

import os import argparse

Nakon uvoza dvije knjižnice, prvo postavimo parser argumenata. Svakako dodajte opis i tekst pomoći za svaki dodani argument kako biste pružili korisnu pomoć korisniku kada tipka --help.

Naš će argument biti imenovan --path. Dvostruke crtice ispred imena govore knjižnici da je ovo neobavezan argument. Prema zadanim postavkama želimo koristiti trenutni direktorij, pa postavite zadanu vrijednost na ".".

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

Time je već završen odjeljak raščlanjivanja argumenata - prilično je jednostavan i čitljiv, zar ne?

Izvršimo našu skriptu i provjerimo greške.

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

Jednom izvršeno, možemo vidjeti ime direktorija ispisano na konzoli, savršeno.

Upotrijebimo sada osknjižnicu za dobivanje datoteka zadane staze.

Dohvaćanje popisa datoteka iz mape

Korištenjem os.listdir(path)metode i pružanjem valjane staze dobivamo popis svih datoteka i mapa unutar te mape.

Nakon navođenja svih elemenata u mapi, želimo razlikovati datoteke i mape jer ne želimo očistiti mape, već samo datoteke.

U ovom slučaju koristimo razumijevanje popisa Python da bismo pregledali sve elemente i stavili ih na nove popise ako ispunjavaju zadani zahtjev da budu datoteka ili mapa.

# 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.")

As always, let's make sure that our users get feedback. So add a print statement that gives the user an indication about how many files will be moved.

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

After re-executing the python script, we can now see that the /test folder I created contains 60 files that will be moved.

Creating a folder for every file extension

The next and more important step now is to create the folder for each of the file extensions. We want to do this by going through all of our filtered files and if they have an extension for which there is no folder already, create one.

The os library helps us with more nice functionality like the splitting of the filetype and path of a given document, extracting the path itself and name of the document.  

# 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.

If you have any questions or feedback, feel free to reach out to us on Twitter or directly in the discussion section of the course ?