This repository has been archived on 2020-04-03. You can view files and clone it, but cannot push or open issues or pull requests.
price_checker/price_checker.py

120 lines
3.7 KiB
Python
Executable File

#!/usr/bin/env python3
# get user email -> get url -> get price
# download website -> search for price -> compare price
# if price = website.price -> send mail(user.mail, url)
from bs4 import BeautifulSoup
import requests
import time
import smtplib
import os
import sys
import configparser
import dryscrape
import lxml
from datetime import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
class Email(object):
def __init__(self, recipient):
self.recipient = recipient
def connecting(self, smtp_server, smtp_port):
self.server = smtplib.SMTP_SSL(smtp_server, smtp_port)
self.server.ehlo()
def login(self, sender, password):
self.server.login(sender, password)
def sending(self, sender, message):
msg = MIMEMultipart()
msg['Subject'] = "Found a price match!"
msg['From'] = "Price Checker"
body = message
msg.attach(MIMEText(body, 'plain'))
text = msg.as_string()
try:
self.server.sendmail(sender, self.recipient, text)
self.server.quit()
print("Successfully sent email")
except SMTPException:
print("Error: unable to send email")
self.server.quit()
class Website(object):
def __init__(self, url):
self.url = url
def get_page(self):
session = dryscrape.Session()
session.set_attribute('auto_load_images', False)
session.visit(self.url)
page = session.body()
self.soup = BeautifulSoup(page, "lxml")
def extract_price(self):
prices = [a.get_text() for
a in self.soup.find_all("span", class_="amount ng-binding")]
lowest_price = min(int(s) for s in prices)
return int(lowest_price)
class Configuration():
def __init__(self):
self.check_location()
self.apply_settings()
def check_location(self):
# setup the config parser
self.config = configparser.ConfigParser()
# check whether the config file exists either in the home
# folder or next to the binary
home = os.getenv('HOME')
config_file = "price_checker.cfg"
config_folder = ".config/price_checker/"
config_path = os.path.join(home, config_folder, config_file)
if os.path.isfile(config_path):
return self.config.read(config_path)
elif os.path.isfile(config_file):
return self.config.read(config_file)
else:
print("Configuration file not found.")
sys.exit(1)
def apply_settings(self):
# assign the password variable
self.password = self.config['DEFAULT']['password']
# assign the smtp_server variable
self.smtp_server = self.config['DEFAULT']['smtp_server']
# assign the smtp_port variable
self.smtp_port = self.config['DEFAULT']['smtp_port']
# assign the email_address variable
self.sender_address = self.config['DEFAULT']['sender_address']
# assign the url variable
self.url = self.config['DEFAULT']['url']
# assign the price variable
self.price = int(self.config['DEFAULT']['price'])
# assign the recipient variable
self.recipient_address = self.config['DEFAULT']['recipient_address']
dryscrape.start_xvfb()
settings = Configuration()
email = Email(settings.recipient_address)
website = Website(settings.url)
website.get_page()
if website.extract_price() < settings.price:
email.connecting(settings.smtp_server, settings.smtp_port)
email.login(settings.sender_address, settings.password)
email.sending(settings.sender_address, settings.url)
sys.exit(0)
else:
sys.exit(0)