This commit is contained in:
107
bibcheck.py
107
bibcheck.py
@@ -8,69 +8,126 @@ import mechanize
|
|||||||
import pushover
|
import pushover
|
||||||
import datetime
|
import datetime
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logging.basicConfig(level=getattr(logging, os.environ.get("LOG_LEVEL", "INFO")))
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def split_notify(string):
|
def split_notify(string):
|
||||||
values = string.split(':')
|
values = string.split(":")
|
||||||
return (values[0], values[1:])
|
return (values[0], values[1:])
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
try:
|
||||||
|
pushover.init(os.environ["PUSHOVER_KEY"])
|
||||||
|
except:
|
||||||
|
_logger.exception("Pushover KEY is required")
|
||||||
|
return
|
||||||
while True:
|
while True:
|
||||||
pushover.init(os.environ['PUSHOVER_KEY'])
|
try:
|
||||||
if 'HEALTHCHECK_URL' in os.environ:
|
_logger.info("Starting Bibcheck")
|
||||||
|
if "HEALTHCHECK_URL" in os.environ:
|
||||||
|
_logger.info("Pinging Healthcheck [start]")
|
||||||
|
_logger.debug(
|
||||||
|
f"Pinging Healthcheck Url {os.environ['HEALTHCHECK_URL']}/start"
|
||||||
|
)
|
||||||
requests.get(f"{os.environ['HEALTHCHECK_URL']}/start")
|
requests.get(f"{os.environ['HEALTHCHECK_URL']}/start")
|
||||||
allinfo = []
|
allinfo = []
|
||||||
users = list(map(lambda x: x.split(':', 1), os.environ['BIB_USERS'].split(',')))
|
users = list(
|
||||||
notify = dict(map(split_notify, os.environ['NOTIFY_USERS'].split(',')))
|
map(lambda x: x.split(":", 1), os.environ["BIB_USERS"].split(","))
|
||||||
|
)
|
||||||
|
notify = dict(map(split_notify, os.environ["NOTIFY_USERS"].split(",")))
|
||||||
|
_logger.info(f"Found {len(users)} user(s) to check for")
|
||||||
for user, pwd in users:
|
for user, pwd in users:
|
||||||
|
_logger.info(f"Check for {user}")
|
||||||
allinfo += check(user, pwd, notify.get(user, []))
|
allinfo += check(user, pwd, notify.get(user, []))
|
||||||
if 'HEALTHCHECK_URL' in os.environ:
|
if "HEALTHCHECK_URL" in os.environ:
|
||||||
requests.post(f"{os.environ['HEALTHCHECK_URL']}", data='\n'.join(allinfo).encode('utf8'))
|
_logger.info("Pinging Healthcheck [stop]")
|
||||||
if 'RUN_FOREVER' in os.environ and os.environ['RUN_FOREVER'] == 'False':
|
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":
|
||||||
|
_logger.info("Finished")
|
||||||
break
|
break
|
||||||
|
except Exception as e:
|
||||||
|
_logger.exception("Check Failed ")
|
||||||
|
if "HEALTHCHECK_URL" in os.environ:
|
||||||
|
_logger.info("Pinging Healthcheck [failed]")
|
||||||
|
_logger.debug(
|
||||||
|
f"Pinging Healthcheck Url {os.environ['HEALTHCHECK_URL']}/fail"
|
||||||
|
)
|
||||||
|
requests.post(
|
||||||
|
f"{os.environ['HEALTHCHECK_URL']}/fail",
|
||||||
|
data="\n".join(allinfo).encode("utf8"),
|
||||||
|
)
|
||||||
|
|
||||||
now = datetime.datetime.utcnow
|
now = datetime.datetime.utcnow
|
||||||
to = (now() + datetime.timedelta(days = 1)).replace(hour=os.environ.get('RUN_AT_HOUR', 6), minute=os.environ.get('RUN_AT_MINUTE', 0), second=0)
|
to = (now() + datetime.timedelta(days=1)).replace(
|
||||||
|
hour=os.environ.get("RUN_AT_HOUR", 6),
|
||||||
|
minute=os.environ.get("RUN_AT_MINUTE", 0),
|
||||||
|
second=0,
|
||||||
|
)
|
||||||
|
_logger.info(f"Sleeping till {to.isodate()}")
|
||||||
time.sleep((to - now()).seconds)
|
time.sleep((to - now()).seconds)
|
||||||
|
|
||||||
|
|
||||||
def check(username, password, notify_ids):
|
def check(username, password, notify_ids):
|
||||||
br = mechanize.Browser()
|
br = mechanize.Browser()
|
||||||
starturl = os.environ.get('LIBRARY_URL', 'https://ssl.muenchen.de/aDISWeb/app?service=direct/0/Home/$DirectLink&sp=SOPAC')
|
starturl = os.environ.get(
|
||||||
|
"LIBRARY_URL",
|
||||||
|
"https://ssl.muenchen.de/aDISWeb/app?service=direct/0/Home/$DirectLink&sp=SOPAC",
|
||||||
|
)
|
||||||
|
_logger.info(f"Library URL used: {starturl}")
|
||||||
response = br.open(starturl)
|
response = br.open(starturl)
|
||||||
|
_logger.info(f"Goto loginpage")
|
||||||
br.follow_link(text_regex=r"Anmeld(en|ung abschicken)")
|
br.follow_link(text_regex=r"Anmeld(en|ung abschicken)")
|
||||||
br.select_form('Form0')
|
_logger.info(f"Fill form")
|
||||||
br['$Textfield'] = username
|
br.select_form("Form0")
|
||||||
br['$Textfield$0'] = password
|
br["$Textfield"] = username
|
||||||
|
br["$Textfield$0"] = password
|
||||||
|
_logger.info(f"Sumbit form")
|
||||||
response = br.submit()
|
response = br.submit()
|
||||||
|
_logger.info(f"Open account page")
|
||||||
br.follow_link(text_regex=r"Konto")
|
br.follow_link(text_regex=r"Konto")
|
||||||
try:
|
try:
|
||||||
|
_logger.info(f"Open lent list")
|
||||||
response = br.follow_link(text_regex=r"Ausleihen? zeigen")
|
response = br.follow_link(text_regex=r"Ausleihen? zeigen")
|
||||||
br.select_form('Form0')
|
br.select_form("Form0")
|
||||||
response = br.submit(name='textButton$0', label='Alle verlängern')
|
response = br.submit(name="textButton$0", label="Alle verlängern")
|
||||||
lentlist = bs4.BeautifulSoup(response.read(), 'html.parser')
|
lentlist = bs4.BeautifulSoup(response.read(), "html.parser")
|
||||||
table = lentlist.select('table[class="rTable_table"]')[0]
|
table = lentlist.select('table[class="rTable_table"]')[0]
|
||||||
allinfo = []
|
allinfo = []
|
||||||
for entry in table.tbody.select('tr'):
|
_logger.info(f"Parsing table")
|
||||||
info = list(map(lambda x: str(x.text).strip(), entry.select('td')))
|
for entry in table.tbody.select("tr"):
|
||||||
date = datetime.datetime.strptime(info[1], '%d.%m.%Y')
|
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()
|
delta = date - datetime.datetime.now()
|
||||||
allinfo.append(str(info))
|
allinfo.append(str(info))
|
||||||
if delta.days <= 10 or delta.days == 20 or delta.days == 15:
|
if delta.days <= 10 or delta.days == 20 or delta.days == 15:
|
||||||
message = f'Bitte an {info[3]} denken\n'
|
message = f"Bitte an {info[3]} denken\n"
|
||||||
if delta.days <= 7:
|
if delta.days <= 7:
|
||||||
message += '<font color="#ff0000">'
|
message += '<font color="#ff0000">'
|
||||||
message += f'Abgabe <b>{info[1]}</b>'
|
message += f"Abgabe <b>{info[1]}</b>"
|
||||||
if delta.days <= 7:
|
if delta.days <= 7:
|
||||||
message += '</font>'
|
message += "</font>"
|
||||||
message += f' - {username}'
|
message += f" - {username}"
|
||||||
for client in itertools.chain(notify_ids, os.environ.get('PUSHOVER_CLIENTS', '').split(',')):
|
for client in itertools.chain(
|
||||||
|
notify_ids, os.environ.get("PUSHOVER_CLIENTS", "").split(",")
|
||||||
|
):
|
||||||
try:
|
try:
|
||||||
pushover.Client(client).send_message(message, title="Erinnerung", html=1)
|
pushover.Client(client).send_message(
|
||||||
|
message, title="Erinnerung", html=1
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
print("No client")
|
print("No client")
|
||||||
except (StopIteration, mechanize._mechanize.LinkNotFoundError) as e:
|
except (StopIteration, mechanize._mechanize.LinkNotFoundError) as e:
|
||||||
|
_logger.exception("Failed to read information")
|
||||||
return []
|
return []
|
||||||
return allinfo
|
return allinfo
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user