From 91339cb19dcba27824e31df8176609eb506bb226 Mon Sep 17 00:00:00 2001 From: Matthias Bilger Date: Tue, 24 Sep 2019 07:03:15 +0200 Subject: [PATCH] bibcheck --- .drone.yml | 15 +++++++++++ Dockerfile | 13 +++++++++ bibcheck.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 12 +++++++++ 4 files changed, 108 insertions(+) create mode 100644 .drone.yml create mode 100644 Dockerfile create mode 100644 bibcheck.py create mode 100644 requirements.txt diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..388d5f0 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,15 @@ +kind: pipeline +name: default + +steps: + - name: docker + image: plugins/docker + settings: + registry: registry.d1v3.de + repo: registry.d1v3.de/bibcheck + username: + from_secret: docker_username + password: + from_secret: docker_password + tags: latest + auto_tag: true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7e03a92 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.7 + +RUN useradd --create-home appuser + +COPY requirements.txt /home/appuser +RUN pip install -r /home/appuser/requirements.txt + + +WORKDIR /home/appuser +USER appuser + +COPY bibcheck.py ./ +CMD ["python", "./bibcheck.py"] diff --git a/bibcheck.py b/bibcheck.py new file mode 100644 index 0000000..2289536 --- /dev/null +++ b/bibcheck.py @@ -0,0 +1,68 @@ +import bs4 +import itertools +import time +import requests +import configparser +import urllib.parse +import mechanize +import pushover +import datetime +import os + +def split_notify(string): + values = string.split(':') + return (values[0], values[1:]) + + +def main(): + while True: + pushover.init(os.environ['PUSHOVER_KEY']) + if 'HEALTHCHECK_URL' in os.environ: + requests.get(f"{os.environ['HEALTHCHECK_URL']}/start") + allinfo = [] + users = list(map(lambda x: x.split(':', 1), os.environ['BIB_USERS'].split(','))) + notify = dict(map(split_notify, os.environ['NOTIFY_USERS'].split(','))) + for user, pwd in users: + allinfo += check(user, pwd, notify.get(user, [])) + if 'HEALTHCHECK_URL' in os.environ: + requests.post(f"{os.environ['HEALTHCHECK_URL']}", data='\n'.join(allinfo).encode('utf8')) + if 'RUN_FOREVER' in os.environ and os.environ['RUN_FOREVER'] == 'False': + break + + now = datetime.datetime.utcnow + to = (now() + datetime.timedelta(days = 1)).replace(hour=6, minute=0, second=0) + time.sleep((to-now()).seconds) + +def check(username, password, notify_ids): + br = mechanize.Browser() + starturl = 'https://ssl.muenchen.de/aDISWeb/app?service=direct/0/Home/$DirectLink&sp=SOPAC' + response = br.open(starturl) + br.follow_link(text_regex=r"Anmelden") + br.select_form('Form0') + br['$Textfield'] = username + br['$Textfield$0'] = password + response = br.submit() + br.follow_link(text_regex=r"Konto") + try: + response = br.follow_link(text_regex=r"Ausleihen? zeigen") + br.select_form('Form0') + response = br.submit(name='textButton$0', label='Alle verlängern') + lentlist = bs4.BeautifulSoup(response.read(), 'html.parser') + table = lentlist.select('table[class="rTable_table"]')[0] + allinfo = [] + for entry in table.tbody.select('tr'): + info = list(map(lambda x: str(x.text).strip(), entry.select('td'))) + date = datetime.datetime.strptime(info[1], '%d.%m.%Y') + delta = date - datetime.datetime.now() + allinfo.append(str(info)) + if delta.days <= 10 or delta.days == 20 or delta.days == 15: + for client in itertools.join(notify_ids, os.environ['PUSHOVER_CLIENTS'].split(',')): + pushover.Client(client).send_message(f'Bitte an {info[3]} denken, Abgabe {info[3]} - {username}', title="Erinnerung") + except (StopIteration, mechanize._mechanize.LinkNotFoundError) as e: + for client in itertools.join(notify_ids, os.environ['PUSHOVER_CLIENTS'].split(',')): + pushover.Client(client).send_message(f'nichts ausgeliehen {username} ({e})') + return [] + return allinfo + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b4b3331 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +beautifulsoup4==4.8.0 +certifi==2019.9.11 +chardet==3.0.4 +html5lib==1.0.1 +idna==2.8 +mechanize==0.4.3 +python-pushover==0.4 +requests==2.22.0 +six==1.12.0 +soupsieve==1.9.3 +urllib3==1.25.5 +webencodings==0.5.1