9 Commits
2 changed files with 89 additions and 64 deletions
+65 -60
View File
@@ -23,8 +23,6 @@ import csv
import os import os
import re import re
import requests import requests
import httplib2
import urllib
import yaml import yaml
from datetime import datetime, timedelta from datetime import datetime, timedelta
@@ -32,34 +30,40 @@ from pathlib import Path
class Muell: class Muell:
# Variablen def __init__(self, config_file='.muell.yaml'):
__key = 'e21758b9c711463552fb9c70ac7d4273'
__modus = 'd6c5855a62cf32a4dadbc2831f0f295f'
__host = 'api.abfall.io' # Variablen
self.__config_file = config_file
self.__config = self.__readConfig()
self.__key = 'e21758b9c711463552fb9c70ac7d4273'
self.__modus = 'd6c5855a62cf32a4dadbc2831f0f295f'
__url = f'https://{__host}/?key={__key}&modus={__modus}&waction=export_csv' self.__host = 'api.abfall.io'
__export_als = f"{{'action':'{__url}','target':''}}"
__current_year = datetime.today().year self.__url = f'https://{self.__host}/?key={self.__key}&modus={self.__modus}'
__zeitraum = f'{__current_year}0101-{__current_year}1231' self.__export_als = f"{{'action':'{self.__url}&waction=export_csv','target':''}}"
__postdata = { self.__current_year = datetime.today().year
'f_id_abfalltyp_0': '50', self.__zeitraum = f'{self.__current_year}0101-{self.__current_year}1231'
'f_id_abfalltyp_1': '161',
'f_id_abfalltyp_2': '53',
'f_id_abfalltyp_3': '187',
'f_id_abfalltyp_4': '169',
'f_abfallarten_index_max': '5',
'f_abfallarten': '50,161,53,187',
'f_zeitraum': __zeitraum,
'f_export_als': __export_als,
}
__headers = { self.__postdata = {
'User-Agent': 'Mozilla/5.0 (Linux; x68_64; x64; rv:88.0) Gecko/20100101 Firefox/88.0', 'f_id_abfalltyp_0': '50',
'Content-Type': 'application/x-www-form-urlencoded', 'f_id_abfalltyp_1': '161',
} 'f_id_abfalltyp_2': '53',
'f_id_abfalltyp_3': '187',
'f_id_abfalltyp_4': '169',
'f_abfallarten_index_max': '5',
'f_abfallarten': '50,161,53,187',
'f_zeitraum': self.__zeitraum,
'f_export_als': self.__export_als,
}
self.__headers = {
'User-Agent': 'Mozilla/5.0 (Linux; x68_64; x64; rv:88.0) Gecko/20100101 Firefox/88.0',
'Content-Type': 'application/x-www-form-urlencoded',
}
kommune = self.__config['kommune']
self.__csv = f'muell-{kommune}-{self.__current_year}.csv'
# Methoden # Methoden
def __get_index_positions(self, list_of_elems, element): def __get_index_positions(self, list_of_elems, element):
@@ -73,21 +77,21 @@ class Muell:
return index_pos_list return index_pos_list
def __readConfig(self): def __readConfig(self):
''' Liest ~/.muell.yaml und speichert Daten in Dictionary ''' ''' Liest Konfigdatei und speichert Daten in Dictionary '''
home = Path.home() # home ist ohne / am Ende! home = Path.home() # home ist ohne / am Ende!
config = {} config = {}
with open(f'{home}/.muell.yaml', 'r') as config_file: with open(f'{home}/{self.__config_file}', 'r') as config_file:
config = yaml.safe_load(config_file) config = yaml.safe_load(config_file)
return config return config
def __init(self, key, modus, host, headers): def __start(self):
''' Initialisiert das System und sucht entsprechende Daten heraus ''' ''' Initialisiert das System und sucht entsprechende Daten heraus '''
url = f'https://{host}/?key={key}&modus={modus}&waction=init' url = f'{self.__url}&waction=init'
http = httplib2.Http() resp = requests.post(url, data = self.__postdata, headers = self.__headers)
(resp, content) = http.request(url, "POST", headers = headers, body = urllib.parse.urlencode(self.__postdata)) content = resp.content
result = re.findall(r"<input .*?name=.*? value=.*?/>", str(content)) result = re.findall(r"<input .*?name=.*? value=.*?/>", str(content))
@@ -104,13 +108,14 @@ class Muell:
return name, value return name, value
def __read_file(self, jahr): def __read_file(self):
''' Liest Daten aus muell<jahr>.csv und liefert ggf. Ergebnis zurück''' ''' Liest Daten aus self.__csv und liefert ggf. Ergebnis zurück'''
antwort_liste = list() antwort_liste = list()
headline = list() headline = list()
try: try:
with open(f'muell{jahr}.csv', 'r', encoding="latin1") as f: with open(self.__csv, 'r', encoding="latin1") as f:
csv_reader = csv.reader(f, delimiter=';') csv_reader = csv.reader(f, delimiter=';')
lines = 0 lines = 0
antwort_liste = [] antwort_liste = []
@@ -128,26 +133,26 @@ class Muell:
return (antwort_liste, headline) return (antwort_liste, headline)
def get_data(self): def get_data(self):
(antwort_liste, headline) = self.__read_file(self.__current_year) (antwort_liste, headline) = self.__read_file()
config = self.__readConfig()
if not antwort_liste: if not antwort_liste:
# Keine vernünftigen Daten, ergo mal gucken, was die Webseite ergibt # Keine vernünftigen Daten, ergo mal gucken, was die Webseite ergibt
self.__postdata['f_id_kommune'] = config['kommune'] self.__postdata['f_id_kommune'] = self.__config['kommune']
self.__postdata['f_id_strasse'] = config['strasse'] self.__postdata['f_id_strasse'] = self.__config['strasse']
(name, value) = self.__init(key, modus, host, headers) (name, value) = self.__start()
if name != None and value != None: if name != None and value != None:
self.__postdata[name] = value self.__postdata[name] = value
http = httplib2.Http() url = f'{self.__url}&waction=export_csv'
(resp, content) = http.request(url, "POST", headers = headers, body = urllib.parse.urlencode(self.__postdata)) resp = requests.post(url, data = self.__postdata, headers = self.__headers)
content = resp.content
antwort = str(content) antwort = str(content)
f = open(f'muell{self.__current_year}.csv', 'wb') f = open(self.__csv, 'wb')
f.write(content) f.write(content)
f.close() f.close()
(antwort_liste, headline) = self.__read_file(self.__current_year) (antwort_liste, headline) = self.__read_file()
tomorrow = (datetime.now() + timedelta(1)).strftime('%d.%m.%Y') tomorrow = (datetime.now() + timedelta(1)).strftime('%d.%m.%Y')
index = set(); index = set();
@@ -169,36 +174,36 @@ class Muell:
for pos in index: for pos in index:
tonnen.append(headline[pos]) tonnen.append(headline[pos])
return (tonnen, wird)
def ausgabe_telegram(self, tonnen, wird):
''' Ausgabe Richtung Telegram'''
if len(tonnen) > 0: if len(tonnen) > 0:
tonnen = ' und '.join(tonnen) tonnen = ' und '.join(tonnen)
ausgabe = f'Morgen {wird} {tonnen} abgeholt'
else:
ausgabe = None
return ausgabe
def ausgabe_telegram(self, ausgabe):
''' Ausgabe Richtung Telegram'''
if ausgabe is not None:
# Jetzt den Telegram Bot ansprechen # Jetzt den Telegram Bot ansprechen
try: try:
os.system(f'echo "Morgen {wird} {tonnen} abgeholt" | {config["telegram"]["pathBot"]} -u {config["telegram"]["tgReceiver"]}') os.system(f'echo "{ausgabe}" | {self.__config["telegram"]["pathBot"]} -u {self.__config["telegram"]["tgReceiver"]}')
except Exception as e: except Exception as e:
os.system(f'logger "Fehler Muellbot Telegram: {e}"') os.system(f'logger "Fehler Muellbot Telegram: {e}"')
def ausgabe_signal(self, tonnen, wird): def ausgabe_signal(self, ausgabe):
''' Ausgabe Richtung Signal''' ''' Ausgabe Richtung Signal'''
if len(tonnen) > 0: if ausgabe is not None:
tonnen = ' und '.join(tonnen)
# Signal Bot # Signal Bot
try: try:
os.system(f'{config["signal"]["path"]} -a {config["signal"]["account"]} send -g {config["signal"]["group_id"]} -m "Morgen {wird} {tonnen} abgeholt"') os.system(f'{self.__config["signal"]["path"]} -a {self.__config["signal"]["account"]} send -g {self.__config["signal"]["group_id"]} -m "{ausgabe}"')
except Exception as e: except Exception as e:
os.system(f'logger "Fehler Muellbot Signal: {e}"') os.system(f'logger "Fehler Muellbot Signal: {e}"')
def ausgabe_text(self, tonnen, wird): def ausgabe_text(self, ausgabe):
''' Ausgabe als Text''' ''' Ausgabe als Text'''
if len(tonnen) > 0: if ausgabe is not None:
tonnen = ' und '.join(tonnen) print(f'{ausgabe}')
print(f'Morgen {wird} {tonnen} abgeholt')
+24 -4
View File
@@ -1,9 +1,29 @@
#!/usr/bin/python3 #!/usr/bin/python3
import argparse
from Muell import Muell from Muell import Muell
if __name__ == '__main__': if __name__ == '__main__':
muell = Muell()
tonnen, wird = muell.get_data() parser = argparse.ArgumentParser(
muell.ausgabe_telegram(tonnen, wird) prog='muell',
muell.ausgabe_signal(tonnen, wird) description='Benachrichtigt Empfänger über anstehende Müllabfuhr'
)
parser.add_argument('-c', '--config', default='.muell.yaml', help='Name der Konfigdatei. Diese muss sich im Benutzerverzeichnis befinden!')
parser.add_argument('-t', '--telegram', action='store_true', help='Ausgabe auf Telegram')
parser.add_argument('-s', '--signal', action='store_true', help='Ausgabe auf Signal')
parser.add_argument('-k', '--konsole', action='store_true', help='Ausgabe auf Konsole')
args = parser.parse_args()
muell = Muell(args.config)
ausgabe = muell.get_data()
if args.telegram == True:
muell.ausgabe_telegram(ausgabe)
if args.signal == True:
muell.ausgabe_signal(ausgabe)
if args.konsole == True:
muell.ausgabe_text(ausgabe)