Compare commits
9
Commits
0ca838e335
...
1.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb320a8664
|
||
|
|
6c748dff66
|
||
|
|
a9404cfc68
|
||
|
|
9701df6f39 | ||
|
|
3458b4e227 | ||
|
|
a964b2b5bc
|
||
|
|
d6cc9b974f
|
||
|
|
091e801b7e
|
||
|
|
8e6549fd5e
|
+53
-48
@@ -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,19 +30,23 @@ from pathlib import Path
|
|||||||
|
|
||||||
class Muell:
|
class Muell:
|
||||||
|
|
||||||
|
def __init__(self, config_file='.muell.yaml'):
|
||||||
|
|
||||||
# Variablen
|
# Variablen
|
||||||
__key = 'e21758b9c711463552fb9c70ac7d4273'
|
self.__config_file = config_file
|
||||||
__modus = 'd6c5855a62cf32a4dadbc2831f0f295f'
|
self.__config = self.__readConfig()
|
||||||
|
self.__key = 'e21758b9c711463552fb9c70ac7d4273'
|
||||||
|
self.__modus = 'd6c5855a62cf32a4dadbc2831f0f295f'
|
||||||
|
|
||||||
__host = 'api.abfall.io'
|
self.__host = 'api.abfall.io'
|
||||||
|
|
||||||
__url = f'https://{__host}/?key={__key}&modus={__modus}&waction=export_csv'
|
self.__url = f'https://{self.__host}/?key={self.__key}&modus={self.__modus}'
|
||||||
__export_als = f"{{'action':'{__url}','target':''}}"
|
self.__export_als = f"{{'action':'{self.__url}&waction=export_csv','target':''}}"
|
||||||
|
|
||||||
__current_year = datetime.today().year
|
self.__current_year = datetime.today().year
|
||||||
__zeitraum = f'{__current_year}0101-{__current_year}1231'
|
self.__zeitraum = f'{self.__current_year}0101-{self.__current_year}1231'
|
||||||
|
|
||||||
__postdata = {
|
self.__postdata = {
|
||||||
'f_id_abfalltyp_0': '50',
|
'f_id_abfalltyp_0': '50',
|
||||||
'f_id_abfalltyp_1': '161',
|
'f_id_abfalltyp_1': '161',
|
||||||
'f_id_abfalltyp_2': '53',
|
'f_id_abfalltyp_2': '53',
|
||||||
@@ -52,14 +54,16 @@ class Muell:
|
|||||||
'f_id_abfalltyp_4': '169',
|
'f_id_abfalltyp_4': '169',
|
||||||
'f_abfallarten_index_max': '5',
|
'f_abfallarten_index_max': '5',
|
||||||
'f_abfallarten': '50,161,53,187',
|
'f_abfallarten': '50,161,53,187',
|
||||||
'f_zeitraum': __zeitraum,
|
'f_zeitraum': self.__zeitraum,
|
||||||
'f_export_als': __export_als,
|
'f_export_als': self.__export_als,
|
||||||
}
|
}
|
||||||
|
|
||||||
__headers = {
|
self.__headers = {
|
||||||
'User-Agent': 'Mozilla/5.0 (Linux; x68_64; x64; rv:88.0) Gecko/20100101 Firefox/88.0',
|
'User-Agent': 'Mozilla/5.0 (Linux; x68_64; x64; rv:88.0) Gecko/20100101 Firefox/88.0',
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
'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
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user