Skip to content

Instantly share code, notes, and snippets.

@luisliz
Created December 16, 2019 01:41
Show Gist options
  • Save luisliz/0d5f6f8f364505b8fc0a7bfd15709770 to your computer and use it in GitHub Desktop.
Save luisliz/0d5f6f8f364505b8fc0a7bfd15709770 to your computer and use it in GitHub Desktop.
import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from datetime import datetime
from twilio.rest import Client
import time
#The login url you want
LOGINURL = "https://idp.upr.edu/module.php/core/loginuserpass.php?AuthState=_7690d1d677407e673e8835578bfbc083ef404cad91%3Ahttps%3A%2F%2Fidp.upr.edu%2Fsaml2%2Fidp%2FSSOService.php"
#Url you want to check for
REQUESTURL = 'https://online.upr.edu/grade/report/user/index.php?id=138331'
payload = {
'username': 'abc@email.edu', #Put email or username here.
'password': 'password123' #Put accoutn password here
}
changesFileName = "currentGrades.txt"
usernameElementName = "nameOfusernameField"
passwordElementName = "nameOfpasswordField"
gradesTableClass = "gradesTableClass"
logFile = "log.txt"
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options) #remove this option to show browser
def log(action):
f = open(logFile, "a")
current_time = datetime.now().strftime("%H:%M:%S")
log = current_time + " " + action
print(log)
f.write(log)
f.close()
#This requires a Twilio account
#Set TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN environment variables
def notifyGroup(change):
client = Client()
# this is the Twilio sandbox testing number
from_whatsapp_number='whatsapp:+14155238886'
# replace this number with your own WhatsApp Messaging number
to_whatsapp_number='whatsapp:+19993339922'
client.messages.create(body=change, from_=from_whatsapp_number, to=to_whatsapp_number)
def login():
driver.get(LOGINURL)
driver.find_element_by_name(usernameElementName).send_keys(payload['username'])
driver.find_element_by_name(passwordElementName).send_keys(payload['password'])
driver.find_element_by_name(passwordElementName).submit()
URL = driver.current_url;
while not URL == REQUESTURL:
URL = driver.current_url;
if not URL == REQUESTURL and not URL == LOGINURL:
driver.get(REQUESTURL)
def scrape():
login()
log("Logged In")
delay = 2
try:
myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.CLASS_NAME, gradesTableClass)))
f = open(changesFileName, "r")
oldData = f.read()
f.close()
gradesElem = driver.find_element_by_class_name(gradesTableClass)
data = gradesElem.text
if not oldData == data:
log("Changed Changed!!")
notifyGroup(data)
else:
log("No Change...")
f = open(changesFileName, "w")
f.write(data)
f.close()
except TimeoutException:
print("Loading took too much time!")
while(True):
log("Starting Scraper")
scrape()
log("Waiting 5 Minutes")
time.sleep(300)
@luisliz
Copy link
Author

luisliz commented Dec 16, 2019

if done with the right parameters it checks for grades and sends you a whatsapp message when grades are updated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment