Skip to main content

Automate! Automate!

 Making this customizable

πŸ‘‰So how about making our search user customizable? In the code below, I have:


Asked the user to input an artist (line 14)

Tidied up their input (line 15)

formatted the search URL as an fString that includes the artist (line 19)

Here's tAutomate! Automate!

We are so close. I can taste it, folks! Massive kudos on getting this far!


Today's lesson, however, will work best if you have one of Replit's paid for features (hacker plan or cycles).


Free plan Repls 'fall asleep' after a while. Automation kinda relies on the Repl being always on.


If you have hacker plan or you've bought some cycles, then you can enable always on in the drop down menu that appears when you click your Repl name (top left).he code:


This is important because when our repl is always running, it can keep track of time and schedule events.


πŸ‘‰ I've set up a simple schedule that prints out a clock emoji every couple of seconds. It works like this:


Import schedule library

Create a simple subroutine that outputs the emoji.

Schedule the subroutine to run every 2 seconds with schedule.every(2).seconds.do(printMe)

Create an infinite loop that repeats schedule.run_pending() - this means run any tasks in the schedule.

import schedule


def printMe():

  print("⏰")


schedule.every(2).seconds.do(printMe)


while True:

  schedule.run_pending()


This is great and everything, but it's a HUGE resource hog - look at the CPU indicator in the 'Repl Resources' pane! It's running that while True loop thousands (millions?) of times a second to check if there's anything in the schedule.



A quick hack for this is to put a little time.sleep() to make the loop run once per second instead. Here's the code:

import schedule, time # Import the time library


def printMe():

  print("⏰")


schedule.every(2).seconds.do(printMe)


while True:

  schedule.run_pending()

  time.sleep(1) # Pause for 1 second before moving on


What if we wanted to run something every few minutes instead? Easy peasy!

schedule.every(2).minutes.do(printMe)

Hours? Of course!

schedule.every(2).hours.do(printMe)


Email? How Quaint.

You will need an email account for this. I'm using GMail and generating a one time password. Gmail users can do this in the security settings for your google account (generate an app password). Other mail services may let you use your regular password, but Gmail has this extra security layer.


In Gmail, choose 'Mail App' and 'Other' (call it 'Replit').

How about we send ourselves a very lovely email to remind ourselves to take a little break.




 Copy the app password and set it as a Repl secret called mailPassword.


πŸ‘‰ Add another secret mailUsername and set it to your email address.


πŸ‘‰ Import os and add your secrets to the code:

import schedule, time, os


password = os.environ['mailPassword']

username = os.environ['mailUsername']


def printMe():

  print("⏰")


schedule.every(2).seconds.do(printMe)


while True:

  schedule.run_pending()

  time.sleep(1)


Set up the mail

πŸ‘‰ Now we can set up the mail.


There is a LOT going on here, so I've commented all of the new code.


TLDR: New imports. New subroutine to set all the mail parameters. Create the mail & send it. Call the subroutine to test it.


import schedule, time, os, smtplib # Import the smtp library

from email.mime.multipart import MIMEMultipart # Import the mime library to create multipart messages

from email.mime.text import MIMEText # Import the mime library to create text messages


password = os.environ['mailPassword']

username = os.environ['mailUsername']


def sendMail():

  email = "Don't forget to take a break!" # Contents of the message

  server = "smtp.gmail.com" # Address of the mail server, change it to yours if you need to

  port = 587 # Port of the mail server, change it to yours if you need to

  s = smtplib.SMTP(host = server, port = port) # Creates the server connection using the host and port details

  s.starttls() # Sets the encryption mode

  s.login(username, password) # Logs into the email server for us


  msg = MIMEMultipart() # Creates the message

  msg['To'] = "recipient@email.com" # Sets the receiver's email address

  msg['From'] = username # Sets the sender's email address

  msg['Subject'] = "Take a BREAK" # Sets the subject of the message

  msg.attach(MIMEText(email, 'html')) # Attaches the email content to the message as html


  s.send_message(msg) # Sends the message

  del msg # Deletes the message from memory


