Files
bibreminder/bibcheck.py
2020-01-17 14:27:47 +01:00

69 lines
2.7 KiB
Python

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()