This commit is contained in:
2019-09-24 07:03:15 +02:00
parent b8b98aadb6
commit 91339cb19d
4 changed files with 108 additions and 0 deletions

15
.drone.yml Normal file
View File

@@ -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

13
Dockerfile Normal file
View File

@@ -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"]

68
bibcheck.py Normal file
View File

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

12
requirements.txt Normal file
View File

@@ -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