sendMail() # Call the subroutine to test it.


def printMe():

  print("⏰")


schedule.every(2).seconds.do(printMe)


while True:

  schedule.run_pending()

  time.sleep(1)


Schedule it

πŸ‘‰ Now let's schedule it to send every hour:

import schedule, time, os, smtplib 

from email.mime.multipart import MIMEMultipart 

from email.mime.text import MIMEText 


password = os.environ['mailPassword']

username = os.environ['mailUsername']


def sendMail():

  email = "Don't forget to take a break!" 

  server = "smtp.gmail.com" 

  port = 587 

  s = smtplib.SMTP(host = server, port = port) 

  s.starttls() 

  s.login(username, password) 


  msg = MIMEMultipart() 

  msg['To'] = "recipient@email.com" 

  msg['From'] = username 

  msg['Subject'] = "Take a BREAK" 

  msg.attach(MIMEText(email, 'html'))


  s.send_message(msg) 

  del msg 




def printMe():

  print("⏰ Sending Reminder")

  sendMail() # Moved the subroutine into printMe which is already scheduled


schedule.every(1).hours.do(printMe) # Changed the interval to every 1 hour


while True:

  schedule.run_pending()

  time.sleep(1)

Comments

Popular posts from this blog

Hide & Remove,Come Back!,

 Hide & Remove DISCLAIMER: I promise the good stuff is coming back. We have to go through the valley to get to the mountain, right? Sometimes, we want to remove a button, image or piece of text from the screen. To do this, we use pack_forget(). πŸ‘‰ We'll start with our default tkinter program. import tkinter as tk window = tk.Tk() window.title("Hello World")  window.geometry("300x200")  hello = tk.Label(text = "Hello World")  hello.pack()  button = tk.Button(text = "Click me!")  button.pack() tk.mainloop() πŸ‘‰ Now I'm going to add a new subroutine to hide the label and call it on a button click. import tkinter as tk window = tk.Tk() window.title("Hello World")  window.geometry("300x200")  # New subroutine def hideLabel():   hello.pack_forget() # Removes the 'hello' label hello = tk.Label(text = "Hello World")  hello.pack()  button = tk.Button(text = "Click me!", command = hideLabel) # Call...

String Manipulation

   String Manipulation Does this code look familiar from the insult generator project? name = input("What's your name? ") if name == "David" or name == "david":   print("Hello Baldy!") else:    print("What a beautiful head of hair!") Right now, if the user writes "DAVID" or "david", the if statement works correctly. However, "DaVID" does not give the correct output. To the computer, " david", "dAviD", and "david" are completely different. To simplify what the user typed in, we can add these functions to the end of the name of the variable: .lower() = all letters are lower case .upper() = all letters are upper case .title() = capital letter for the first letter of every word .capitalize() = capital letter for the first letter of only the first word    

Web Scraping

 Web Scraping Some websites don't have lovely APIs for us to interface with. If we want data from these pages, we have to use a tecnique called scraping. This means downloading the whole webpage and poking at it until we can find the information we want. You're going to use scraping to get the top ten restaurants near you. Get started πŸ‘‰ Go to a website like Yelp and search for the top 10 reastaurants in your location. Copy the URL.   url = "https://www.yelp.co.uk/search?find_desc=Restaurants&find_loc=San+Francisco%2C+CA%2C+United+States"   Import libraries πŸ‘‰ Import your libraries. Beautiful soup is a specialist library for extracting the contents of HTML and helping us parse them. Run the Repl once your imports are sorted because we want the Beautiful Soup library to be installed (it'll run quicker this way). import requests from bs4 import BeautifulSoup url = "https://www.yelp.co.uk/search?find_desc=Restaurants&find_loc=San+Francisco%2C+CA%2C+Unite...