From 93a5150bf9768a42eb8a1f927903021c96391150 Mon Sep 17 00:00:00 2001 From: acid Date: Sat, 6 Mar 2021 15:37:16 +0000 Subject: [PATCH] Refactored to functional style to increase reusability --- .gitignore | 2 ++ requirements.txt | 13 +++++++ scrape.py | 90 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index ac25a99..6af289f 100644 --- a/.gitignore +++ b/.gitignore @@ -163,3 +163,5 @@ pip-selfcheck.json *.code-workspace # End of https://www.toptal.com/developers/gitignore/api/python,vscode,venv + +sent.txt \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a718226 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +autopep8==1.5.5 +certifi==2020.12.5 +chardet==4.0.0 +idna==2.10 +pycodestyle==2.6.0 +PyJWT==1.7.1 +python-dotenv==0.15.0 +pytz==2021.1 +requests==2.25.1 +six==1.15.0 +toml==0.10.2 +twilio==6.53.0 +urllib3==1.26.3 diff --git a/scrape.py b/scrape.py index 4bda2fe..7783f98 100644 --- a/scrape.py +++ b/scrape.py @@ -4,43 +4,73 @@ import os from sys import exit from pathlib import Path from dotenv import load_dotenv +import logging load_dotenv(verbose=True) api_url = 'https://www.boden.co.uk/api/stock/v1/styles?market=UK&language=en-gb&id=y1357' -website_url = 'https://www.boden.co.uk/en-gb/rainbow-3-in-1-printed-jacket/sty-y1357' -# 40263447 low stock -# 40263442 12-18m -item_id = '40263442' +item_id = '40263442' # 40263447 low stock, 40263442 12-18m message_sent_file = './sent.txt' +msg_to = '+447557447469' +website_url = 'https://www.boden.co.uk/en-gb/rainbow-3-in-1-printed-jacket/sty-y1357' -if os.path.isfile(message_sent_file): - print("We have already sent SMS") - exit() +def get_logger(log_level=logging.WARN): + log = logging.getLogger(__name__) + log.setLevel(logging.WARN) + log_handler = logging.StreamHandler() + log_handler.setFormatter(logging.Formatter('[%(filename)s:(%(lineno)d)] %(levelname)s >> %(message)s')) + log.addHandler(log_handler) -r = requests.get(api_url) -j = r.json() + return log -for id in j['Y1357']: - if id['edp'] == item_id: - if id['stockStatus'] == 'OutOfStock': - print(f"Item is out of stock") - else: - print(f"Item is in stock") - # Your Account Sid and Auth Token from twilio.com/console - # and set the environment variables. See http://twil.io/secure - account_sid = os.environ['TWILIO_ACCOUNT_SID'] - auth_token = os.environ['TWILIO_AUTH_TOKEN'] - client = Client(account_sid, auth_token) - client = Client(account_sid, auth_token) - - message = client.messages.create( - messaging_service_sid='MG18978bd18247c16cc39d743251106813', - body='The coat is in stock at ' + website_url, - to='+447557447469' - ) - - print(message.sid) - Path(message_sent_file).touch() \ No newline at end of file +def get_json_from_url(url: str) -> dict: + r = requests.get(url) + return r.json() + + +def send_sms(to: str, msg: str): + account_sid = os.environ['TWILIO_ACCOUNT_SID'] + auth_token = os.environ['TWILIO_AUTH_TOKEN'] + messaging_sid = os.environ['TWILIO_MESSAGE_SID'] + client = Client(account_sid, auth_token) + + message = client.messages.create( + messaging_service_sid=messaging_sid, + body=msg, + to=to + ) + + log = logging.getLogger(__name__) + log.debug(message.sid) + +def stop_if_previous_action(lock_file: str): + if os.path.isfile(lock_file): + log = logging.getLogger(__name__) + log.info("Script has already run it's action before") + exit() + +def action_taken(lock_file): + Path(lock_file).touch() + +def main(log): + # This script runs once, to avoid spamming SMS every time run + stop_if_previous_action(message_sent_file) + + j = get_json_from_url(api_url) + + for id in j['Y1357']: + if id['edp'] == item_id: + if id['stockStatus'] == 'OutOfStock': + log.info(f"Item is out of stock") + else: + log.info(f"Item is in stock") + send_sms(msg_to, 'The coat is in stock at ' + website_url) + + # Prevents it being run again + action_taken(message_sent_file) + +if __name__ == '__main__': + log = get_logger(logging.WARN) + main(log) \ No newline at end of file