Hilfe & Wissen Welche Automation Funktionen gibt es?
Welche Automation Funktionen gibt es?
logging.info / logging.error
Beispiel
logging.info("landingpagename") # 2024-02-02 15:01:46 +0100: landingpagename
Definition und Benutzung
Loggt mi dem Mode etwas während der Automation aus. Bei dem Typ event der Automation muss noch zusätzlich mit dem Befehl envVariables['should_log'] = True das logging angeschaltet werden, das es Standardmässig aus ist, und nur Angeschaltet wird, wenn bestimmte Funktionen aufgerufen und ausgeführt werden, um nicht zuviel unnützes Logging zu haben.
Syntax
logging.info(object_)
ident
Beispiel
String für die Verwendung von String-Methoden vorbereiten
text = ident("Hallo Welt")
.replace verwenden
text = text.replace("Welt", "kajomi")
Ergebnis:
"Hallo kajomi"
.format verwenden
number = to_float(1000)
formatted = ident("{:,.0f}").format(number)
formatted = formatted.replace(",", ".")
Ergebnis:
"1.000"
Prozentwert formatieren
value = to_float(24.678)
formatted = ident("{:.1f}").format(value)
formatted = formatted.replace(".", ",")
formatted = formatted + " %"
Ergebnis:
"24,7 %"
Definition und Benutzung
Die Funktion ident kann verwendet werden, wenn auf einem String anschließend eine String-Methode wie .format() oder .replace() ausgeführt werden soll.
Strings sollten in Automationen vor solchen Methoden über ident(...) erzeugt beziehungsweise referenziert werden.
Beispielsweise sollte nicht direkt
formatted = "{:,.0f}".format(number)
verwendet werden, sondern:
formatted = ident("{:,.0f}").format(number)
Dadurch kann anschließend auch mit weiteren String-Operationen gearbeitet werden.
Bei mehreren Methoden sollten die Aufrufe außerdem nicht miteinander verkettet werden.
Nicht:
formatted = ident("{:,.0f}").format(number).replace(",", ".")
Sondern:
formatted = ident("{:,.0f}").format(number)
formatted = formatted.replace(",", ".")
Ein typisches Anwendungsbeispiel ist die deutsche Formatierung großer Zahlen:
def format_number(value):
number = to_float(value)
formatted = ident("{:,.0f}").format(number)
formatted = formatted.replace(",", ".")
return formatted
Damit wird beispielsweise:
1000 -> 1.000
12500 -> 12.500
1234567 -> 1.234.567
Für Prozentwerte kann dieselbe Vorgehensweise verwendet werden:
def format_percent(value):
number = to_float(value)
formatted = ident("{:.1f}").format(number)
formatted = formatted.replace(".", ",")
formatted = formatted + " %"
return formatted
Syntax
ident(value)
to_str
Beispiel
to_str(15) # "15"
Definition und Benutzung
Wandelt ein Object in ein String um. Sollte die Umwandlung nicht klappen kommt ein Leerer String zurück
Syntax
to_str(object_)
to_int
Beispiel
to_int("15") # 15
to_int(3.141) # 3
to_int(3.0) # 3
Definition und Benutzung
Wandelt ein Object in Integer um. Sollte die Umwandlung nicht klappen kommt 0 zurück.
Syntax
to_int(object_)
to_float
Beispiel
to_float("3.141") # 3.141
to_float(3) # 3.0
Definition und Benutzung
Wandelt ein Object in Float um. Sollte die Umwandlung nicht klappen kommt 0 zurück.
Syntax
to_float(object_)
to_bool
Beispiel
to_bool(True) # True
to_bool("hello") # True
to_bool("") # False
to_bool(0) # False
Definition und Benutzung
Wandelt ein Object in Boolean um. Sollte die Umwandlung nicht klappen kommt False zurück.
Syntax
to_bool(object_)
to_set
Beispiel
to_set("hello") # {'h','e','l','o'}
to_set([1,2,3]) # {1,2,3}
to_set((1,2,2,3)) # {1,2,3}
Definition und Benutzung
Wandelt ein Object in ein Set um. Sollte die Umwandlung nicht klappen kommt ein leeres Dictionary zurück.
Syntax
to_set(object_)
to_bytes
Beispiel
to_bytes("hello") # b'hello'
to_bytes("äöü") # b'\xc3\xa4\xc3\xb6\xc3\xbc'
to_bytes(123) # b'123'
to_bytes(True) # b'True'
to_bytes("hello", "ascii") # b'hello'
Definition und Benutzung
Wandelt ein Objekt in Bytes um. Das übergebene Objekt wird zuerst in einen String konvertiert und anschließend mit dem angegebenen Encoding in Bytes kodiert. Standardmäßig wird das UTF-8 Encoding verwendet.
Sollte während der Umwandlung ein Fehler auftreten, gibt die Funktion einen leeren Byte-String zurück.
Syntax
to_bytes(object_, encoding="utf-8")
to_tuple
Beispiel
to_tuple([1,2,3]) # (1,2,3)
to_tuple("abc") # ('a','b','c')
to_tuple({1,2,3}) # (1,2,3)
Definition und Benutzung
Wandelt ein Object in ein Tuple um. Sollte die Umwandlung nicht klappen kommt ein leeres Tuple zurück.
Syntax
to_tuple(object_)
json_loads
Beispiel
json_loads('{"Hallo": "Hallo"}') # {'Hallo':'Hallo'}
Definition und Benutzung
Ladt ein JSON Object von einem String
Syntax
json_loads(json_string)
json_dumps
Beispiel
json_dumps({'Hallo':'Hallo'}) # '{"Hallo": "Hallo"}'
Definition und Benutzung
Wandelt ein Object ein ein JSON String um
Syntax
json_dumps(object_)
base64_encode
Beispiel
# Text-Eingabe
result = base64_encode("GÜMA Mannheim")
# R8OcTUEgTWFubmhlaW0=
# Bytes-Eingabe (z. B. aus Datei oder Netzwerk)
data = "GÜMA Mannheim".encode("utf-8")
result = base64_encode(data)
# R8OcTUEgTWFubmhlaW0=
Definition und Benutzung
Die Funktion base64_encode kodiert Text- oder Binärdaten sicher in Base64. Sie unterstützt sowohl Strings als auch Bytes und stellt sicher, dass Binärdaten nicht versehentlich in Text umgewandelt werden, bevor die Base64-Kodierung erfolgt.
Wird ein String übergeben, so wird dieser zunächst mit dem angegebenen Encoding (Standard: UTF-8) in Bytes konvertiert. Wird ein Bytes- oder Bytearray-Objekt übergeben, so werden die Rohdaten direkt base64-kodiert. Dadurch eignet sich die Funktion sowohl für Textdaten als auch für Binärdaten wie Bilder, Zertifikate oder kryptografisches Material.
Syntax
base64_encode(value, encoding="utf-8")
Parameter
value (
str | bytes | bytearray)
Der zu kodierende Wert. Kann Text oder Binärdaten enthalten.encoding (
str | None, optional)
Encoding für String-Eingaben. WirdNoneübergeben, gibt die Funktion Base64-kodierte Bytes zurück. Standard ist"utf-8".
Rückgabewert
- str | bytes
Base64-kodierter Wert. Bei gesetztem Encoding als String, ansonsten als Bytes.
base64_decode
Beispiel
base64_decode("c3RyaW5n") # "string"
Definition und Benutzung
Dekodicert einen base64 String
Syntax
base64_decode(base64_string)
urlencode
Beispiel
urlencode({"test":"test", "hallo": "hallo 1"}) # test=test&hallo=hallo+1
Definition und Benutzung
URL encodiert den paramString
Syntax
urlencode(dict_)
parse_url_query_string
Beispiel
parse_url_query_string("https://kajomi.de?test=test&hallo=hallo+1") # {'test': ['test'], 'hallo': ['hallo 1']}
Definition und Benutzung
Parsed den Query String einer Domain
Syntax
parse_url_query_string(string_)
determine_random_guid
Beispiel
determine_random_guid(5) # "eOuYh"
Definition und Benutzung
Gibt eine zufälligen erzeugten String zurück
Syntax
determine_random_guid(length=10)
uuid4
Beispiel
uuid4() # "342d8b45-1fdd-4416-90bc-9312eb8e2af8"
Definition und Benutzung
Gibt eine zufälligen erzeugten uuid4 String zurück
Syntax
uuid4()
copy_simple_object
Beispiel
test = {'Hallo': 'Hallo'}
copy_simple_object(test) # {'Hallo': 'Hallo'}
Definition und Benutzung
Kopiert ein Object mit python copy.deepcopy
Syntax
copy_simple_object(object_)
datetime
Beispiel
datetime.datetime.now() # datetime.datetime(2024, 2, 3, 16, 4, 22, 979463)
Definition und Benutzung
Grift auf die python datetime Library zu. https://docs.python.org/3/library/datetime.html
Syntax
datetime.*
csv_reader
Beispiel
reader = csv_reader(b"test;test\nhallo;hallo") # <_csv.reader object at 0x7ff44b20ce48>
for row in reader:
row # ['test', 'test'] / ['hallo', 'hallo']
Definition und Benutzung
Liest ein Bytes String in ein csv reader object ein
Syntax
csv_reader(byte_string)
csv_writerows
Beispiel
csv_writerows([['test', 'test'], ['hallo', 'hallo']]) # b'test;test\r\nhallo;hallo\r\n'
Definition und Benutzung
Wandelt eine liste einer liste in ein byte string um
Syntax
csv_writerows(list_of_list)
is_email_disposable
Beispiel
is_email_disposable('test@dispemail.com') # True
Definition und Benutzung
Ist das eine Wegwerf E-Mail. Wenn Sie einige finden die nicht auf der Liste stehen bitte support@kajomi.de anschreiben, damit wir unsere Liste updaten können.
Syntax
is_email_disposable(email_as_string)
is_email_multi_able_used
Beispiel
is_email_multi_able_used('test+already@gmail.com', 1) # True
Definition und Benutzung
Schaut ob diese E-Mail schonmal in unserem Beispiel mit test@gmail.com im Verteiler vorkommt. Wenn ja kommt True zurück.
Syntax
is_email_multi_able_used(email_as_string, listnum)
call_url
Beispiel
call_url('https://presise.api.de', method="GET", headers={'Authorization': 'meinToken'}) # response Object wo auf response.body und response.code zugegriffen werden kann
call_url('https://presise.api.de', params={"hallo": "hallo"}) # https://presise.api.de?hallo=hallo
Definition und Benutzung
Ruft die url mit der method und den header auf. Wenn user und listnum gesetzt ist, dann können in den parametern auf die Templatesprache zugegriffen werden Bsp. %email% des Users. Wenn to_string=True gesetzt wird, wird immer daraus bei ein Query String gemacht, anderen Falls werdn die Parameter in JSON umgewandelt.
Syntax
call_url(url, method='GET', params=None, user=None, listnum=None, headers={}, to_string=True)
parse_mail
Beispiel
parsed_mail = parse_mail(mail) # {"from": {"email": "test@test.de", "firstname": "Absender", "lastname": ""}, "to": [{"email": "t@t.de", "firstname": "Nikolai", "lastname": "Kordulla"}], "subject": "Bin ein Subject", "content": "Hallo", "htcontent": ""}
Definition und Benutzung
Parsed eine E-Mail (Quelltext) in Ihre Bestandteile und gibt sie als Object zurück
Syntax
parse_mail(email_as_source_string)
verify_email
Beispiel
verify_email(mail) # schmeisst eine Exception
Definition und Benutzung
Verifiziert ob diese E-Mail wirklich von diesem Absender kommt. Wirft eine Exception wenn es nicht der Fall ist.
Syntax
verify_email(email_as_source_string)
check_signature
Beispiel
user = check_signature(request)
Definition und Benutzung
Verifiziert den kajomi Signatur String auf einem request, und gibt den user zurück. Wenn man Bsp. ein webhook als replacement für das kajomi Anmeldeformular verwenden will, sollte man immer die Signatur auch überprüfen.
Syntax
check_signature(request)
determine_link
Beispiel
if event.get('category') == 'KJMTrack' and event.get('action') == 'click':
link = determine_link(event.get('label')) # {'id': 1, 'type': 'html' , 'url': 'https://www.kajomi.de'}
Definition und Benutzung
Extrahert Bsp. aus einem event den dazugehörigen link.
Syntax
determine_link(link_id)
add_email_to_blacklist
Beispiel
how_many = add_email_to_blacklist('max@mustermann.de', 0) # 2 - in dem Fall wurden 2 E-Mails aus den Verteilern gelöscht. Da listnum=0 übergeben wurde kommt die E-Mail auf die globale Blackliste
Definition und Benutzung
Fügt die E-Mail der Blacklist hinzu. Schmeisst eine Exception wenn es keine Valide E-Mail ist.
Syntax
add_email_to_blacklist(email, listnum)
set_marker_for_mailing_id
Beispiel
users = set_marker_for_mailing_id('test', 2) # 10 - In dem Fall haben 10 user den Marker test gesetzt bekommen.
Definition und Benutzung
Fügt einen Marker für alle Users eines Mailings hinzu. Die Zeichenanzahl des Markser darf nicht länger als 10 Zeichen sein, sollte das der Fall sein wird eine Exception geworfen.
Syntax
set_marker_for_mailing_id(marker, mailing_id)
send_mailing
Beispiel
mailing_id = send_mailing(listnum=1, template_id=10) # 1 - sendet einen Newsletter mit der template_id=10 an den Verteiler 1
send_mailing('VIRT', 1, virt_template={'content': 'Test', 'subject': 'Test' }) # 1 - Hier wird das "Virtuelle Template" an die Liste 1 geschickt
preparedqueue = [{"target": "selection","type": "AND","selection": "sex == 1","description":"Shoud mark nothing"},
]
send_mailing(listnum=1, preparedqueue=preparedqueue, template_id=%10) # 1 - Hier wird das Template mit der id 10 an den Verteiler 1 aber nur an alle männlichen Mitglieder der Liste geschickt
Definition und Benutzung
Erstellt einen Newsletter und versendet ihn sofort. Wenn die template="VIRT" ist wird das template das virttemplate genommen, andernfalls wird das template mit der templateid geladen. Als Rückgabewert gibt es die mailing_id des Newsletters
Syntax
send_mailing(template_id, listnum, preparedqueue=[], linktracking=True, senderemail=None, virt_template={})
select_mailing
Beispiel
mailing = select_mailings('description == "kajomi"') # {'id': 31699, 'sendername': 'sende', 'senderemail': 'hallo@hallo.de', 'description': 'kajomi', 'subject': 'sub', 'content': 'Asd', 'htcontent': '', 'date': '2024-02-03', 'time': '17:40:34', 'list': 2, 'loadrule': '1==1', 'preparedqueue': [], 'mailType': 'prepared', 'amount': 0, 'action': 'mailing', 'datesent': '2024-02-03T16:40:34Z', 'order': 'desc', 'selectlimit': 1, 'overview': {'selections': [], 'blacklists': [], 'whitelists': [], 'mailings': [], 'followups': [], 'blackselections': [], 'hasTracking': False, 'cnf': 1, 'readonline': True, 'attachments': []}, 'status': 2, 'size': 1, 'linktracking': False, 'ignoreLinks': {'content': [], 'htcontent': []}, 'splitrun': None}
Definition und Benutzung
Selektiert Mailings und gibt eines zurück. Sollten mehrer zurückkommen gibt es eins zurück
Syntax
select_mailing(selectSql)
select_mailings
Beispiel
mailing = select_mailings('description == "kajomi"') # [{'id': 31699, 'sendername': 'sende', 'senderemail': 'hallo@hallo.de', 'description': 'kajomi', 'subject': 'sub', 'content': 'Asd', 'htcontent': '', 'date': '2024-02-03', 'time': '17:40:34', 'list': 2, 'loadrule': '1==1', 'preparedqueue': [], 'mailType': 'prepared', 'amount': 0, 'action': 'mailing', 'datesent': '2024-02-03T16:40:34Z', 'order': 'desc', 'selectlimit': 1, 'overview': {'selections': [], 'blacklists': [], 'whitelists': [], 'mailings': [], 'followups': [], 'blackselections': [], 'hasTracking': False, 'cnf': 1, 'readonline': True, 'attachments': []}, 'status': 2, 'size': 1, 'linktracking': False, 'ignoreLinks': {'content': [], 'htcontent': []}, 'splitrun': None}]
Definition und Benutzung
Selektiert ein Mailing und gibt sie zurück.
Syntax
select_mailings(selectSql)
delete_mailings_by_selection
Beispiel
delete_mailings_by_selection('description == "kajomi" && status <= 0') # 1 - hier wurde damit 1 Mailing gelöscht.
Definition und Benutzung
Selektiert mailings und löscht diese. Der Status sollte immer mit =0 abgefragt werden. Als Rückgabewert wird die Anzahl der Mailings angegeben. Ist das Mailing ein Splitrun Master kann es auch nicht gelöscht werden.
Syntax
delete_mailings_by_selection(selection)
determine_template_of_mailing
Beispiel
mailing = select_mailings('description == "kajomi"')
template = determine_template_of_mailing(mailing) # {'_copy': True, 'linktracking': True, 'htcontent': '', 'subject': 'Betreff', 'sendername': 'test@test.de', 'content': 'Hallo', 'attachments': [], 'ignoreLinks': {'content': [], 'htcontent': []}}
send_transaction_mailing(template_id='VIRT', user=user, description="Last newsletter", virt_template=template)
Definition und Benutzung
Gibt das Template eines Mailing Objects zurück, und kann dann wiederrum als Mailing versendet werden. Erst wird das Template des Mailings kopiert und dann das Linktracking rückgängig gemacht.
Syntax
determine_template_of_mailing(mailing)
send_transaction_mailing
Beispiel
send_transaction_mailing(template_id=10, user=user, description="DOI email")
Definition und Benutzung
Sendet eine Transaktionsmail mit dem templateid an den User. Sollte templateid=VIRT sein wird dann das virttemplate benutzt. Der eventuser wird in addfields['eventuser'] gekapselt. Die addfields können im Template mit folgendem Code zugegriffen werden: [[ kjm.ident(%addfields%).get("eventuser").get("firstname") ]] . Wenn addfields benutzt werden sollen, muss className gesetzt werden. Das ist die Klasse nach der die Transactions Mails zusammengezählt werden.
Syntax
send_transaction_mailing(template_id, user, linktracking=True, description="", virt_template={}, className=None, event_user=None, add_fields={}, attachments=[])
determine_bonuscode_size
Beispiel
determine_bonuscode_size('gutschein2022') # 10 - 10 Gutscheincodes sind vom type gutschein2022 noch nicht verbraucht.
Definition und Benutzung
Gibt die Anzahl der unverbrauchten gutscheincodes eines typs zurück.
Syntax
determine_bonuscode_size(bonuscode_type)
select_user
Beispiel
select_user(['email', 'sex'], 'cnf = 1') # {'email': 'max@mustermann.de', 'sex': 1}
Definition und Benutzung
Gibt einen Empfänger zurück. Sollten mehrere benutzer exisiteren gibt er den ersten zurück.
Syntax
select_user(fields, selection)
select_users
Beispiel
select_users(['email', 'sex'], 'cnf = 1') # [{'email': 'max@mustermann.de', 'sex': 1}, {'email': 'lea@mustermann.de', 'sex': 2}]
Definition und Benutzung
Gibt mehrere Empfänger zurück.
Syntax
select_user(fields, selection, limit=100)
add_user
added = add_user(2, user, response) # {'listnum': 2, 'sex': 0, 'firstname': '', 'lastname': '', 'email': 'max@mustermann.de', 'street': '', 'street_number': '', 'postcode': '', 'city': '', 'birthdate': None, 'country': '', 'area_code': '', 'phone_number': '0', 'cellphone_area_code': '', 'cellphone_number': '0', 'user1': '', 'user2': '', 'user3': '', 'user4': '', 'user5': '', 'user6': '', 'user7': '', 'user8': '', 'user9': '', 'user10': '', 'userx': '', 'cnf': '0', 'dateadd': '2024-02-03T17:16:52Z', 'ipaddr': '', 'refurl': '', 'htmail': '1', 'bounces': 0, 'modified': '2024-02-03T17:16:52Z', 'list': 2, 'id': 20434249, 'deleted': False}
Definition und Benutzung
Fügt einen Empfänger dem Verteiler listnum hinzu. Ist ein response object gegeben, dann fügt er die richtige Response für das Signup Formular hinzu. Als Rückgabewert wird der User zurückgegeben.
Syntax
add_user(listnum, userfields, response=None)
add_or_update_user
added = add_or_update_user(user) # {'listnum': 2, 'sex': 0, 'firstname': '', 'lastname': '', 'email': 'max@mustermann.de', 'street': '', 'street_number': '', 'postcode': '', 'city': '', 'birthdate': None, 'country': '', 'area_code': '', 'phone_number': '0', 'cellphone_area_code': '', 'cellphone_number': '0', 'user1': '', 'user2': '', 'user3': '', 'user4': '', 'user5': '', 'user6': '', 'user7': '', 'user8': '', 'user9': '', 'user10': '', 'userx': '', 'cnf': '0', 'dateadd': '2024-02-03T17:16:52Z', 'ipaddr': '', 'refurl': '', 'htmail': '1', 'bounces': 0, 'modified': '2024-02-03T17:16:52Z', 'list': 2, 'id': 20434249, 'deleted': False}
Definition und Benutzung
Fügt einen Empfänger dem Verteiler hinzu oder update ihn wenn er existiert. Wenn im user das Feld unique_field existiert wird nach diesem abgeglichen. Ist keines gesetzt wird standardmässig die E-Mail genommen. beachten sie das der Verteiler mit dem Key list existieren muss. Als Rückgabewert kommt der vollw User zurück.
Syntax
add_or_update_user(user)
update_user
rowcount = update_user('SET user1 = "hallo"', "listnum in (1,3) && email == '%s' && cnf == 1" % "reward@reward.de") # 2
Definition und Benutzung
Updated auch mehrere User mit einer SET Selektion und einer QUERY Selektion.
Syntax
update_user(update, selection)
update_user_fields
user = update_user_fields({'user1': 'update'}, "listnum in (1,3) && email == '%s' && cnf == 1" % "reward@reward.de") # {'listnum': 2, 'sex': 0, 'firstname': '', 'lastname': '', 'email': 'max@mustermann.de', 'street': '', 'street_number': '', 'postcode': '', 'city': '', 'birthdate': None, 'country': '', 'area_code': '', 'phone_number': '0', 'cellphone_area_code': '', 'cellphone_number': '0', 'user1': 'update', 'user2': '', 'user3': '', 'user4': '', 'user5': '', 'user6': '', 'user7': '', 'user8': '', 'user9': '', 'user10': '', 'userx': '', 'cnf': '0', 'dateadd': '2024-02-03T17:16:52Z', 'ipaddr': '', 'refurl': '', 'htmail': '1', 'bounces': 0, 'modified': '2024-02-03T17:16:52Z', 'list': 2, 'id': 20434249, 'deleted': False}
Definition und Benutzung
Updated den ersten User der auf diese Selektion passt.
Syntax
update_user_fields(userfields, selection)
delete_users
row_count = delete_users("listnum in (1,3) && email == '%s' && cnf == 1" % "reward@reward.de") # 2
Definition und Benutzung
Löscht alle User die auf die Selektion passen. Als welche ip die Löschung ausgelöst hat, wird die ip genommen die übernommen wird. Der Grund ist Deleted by selection
Syntax
delete_users(selection, ip='127.0.0.1')
delete_templist_by_id
delete_templist_by_id('abcdef')
Definition und Benutzung
Löscht eine Templist by id
Syntax
delete_templist_by_id(templist_id)
delete_templists_by_selection
count_templist_deleted = delete_templists_by_selection(selection='description ~ "\{\{ whitelist \}\}%" && created <= DATE_ADD(NOW(), -10day)') # 2
Definition und Benutzung
Löscht alle templists die zu dieser Selektion passen.
Syntax
delete_templists_by_selection(selection)
select_templists
templists = select_templists(selection='description ~ "\{\{ whitelist \}\}%" && created <= DATE_ADD(NOW(), -10day)')
Definition und Benutzung
Selektiert die templists in der selektion und gibt sie als liste zurück
Syntax
select_templists(selection, limit=1000)
create_templist
whitelist = 'max@mustermann.de\nlea@mustermann.de'
create_whitelist = create_templist('whitelist', 'automatisch erstellt nach import:', 'test.csv', whitelist)
Definition und Benutzung
Erstellt eine templist und gibt diese zurück.
Syntax
create_templist(type_, description, filename, file_body):
create_import
data = 'max@mustermann.de\nlea@mustermann.de'
create_import(1, data, filename='create_import-automation.csv')
Definition und Benutzung
Uploaded den Import. Der Status ist dann uploaded, um den Import zu starten dann update_import benutzen.
Syntax
create_import(listnum, data, filename='creat_import-automation.csv')
update_import
download_csv = call_url('https://meine.csv')
user_import = create_import(1, download_csv.get('body'), 'meine.csv')
mapping = ['email', 'sex']
user_import = update_import(1, user_import.get('id'), mapping, 'sync', 'start')
Definition und Benutzung
Updated den hochgeladenen import, und starte ihn oder bricht ihn ab.
Syntax
update_import(listnum, import_id, mapping, mode='insert_update', action='start'):
replace_html_tag
replace_html_tag("<hr/>", "hr", "<br/>") # <br/>
replace_html_tag("<p>Hallo</p>", "p", "<br/><br/><children/>") # <br/></br>Hallo
replace_html_tag("<strong>Test</strong>", "strong", "<table><tr><td data-content='children'></td></tr></table>") # <table><tr><td>Test</td></tr></table>
Definition und Benutzung
Ersetz ein html tag durch ein anderes. Kann auch wie im zweiten Beispiel Inhalt mit übernehmen. Muss nicht valides html sein durch das es ersetzt wird man kann also auch Bsp. erst <ul> durch <table data-content='children'></table> ersetzen und dann die <li> durch <tr><td data-content='children'></td></tr> ersetzen. Will man ein Tag auspacken wie bei <p>Test</p> zu <br/>Test kann das mittels `
Syntax
replace_html_tag(html_string, tagAsString, replacement):
creole2html
creole2html("** creole **") # <strong>creole</strong>
Definition und Benutzung
Konvertiert die Wiki-Syntax Creole in das HTML-Format.
Syntax
creole2html(creole_text)
mobilede2creole
creole2html(mobilede2creole()"* test\\")) # <ul><li>test</li></ul>
Definition und Benutzung
Die Funktion wandelt das Creole-Format von mobile.de in ein reguläres Creole-Format um, das dann beispielsweise in HTML konvertiert werden kann.
Syntax
creole2html(creole_text)
iso8601todatetime
iso8601_to_datetime('2024-06-27T14:10:00Z') # 2024-06-27 16:10:00+02:00
Definition und Benutzung
Wandelt ein ISO8601 in ein datetime object um
Syntax
iso8601_to_datetime(ISO_8601_as_string)
determine_rss_feed_as_json
resp = call_url('https://www.kajomi.de/blog/feed')
feed = determine_rss_feed_as_json(resp, ['rss', 'channel', 'item'], 3) # [OrderedDict([('title', OrderedDict([('$', 'Jetzt auch Microsoft! Authentifizierungsänderung und neue Regeln beim E-Mail-Versand')])), ('link', OrderedDict([('$', 'https://www.kajomi.de/microsoft-mit-neuer-email-authentifizierung/')])), ('comments', OrderedDict([('$', 'https://www.kajomi.de/microsoft-mit-neuer-email-authentifizierung/#respond')])), ('{http://purl.org/dc/elements/1.1/}creator', OrderedDict([('$', 'Sebastian Schmitt')])), ('pubDate', OrderedDict([('$', 'Fri, 07 Jun 2024 08:03:17 +0000')])), ('category', OrderedDict([('$', 'Allgemein')])), ('guid', OrderedDict([('@isPermaLink', False), ('$', 'https://www.kajomi.de/?p=2002')])), ('description', OrderedDict([('$', '<p><img width=\"1920\" height=\"1275\" src=\"https://www.kajomi.de/wp-content/uploads/matthew-manuel-BhLSBX-0rnM-unsplash.jpg\" class=\"attachment-full size-full wp-post-image\" alt=\"Microsoft zieht bei der E-Mail-Authentifizierung nach\" style=\"max-width: 100%; height: auto; margin-bottom: 10px;\" decoding=\"async\" fetchpriority=\"high\" srcset=\"https://www.kajomi.de/wp-content/uploads/matthew-manuel-BhLSBX-0rnM-unsplash.jpg 1920w, https://www.kajomi.de/wp-content/uploads/matthew-manuel-BhLSBX-0rnM-unsplash-300x199.jpg 300w, https://www.kajomi.de/wp-content/uploads/matthew-manuel-BhLSBX-0rnM-unsplash-1024x680.jpg 1024w, https://www.kajomi.de/wp-content/uploads/matthew-manuel-BhLSBX-0rnM-unsplash-768x510.jpg 768w, https://www.kajomi.de/wp-content/uploads/matthew-manuel-BhLSBX-0rnM-unsplash-1536x1020.jpg 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" /></p>2024 ist das Jahr der E-Mail-Authentifizierung. Zu Beginn des Jahres haben Gmail und Yahoo neue Richtlinien für den E-Mail-Versand eingeführt. Nun folgt Microsoft diesem Beispiel und hat seine eigenen Regelungen …')])), ('{http://purl.org/rss/1.0/modules/content/}encoded', OrderedDict([('$', '<p> ... html content')])
Definition und Benutzung
Wandelt ein RSS Feed in ein JSON Object um.
Syntax
determine_rss_feed_as_json(response, path_to_items, limit)
pub_date_to_datetime
pub_date_to_datetime('Thu, 20 Oct 2022 04:00:00 GMT', 'Europe/Berlin') # 2022-10-20 06:00:00+02:00
Definition und Benutzung
Convertiert ein Pubdate eines RSS Feed zu datetime
Syntax
pub_date_to_datetime(pubdate_as_string, timezone_optional)
upper
upper("Pö") # PÖ
Definition und Benutzung
Gibt den selben String in Großbuchstaben zurück
Syntax
upper(string)
lower
lower("Pö") # pö
Definition und Benutzung
Gibt den selben String in Kleinbuchstaben zurück
Syntax
lower(string)
html_to_json
html_to_json("<html><body><div></div></body></html>") # OrderedDict([('html', OrderedDict([('body', OrderedDict([('div', OrderedDict([('@id', 'test')]))]))]))])
Definition und Benutzung
Wandelt eine HTML Page in JSON um
Syntax
html_to_json(html)
jsonpath_find
html_to_json("<html><body><div></div></body></html>")
jsonpath_find(json_data, "$..div") # [DatumInContext(value=OrderedDict([('@id', 'test')]), path=Fields('div'), context=DatumInContext(value=OrderedDict([('div', OrderedDict([('@id', 'test')]))]), path=Fields('body'), context=DatumInContext(value=OrderedDict([('body', OrderedDict([('div', OrderedDict([('@id', 'test')]))]))]), path=Fields('html'), context=DatumInContext(value=OrderedDict([('html', OrderedDict([('body', OrderedDict([('div', OrderedDict([('@id', 'test')]))]))]))]), path=Root(), context=None))))]
Definition und Benutzung
Query Languaege for json to select specific nodes. For more help google jsonpath
Syntax
jsonpath_find(json_data, expression)
join
Beispiel
join(['Bob', 'Alice', 'Max'], ", ") # Bob, Alice, Max
join(['Bob', 'Alice', 'Max'], ", ", " & ") # Bob, Alice & Max
Definition und Benutzung
Wandelt eine Liste von Strings mit einem Seperator und einem optionalen Letzen Seperator in ein String um.
Syntax
join(list_, seperator, last_seperator)
determine_holiday
Beispiel
result = determine_holiday(date(2024, 3, 29), country='DE') # {"date": "2024-03-29", "name": "Karfreitag"}
result = determine_holiday(date(2024, 4, 2), country='DE') # None
Definition und Benutzung
Die Funktion determine_holiday prüft, ob ein bestimmtes Datum ein Feiertag in einem angegebenen Land ist. Sie verwendet die holidays-Bibliothek, um Feiertagsdaten dynamisch zu generieren. Ohne ein angegebenes Datum wird das aktuelle Datum verwendet. Wenn kein Bundesland/State (state) angegeben ist, werden nur Bundesweite Feiertage genommen. Ist kein Feiertag vorhanden, wird None zurückgegeben.
Syntax
get_holiday(check_date=None, country='DE', state=None)
determine_workday
Beispiel
result = determine_workday(date(2024, 4, 1), country='DE') # False
result = determine_workday(date(2024, 4, 2), country='DE') # True
Definition und Benutzung
Die Funktion determine_workday prüft, ob ein bestimmtes Datum ein Arbeitstag in einem angegebenen Land ist. Sie verwendet die holidays-Bibliothek, um Feiertagsdaten dynamisch zu generieren. Ohne ein angegebenes Datum wird das aktuelle Datum verwendet. Wenn kein Bundesland/State (state) angegeben ist, werden nur Bundesweite Feiertage zur Berechung des Arbeitstages genommen.
Syntax
determine_workday(check_date=None, country='DE', state=None)
wrap_text
Beispiel
text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = wrap_text(text, 5)
# ABCDE
# FGHIJ
# KLMNO
# PQRST
# UVWXY
# Z
result = wrap_text(text, 5, continuation_prefix=" ")
# ABCDE
# FGHIJ
# KLMNO
# PQRST
# UVWXY
# Z
Definition und Benutzung
Die Funktion wrap_text teilt einen beliebigen Text in mehrere Zeilen mit einer maximalen Zeichenlänge. Sie eignet sich für allgemeine Textverarbeitung sowie für Formate mit festen Zeilenlängen, z. B. vCard, E-Mail-Header oder andere RFC-konforme Formate.
Optional kann ein Präfix für alle Folgezeilen definiert werden. Dies ist insbesondere für Formate relevant, bei denen Zeilenumbrüche durch ein führendes Leerzeichen oder ein spezielles Zeichen gekennzeichnet werden müssen.
Ist der übergebene Text leer oder None, gibt die Funktion einen leeren String zurück.
Syntax
wrap_text(text, line_length, continuation_prefix="")
encode_string
Beispiel
# String-Eingabe
result = encode_string("GÜMA Mannheim")
# b'G\xc3\x9cMA Mannheim'
# Nicht-String-Eingabe
result = encode_string(12345)
# b'12345'
Definition und Benutzung
Die Funktion encode_string konvertiert einen übergebenen Wert in einen String und kodiert diesen anschließend mit dem angegebenen Zeichensatz (Standard: UTF-8) in Bytes.
Unabhängig vom ursprünglichen Datentyp wird der Eingabewert zunächst mittels str() in eine String-Repräsentation umgewandelt. Anschließend erfolgt die Byte-Kodierung. Die Funktion eignet sich insbesondere für Fälle, in denen sichergestellt werden soll, dass Daten in konsistenter Byte-Form weiterverarbeitet oder gespeichert werden.
Syntax
encode_string(string_, encoding="utf-8")
Parameter
string_ (
any)
Der zu kodierende Wert. Wird intern immer in einen String umgewandelt.encoding (
str, optional)
Zeichensatz für die Kodierung des Strings in Bytes. Standard ist"utf-8".
Rückgabewert
- bytes
Der kodierte Byte-String des übergebenen Wertes.
re_compile
Beispiel
# Einfaches Pattern kompilieren
pattern = re_compile(r"^[A-Z]{2}\d{4}$")
result = to_bool(pattern.match("AB1234")) # True
result = to_bool(pattern.match("ab1234")) # False
# Mit Flags (z. B. case-insensitive)
pattern = re_compile(r"^hello$", flags=re.IGNORECASE)
result = to_bool(re_pattern_match("HeLLo")) # True
# Mit Flags (multiline matching)
pattern = re_compile(r"^world$", flags=re.MULTILINE)
result = to_bool(re_pattern_search("hello\nworld")) # True
# Mit Flags (dot matches newline)
pattern = re_compile(r"a.*b", flags=re.DOTALL)
result = to_bool(re_pattern_search("a\n\nb")) # True
# Mit Flags (verbose regex)
pattern = re_compile(r"""
\d{4} # year
-
\d{2} # month
-
\d{2} # day
""", flags=re.VERBOSE)
result = to_bool(pattern.match("2024-04-01")) # True
Definition und Benutzung
Die Funktion re_compile ist ein direkter Ersatz für re.compile und dient zum Kompilieren eines regulären Ausdrucks in ein Pattern-Objekt. Das zurückgegebene Pattern-Objekt kann anschließend für Operationen wie match, search, findall, sub oder split verwendet werden.
Die Funktion verhält sich wie re.compile: Sie nimmt ein Pattern (String oder bereits kompiliertes Pattern) entgegen und unterstützt optionale Flags zur Steuerung des Regex-Verhaltens (z. B. IGNORECASE, MULTILINE, DOTALL).
Syntax
re_compile(pattern, flags=0)
Parameter
pattern (
str | Pattern)
Der reguläre Ausdruck als String oder ein bereits kompiliertes Pattern.flags (
int, optional)
Flags zur Steuerung des Regex-Verhaltens. Standard ist0.
Rückgabewert
- Pattern
Ein kompiliertes Regex-Pattern-Objekt, das wie das Ergebnis vonre.compileverwendet werden kann.
find_nodes_with_attribute
Beispiel
# Suche nach allen Nodes mit class="button"
# {"html": {"body": "p": {"@class": "button", "$": "Submit"} }}
nodes = find_nodes_with_attribute(data, "@class", "button") # KjmJsonpath([{"value": {"@class": "button", "$": "Submit"}, "path": "$.html.body.p", "full_path":"$.html.body.p", "__type": "kjm_jsonpath"}]) - KjmJsonpath extends dict and can be used as data parameter for the nextsearch to
# Case-insensitive Suche mit String
nodes = find_nodes_with_attribute(data, "@class", "Button", case_insensitive=True)
# Suche mit Regex
pattern = re_compile(r"^btn-.*")
nodes = find_nodes_with_attribute(data, "@class", pattern)
Definition und Benutzung
Die Funktion findnodeswith_attribute durchsucht rekursiv eine JSON- oder DOM-ähnliche Datenstruktur (dict / list) nach Knoten, die ein bestimmtes Attribut mit einem passenden Wert besitzen. Sie eignet sich besonders für HTML- oder DOM-Strukturen, die als JSON repräsentiert sind, wobei Attribute typischerweise mit einem @-Präfix gespeichert werden (z. B. @class, @id, @data-testid).
Der Attributwert kann entweder als exakter String oder als regulärer Ausdruck angegeben werden. Bei Stringwerten kann optional eine case-insensitive Suche aktiviert werden.
Alle passenden Dictionary-Knoten werden gesammelt und als Liste zurückgegeben. Der einzelne Knoten ist vom Type KjmJsonpath mit den parameter value (der Knoten), path und full_path.
Syntax
find_nodes_with_attribute(
node,
attr_name,
attr_value,
case_insensitive=False,
)
re_pattern_search
Beispiel
pattern = re_compile(r"hello")
result = re_pattern_search(pattern, "hello world") # <re.Match object>
pattern = re_compile(r"world")
result = re_pattern_search(pattern, "hello world") # <re.Match object>
group(result, 0) # world
pattern = re_compile(r"test")
result = re_pattern_search(pattern, "hello world") # None
# Suche ab einer bestimmten Position
pattern = re_compile(r"world")
result = re_pattern_search(pattern, "hello world world", pos=8) # Match bei zweitem "world"
Definition und Benutzung
Die Funktion repatternsearch führt eine Regex-Suche mit einem bereits kompilierten Pattern auf einem String aus. Intern wird dafür die Methode pattern.search() verwendet.
Die Funktion erwartet ein zuvor mit re_compile (oder re.compile) erzeugtes Pattern sowie einen String, in dem gesucht werden soll. Wird ein Treffer gefunden, gibt die Funktion ein Match-Objekt zurück. Wird kein Treffer gefunden, wird None zurückgegeben.
Diese Funktion eignet sich besonders dann, wenn reguläre Ausdrücke bereits vorab kompiliert wurden und mehrfach auf unterschiedliche Strings angewendet werden sollen.
Syntax
re_pattern_search(pattern, string_, pos=0, endpos=None)
re_search
Beispiel
# Einfache Regex-Suche
result = re_search(r"world", "hello world") # <re.Match object>
# Mit Flags (case-insensitive)
result = re_search(r"hello", "HELLO WORLD", flags=re.IGNORECASE) # <re.Match object>
# Kein Treffer
result = re_search(r"test", "hello world") # None
Definition und Benutzung
Die Funktion re_search führt eine Regex-Suche auf einem String aus und ist ein direkter Wrapper um re.search() aus dem Python-Standardmodul re.
Das Pattern wird als String übergeben und während der Suche intern kompiliert. Wird ein Treffer gefunden, gibt die Funktion ein Match-Objekt zurück. Wird kein Treffer gefunden, wird None zurückgegeben.
Optional können Regex-Flags angegeben werden, um das Verhalten der Suche zu beeinflussen, z. B. re.IGNORECASE, re.MULTILINE oder re.DOTALL.
Syntax
re_search(pattern, string, flags=0)
group
Beispiel
# Beispiel mit re_search
match = re_search(r"world", "hello world")
result = group(match, 0) # 'world'
# Beispiel mit Gruppen im Regex
match = re_search(r"(hello) (world)", "hello world")
first = group(match, 1) # 'hello'
second = group(match, 2) # 'world'
Definition und Benutzung
Die Funktion group ist ein Wrapper um die Methode Match.group() aus dem Python Regex-Modul re.
Sie wird verwendet, um Teile eines Regex-Treffers aus einem Match-Objekt zu extrahieren.
Das übergebene Objekt muss ein Match-Objekt sein, das z. B. durch re_search() oder re_pattern_search() erzeugt wurde.
Mit dem Parameter 0 wird der komplette Match zurückgegeben. Mit höheren Indizes können einzelne Gruppen des Regex-Ausdrucks abgefragt werden.
Syntax
group(match_object, *args, **kwargs)
findnodewith_attribute
Beispiel
# Suche nach einem Node mit class="button"
# data = {"html": {"body": "p": {"@class": "button", "$": "Submit"} }}
node = find_node_with_attribute(data, "@class", "button") # KjmJsonpath({"value": {"@class": "button", "$": "Submit"}, "path": "$.html.body.p", "full_path":"$.html.body.p", "__type": "kjm_jsonpath"}) - KjmJsonpath extends dict and can be used as data parameter for the nextsearch to
# Case-insensitive Suche
node = find_node_with_attribute(data, "@class", "Button", case_insensitive=True)
# Suche mit Regex
pattern = re_compile(r"^btn-.*")
node = find_node_with_attribute(data, "@class", pattern)
Definition und Benutzung
Die Funktion findnodewith_attribute durchsucht eine JSON- oder DOM-ähnliche Datenstruktur nach einem Node,
der ein bestimmtes Attribut mit einem passenden Wert besitzt.
Intern verwendet die Funktion find_nodes_with_attribute, um alle passenden Nodes zu ermitteln. Falls Treffer
gefunden werden, wird der erste gefundene Node zurückgegeben. Wenn kein passender Node existiert, gibt die
Funktion None zurück.
Diese Funktion ist nützlich, wenn nur ein einzelnes Ergebnis benötigt wird und nicht alle Treffer der Struktur. Der einzelne Knoten ist vom Type KjmJsonpath mit den parameter value (der Knoten), path und full_path.
Syntax
find_node_with_attribute(node, attr_name, attr_value, case_insensitive=False)
prometheus_query
Beispiel
PromQL-Abfrage ausführen
result = prometheus_query(
'count(count by (email) (users{cnf="1"}))',
time=0
)
Ergebnis in einer Variable speichern
uniquenewsletterusers = result
Beispiel mit einer anderen PromQL-Abfrage
result = prometheus_query(
'sum(users{cnf="1"})',
time=0
)
Definition und Benutzung
Die Funktion prometheus_query führt eine PromQL-Abfrage gegen die konfigurierte Prometheus-Datenquelle aus.
Der Parameter query enthält die auszuführende PromQL-Abfrage.
Über den optionalen Parameter time kann der Zeitpunkt der Abfrage angegeben werden. Wird time=0 verwendet, kann die Abfrage mit dem dafür vorgesehenen Standard-Zeitpunkt der Prometheus-Integration ausgeführt werden.
Die Funktion ist nützlich, um Metriken aus Prometheus innerhalb einer Automation abzufragen und das zurückgegebene Ergebnis anschließend in weiteren Schritten zu verwenden.
Syntax
prometheus_query(query, time=0)
datetime_strftime
Beispiel
Aktuelles Datum als String im Format YYYY-MM-DD
now = datetime.datetime.now()
datestring = datetimestrftime(now, "%Y-%m-%d")
Beispiel:
"2026-10-01"
Ersten Tag des aktuellen Monats bestimmen
firstthismonth = datetime.datetime.now().replace(
day=1,
hour=0,
minute=0,
second=0,
microsecond=0
)
Letzten Tag des vorherigen Monats bestimmen
lastmonthdate = firstthismonth - datetime.timedelta(days=1)
Ersten Tag des vorherigen Monats bestimmen
firstlastmonth = lastmonthdate.replace(day=1)
Als Strings formatieren
startdate = datetimestrftime(firstlastmonth, "%Y-%m-%d")
enddate = datetimestrftime(firstthismonth, "%Y-%m-%d")
Beispiel am 01.10.2026:
start_date = "2026-09-01"
end_date = "2026-10-01"
Damit kann z.B. ein kompletter Monat abgegrenzt werden:
date >= startdate and date < enddate
Definition und Benutzung
Die Funktion datetime_strftime wandelt ein datetime-Objekt in einen String mit einem frei definierbaren Datums- und Zeitformat um.
Der erste Parameter date_ muss ein gültiges datetime-Objekt sein.
Der zweite Parameter string_ definiert das gewünschte Ausgabeformat. Dabei werden die normalen Python-strftime-Formatzeichen verwendet.
Häufig verwendete Formatzeichen sind:
%Y = Jahr vierstellig, z.B. 2026
%m = Monat zweistellig, z.B. 09
%d = Tag zweistellig, z.B. 01
%H = Stunde, 00-23
%M = Minute
%S = Sekunde
Die Funktion ist besonders nützlich, wenn Datumswerte für Vergleiche, API-Parameter oder Filter in ein definiertes String-Format gebracht werden sollen.
Syntax
datetime_strftime(date_, string_)
datetime_strptime
Beispiel
Datums-String in ein datetime-Objekt umwandeln
date = datetime_strptime(
"2026-09-01",
"%Y-%m-%d"
)
Ergebnis:
datetime.datetime(2026, 9, 1, 0, 0)
Datum mit Uhrzeit einlesen
date = datetime_strptime(
"2026-09-01 14:30:00",
"%Y-%m-%d %H:%M:%S"
)
Definition und Benutzung
Die Funktion datetime_strptime wandelt einen Datums- oder Zeit-String anhand eines angegebenen Formats in ein Python-datetime-Objekt um.
Der erste Parameter date_ enthält den zu konvertierenden String.
Der zweite Parameter dateformat_ beschreibt das Format, in dem der String vorliegt.
Das Format muss zum übergebenen Datums-String passen. Beispielsweise wird ein Datum wie "2026-09-01" mit dem Format "%Y-%m-%d" eingelesen.
Die Funktion ist nützlich, wenn ein Datum zunächst als String vorliegt, anschließend aber Datumsberechnungen, Vergleiche oder andere datetime-Operationen durchgeführt werden sollen.
Syntax
datetime_strptime(date_, dateformat_)
datetime_isoformat
Beispiel
datetime als ISO-8601-String ausgeben
date = datetime.datetime(
2026,
9,
1,
14,
30,
0
)
date_string = datetime_isoformat(date)
Ergebnis:
"2026-09-01T14:30:00"
Aktuelle Zeit als ISO-String
now = datetime.datetime.now()
iso_date = datetime_isoformat(now)
Definition und Benutzung
Die Funktion datetime_isoformat wandelt ein datetime-Objekt in seine ISO-8601-String-Darstellung um.
Der Parameter date_ muss ein gültiges datetime-Objekt sein.
Das zurückgegebene Format enthält normalerweise Datum und Uhrzeit, zum Beispiel:
2026-09-01T14:30:00
Sind Mikrosekunden oder Zeitzoneninformationen im datetime-Objekt vorhanden, können diese ebenfalls Bestandteil des zurückgegebenen Strings sein.
Die Funktion ist besonders nützlich für APIs, Datenexporte oder Systeme, die Datums- und Zeitwerte im standardisierten ISO-8601-Format erwarten.
Syntax
datetime_isoformat(date_)
determine_moderators
Beispiel
moderators = determine_moderators()
# Beispiel-Rückgabewert:
# {
# "data": [
# {
# "is_active": 1,
# "id": 13,
# "username": "adminbig",
# "level": 90,
# "firstname": "Test",
# "lastname": "Testermann",
# "created": "2017-08-07T22:00:01Z",
# "twofa": {
# "since": None
# },
# "email": {
# "active": True,
# "email": "max@mustermann.de"
# }
# },
# {
# "username": "test::normal",
# "is_global": True,
# "firstname": "",
# "lastname": "",
# "level": 90,
# "clients": [
# "client_1",
# "client_1"
# ],
# "is_active": True,
# "email": {
# "email": "test@test.de",
# "active": False
# },
# "twofa": {
# "since": 1790916627
# },
# "id": -2,
# "created": "2026-10-02T02:50:27Z"
# }
# ]
# }
Auf einzelne Werte des Rückgabewerts kann anschließend zum Beispiel so zugegriffen werden:
moderators = determine_moderators()
users = moderators.get("data")
first_user = users[0]
username = first_user.get("username")
level = first_user.get("level")
email_data = first_user.get("email")
email = email_data.get("email")
email_active = email_data.get("active")
twofa_data = first_user.get("twofa")
twofa_since = twofa_data.get("since")
Definition und Benutzung
Die Funktion determine_moderators ermittelt die verfügbaren Moderatoren und gibt die zugehörigen Benutzerinformationen zurück.
Der Rückgabewert enthält unter data eine Liste von Benutzerobjekten.
Ein Benutzerobjekt kann unter anderem folgende Informationen enthalten:
id = Benutzer-ID
username = Benutzername
firstname = Vorname
lastname = Nachname
level = Benutzerlevel
is_active = Aktivstatus des Benutzers
is_global = Kennzeichnung eines globalen Benutzers
clients = Zugeordnete Clients
created = Erstellungszeitpunkt
email = Informationen zur E-Mail-Adresse
twofa = Informationen zur Zwei-Faktor-Authentifizierung
Das Feld email ist selbst eine Struktur:
email_data = user.get("email")
email = email_data.get("email")
email_active = email_data.get("active")
Das Feld twofa ist ebenfalls eine eigene Struktur:
twofa_data = user.get("twofa")
twofa_since = twofa_data.get("since")
Bei verschachtelten Strukturen sollten die einzelnen Ebenen schrittweise ausgelesen werden.
Nicht:
email = user.get("email").get("email")
Sondern:
email_data = user.get("email")
email = email_data.get("email")
Globale Benutzer können zusätzlich Felder wie is_global und clients enthalten.
Syntax
determine_moderators()
determine_timestamp
Beispiel
date = datetime.datetime(2026, 10, 2, 12, 30, 0)
timestamp = determine_timestamp(date)
# Beispiel-Rückgabewert:
# 1790944200.0
Wenn kein datetime-Objekt übergeben wird:
timestamp = determine_timestamp("2026-10-02")
# Rückgabewert:
# -1
Definition und Benutzung
Die Funktion determine_timestamp wandelt ein Python-datetime-Objekt in einen Unix-Timestamp um.
Der Parameter timestamp muss ein Objekt vom Typ datetime.datetime sein.
Ist der übergebene Wert kein datetime-Objekt, gibt die Funktion
-1
zurück.
Ist der Wert ein gültiges datetime-Objekt, wird intern die Methode
timestamp.timestamp()
verwendet.
Der Rückgabewert ist dadurch ein Unix-Timestamp als Zahl.
Beispiel:
date = datetime.datetime(2026, 10, 2, 12, 30, 0)
timestamp = determine_timestamp(date)
# timestamp enthält den Unix-Timestamp des Datums
Die Funktion ist besonders nützlich, wenn ein vorhandenes datetime-Objekt für APIs, Zeitvergleiche oder andere Funktionen als Unix-Timestamp benötigt wird.
Wichtig ist, dass bereits ein datetime-Objekt übergeben wird.
Zum Beispiel:
date = datetime_strptime(
"2026-10-02 12:30:00",
"%Y-%m-%d %H:%M:%S"
)
timestamp = determine_timestamp(date)
Nicht gültig ist dagegen die direkte Übergabe eines Strings:
timestamp = determine_timestamp("2026-10-02")
# Rückgabewert:
# -1
Syntax
determine_timestamp(timestamp)
dicttoxml
Beispiel
data = {
"response": {
"@status": "success",
"message": {
"$": "ok"
},
"count": {
"$": "2"
}
}
}
xml_string = dict_to_xml(data)
# Beispiel-Rückgabewert:
# '<response status="success"><message>ok</message><count>2</count></response>'
Ein typischer Anwendungsfall ist die Rückwandlung einer zuvor mit xmljson.badgerfish.data(...) erzeugten Struktur.
Ausgehend von XML:
response_xml = """
<response status="success">
<message>ok</message>
<count>2</count>
</response>
"""
xml = lxmlhtml.fromstring(response_xml)
data = xmljson.badgerfish.data(xml)
# data entspricht beispielsweise:
# {
# "response": {
# "@status": "success",
# "message": {
# "$": "ok"
# },
# "count": {
# "$": "2"
# }
# }
# }
kann die Struktur anschließend wieder in XML umgewandelt werden:
xml_string = dict_to_xml(data)
# Beispiel-Rückgabewert:
# '<response status="success"><message>ok</message><count>2</count></response>'
Definition und Benutzung
Die Funktion dict_to_xml wandelt eine Dictionary-Struktur wieder in XML um.
Sie ist insbesondere für Daten geeignet, die zuvor mit xmljson.badgerfish.data(...) aus einem XML-Dokument erzeugt wurden.
Beispielsweise kann XML zunächst so in eine Dictionary-Struktur umgewandelt werden:
xml = lxmlhtml.fromstring(response_xml)
data = xmljson.badgerfish.data(xml)
Das BadgerFish-Format bildet XML-Elemente, XML-Attribute und Textinhalte als Dictionary ab.
Ein XML-Attribut wie:
<response status="success">
wird beispielsweise als:
{
"response": {
"@status": "success"
}
}
dargestellt.
Attribute werden dabei mit einem vorangestellten @ gekennzeichnet.
Ein einfacher XML-Textwert wie:
<message>ok</message>
wird dagegen als:
{
"message": {
"$": "ok"
}
}
dargestellt.
Textinhalte werden also über den Schlüssel $ gespeichert.
Ein etwas vollständigeres Beispiel:
data = {
"user": {
"@id": "123",
"@active": "true",
"name": {
"$": "Max Mustermann"
},
"email": {
"$": "max@mustermann.de"
}
}
}
xml_string = dict_to_xml(data)
# Beispiel-Rückgabewert:
# '<user id="123" active="true"><name>Max Mustermann</name><email>max@mustermann.de</email></user>'
Die Funktion ist besonders nützlich, wenn XML-Daten zunächst mit xmljson.badgerfish.data(...) in eine Dictionary-Struktur umgewandelt und bearbeitet werden und anschließend wieder als XML benötigt werden.
Syntax
dict_to_xml(data)
datetimetoisoformat
Beispiel
date = datetime.datetime(
2026,
10,
2,
12,
30,
0
)
iso_date = datetime_to_isoformat(date)
# Beispiel-Rückgabewert:
# "2026-10-02T12:30:00"
Mit Zeitzoneninformation kann der Rückgabewert beispielsweise so aussehen:
date = datetime.datetime(
2026,
10,
2,
12,
30,
0,
tzinfo=datetime.timezone.utc
)
iso_date = datetime_to_isoformat(date)
# Beispiel-Rückgabewert:
# "2026-10-02T12:30:00+00:00"
Definition und Benutzung
Die Funktion datetime_to_isoformat wandelt ein datetime-Objekt in einen ISO-formatierten String um.
Intern wird dafür die Methode
datetime.isoformat()
verwendet.
Ein datetime-Objekt wie:
date = datetime.datetime(
2026,
10,
2,
12,
30,
0
)
wird beispielsweise in folgenden String umgewandelt:
"2026-10-02T12:30:00"
Enthält das datetime-Objekt eine Zeitzoneninformation, wird diese ebenfalls im ISO-String ausgegeben.
Beispiel:
date = datetime.datetime(
2026,
10,
2,
12,
30,
0,
tzinfo=datetime.timezone.utc
)
iso_date = datetime_to_isoformat(date)
# Beispiel-Rückgabewert:
# "2026-10-02T12:30:00+00:00"
Die Funktion ist besonders nützlich, wenn Datums- und Zeitwerte für APIs, Datenexporte oder andere Systeme in einem standardisierten ISO-Format benötigt werden.
Syntax
datetime_to_isoformat(datetime)
datetimeutcnow
Beispiel
now = datetime_utc_now()
# Beispiel-Rückgabewert:
# datetime.datetime(
# 2026,
# 10,
# 2,
# 4,
# 52,
# 0,
# tzinfo=datetime.timezone.utc
# )
Der zurückgegebene Wert kann direkt mit datetime_to_isoformat weiterverarbeitet werden:
now = datetime_utc_now()
iso_date = datetime_to_isoformat(now)
# Beispiel-Rückgabewert:
# "2026-10-02T04:52:00+00:00"
Definition und Benutzung
Die Funktion datetime_utc_now gibt das aktuelle Datum und die aktuelle Uhrzeit in UTC als datetime-Objekt zurück.
Intern wird dafür verwendet:
datetime.datetime.now(datetime.timezone.utc)
Im Unterschied zu einem datetime-Wert ohne Zeitzone enthält das Ergebnis bereits explizit die UTC-Zeitzone.
Ein typischer Rückgabewert sieht beispielsweise so aus:
datetime.datetime(
2026,
10,
2,
4,
52,
0,
tzinfo=datetime.timezone.utc
)
Da ein datetime-Objekt zurückgegeben wird, kann der Wert direkt mit anderen Datumsfunktionen weiterverarbeitet werden.
Zum Beispiel:
now = datetime_utc_now()
iso_date = datetime_to_isoformat(now)
# Beispiel-Rückgabewert:
# "2026-10-02T04:52:00+00:00"
Die Funktion ist besonders nützlich, wenn für APIs, Zeitvergleiche oder Protokollierung die aktuelle Zeit unabhängig von der lokalen Server-Zeitzone in UTC benötigt wird.
Syntax
datetime_utc_now()
sha256
Beispiel
hash_value = sha256("Hallo Welt")
# Beispiel-Rückgabewert:
# "2d2da19605a34e037dbe821b84..."
Auch andere Datentypen können übergeben werden. Sie werden vor dem Hashing in einen String umgewandelt:
hash_value = sha256(12345)
# Intern wird daraus:
# "12345"
#
# Anschließend wird der Wert als UTF-8 kodiert
# und als SHA-256-Hash zurückgegeben.
Bytes können ebenfalls direkt verwendet werden:
data = b"Hallo Welt"
hash_value = sha256(data)
# Beispiel-Rückgabewert:
# "2d2da19605a34e037dbe821b84..."
Definition und Benutzung
Die Funktion sha256 erzeugt einen SHA-256-Hash aus dem übergebenen Wert.
Wenn der übergebene Wert kein bytes-Objekt ist, wird er zunächst in einen String umgewandelt:
string_value = str(value)
Anschließend wird der String als UTF-8 kodiert:
bytes_value = string_value.encode("utf-8")
Danach wird der SHA-256-Hash berechnet.
Der Rückgabewert ist die hexadezimale Darstellung des Hashes als String.
Ein SHA-256-Hash besteht aus 64 hexadezimalen Zeichen.
Beispiel:
hash_value = sha256("test")
# Beispiel-Rückgabewert:
# "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
Wird bereits ein bytes-Wert übergeben, wird dieser direkt verarbeitet und nicht erneut in UTF-8 umgewandelt:
data = b"test"
hash_value = sha256(data)
# Rückgabewert:
# "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
Die Funktion ist besonders nützlich, wenn Werte eindeutig und reproduzierbar gehasht werden sollen, zum Beispiel für Prüfsummen, Signaturen, Vergleiche oder pseudonymisierte Kennungen.
Wichtig ist, dass SHA-256 eine Hashfunktion und keine Verschlüsselung ist. Der ursprüngliche Wert kann aus dem Hash nicht direkt wiederhergestellt werden.
Syntax
sha256(string_)
isinstance
Beispiel
value = "Hallo Welt"
is_string = isinstance(value, str)
# Rückgabewert:
# True
Weitere Beispiele:
number = 123
is_integer = isinstance(number, int)
# Rückgabewert:
# True
value = 12.5
is_integer = isinstance(value, int)
# Rückgabewert:
# False
Mit mehreren erlaubten Typen:
value = 12.5
is_number = isinstance(value, (int, float))
# Rückgabewert:
# True
Definition und Benutzung
Die Funktion isinstance prüft, ob ein Wert beziehungsweise Objekt einem bestimmten Datentyp entspricht.
Der erste Parameter ist der zu prüfende Wert.
Der zweite Parameter ist der erwartete Typ.
Beispiel:
value = "Test"
result = isinstance(value, str)
# Rückgabewert:
# True
Ist der Wert nicht vom angegebenen Typ, wird False zurückgegeben:
value = "Test"
result = isinstance(value, int)
# Rückgabewert:
# False
Es können auch mehrere mögliche Typen gleichzeitig geprüft werden. Dafür werden die Typen als Tuple übergeben:
value = 123
result = isinstance(value, (int, float))
# Rückgabewert:
# True
Das ist beispielsweise nützlich, wenn sowohl Ganzzahlen als auch Fließkommazahlen erlaubt sein sollen.
Ein typischer Anwendungsfall innerhalb einer Funktion:
def process_value(value):
if isinstance(value, str):
return "String"
if isinstance(value, int):
return "Integer"
return "Anderer Typ"
isinstance kann auch bei datetime-Objekten verwendet werden:
date = datetime.datetime.now()
is_datetime = isinstance(date, datetime.datetime)
# Rückgabewert:
# True
Die Funktion ist besonders nützlich, wenn vor der weiteren Verarbeitung geprüft werden soll, welchen Datentyp ein Wert besitzt.
Syntax
isinstance(object, classinfo)
classinfo kann dabei entweder ein einzelner Typ oder ein Tuple mit mehreren möglichen Typen sein:
isinstance(value, str)
isinstance(value, (int, float))
strisdigit
Beispiel
value = "12345"
result = str_is_digit(value)
# Rückgabewert:
# True
Bei einem String mit anderen Zeichen:
value = "123a"
result = str_is_digit(value)
# Rückgabewert:
# False
Auch Leerzeichen oder Vorzeichen führen dazu, dass False zurückgegeben wird:
result = str_is_digit("123 456")
# Rückgabewert:
# False
result = str_is_digit("-123")
# Rückgabewert:
# False
Definition und Benutzung
Die Funktion str_is_digit prüft, ob alle Zeichen eines Strings Ziffern sind.
Intern wird dafür die Python-Funktion
str.isdigit(s)
verwendet.
Enthält der String ausschließlich Ziffern, wird True zurückgegeben.
Beispiel:
result = str_is_digit("987654")
# Rückgabewert:
# True
Enthält der String mindestens ein Zeichen, das keine Ziffer ist, wird False zurückgegeben:
result = str_is_digit("987a54")
# Rückgabewert:
# False
Auch Dezimalzahlen als String gelten nicht als reine Ziffernfolge:
result = str_is_digit("12.5")
# Rückgabewert:
# False
Ebenso werden negative Zahlen als String nicht als reine Ziffern erkannt:
result = str_is_digit("-42")
# Rückgabewert:
# False
Die Funktion ist besonders nützlich, wenn geprüft werden soll, ob ein String ausschließlich aus Ziffern besteht, bevor er beispielsweise in eine Zahl umgewandelt oder weiterverarbeitet wird.
Syntax
str_is_digit(s)
extend
Beispiel
values = [1, 2, 3]
extend(values, [4, 5])
# Ergebnis von values:
# [1, 2, 3, 4, 5]
Auch mehrere Strings können an eine bestehende Liste angehängt werden:
names = ["Anna", "Max"]
extend(names, ["Lisa", "Tom"])
# Ergebnis von names:
# ["Anna", "Max", "Lisa", "Tom"]
Definition und Benutzung
Die Funktion extend erweitert eine bestehende Liste um alle Elemente eines weiteren iterierbaren Werts.
Intern wird dafür verwendet:
list_.extend(value)
Der erste Parameter list_ ist die Liste, die erweitert werden soll.
Der zweite Parameter value enthält die Elemente, die an die Liste angehängt werden sollen.
Beispiel:
numbers = [1, 2]
extend(numbers, [3, 4])
# numbers enthält anschließend:
# [1, 2, 3, 4]
Wichtig ist der Unterschied zu append.
Bei extend werden die einzelnen Elemente des übergebenen Werts zur bestehenden Liste hinzugefügt:
values = [1, 2]
extend(values, [3, 4])
# Ergebnis:
# [1, 2, 3, 4]
Die Funktion verändert die bestehende Liste direkt.
Sie gibt selbst keinen zusätzlichen Wert zurück.
Syntax
extend(list_, value)
append
Beispiel
values = [1, 2, 3]
append(values, 4)
# Ergebnis von values:
# [1, 2, 3, 4]
Auch eine komplette Liste kann als einzelnes Element angehängt werden:
values = [1, 2]
append(values, [3, 4])
# Ergebnis von values:
# [1, 2, [3, 4]]
Definition und Benutzung
Die Funktion append fügt einen einzelnen Wert am Ende einer bestehenden Liste hinzu.
Intern wird dafür verwendet:
list_.append(value)
Der erste Parameter list_ ist die Liste, die verändert werden soll.
Der zweite Parameter value ist der einzelne Wert, der am Ende der Liste hinzugefügt wird.
Beispiel:
names = ["Anna", "Max"]
append(names, "Lisa")
# names enthält anschließend:
# ["Anna", "Max", "Lisa"]
Wird als value selbst eine Liste übergeben, wird diese Liste als ein einzelnes Element eingefügt:
values = [1, 2]
append(values, [3, 4])
# Ergebnis:
# [1, 2, [3, 4]]
Im Unterschied dazu würde extend die einzelnen Elemente hinzufügen:
values = [1, 2]
extend(values, [3, 4])
# Ergebnis:
# [1, 2, 3, 4]
Die Funktion verändert die bestehende Liste direkt.
Sie gibt selbst keinen zusätzlichen Wert zurück.
Syntax
append(list_, value)
to_tuple
Beispiel
values = [1, 2, 3]
result = to_tuple(values)
# Rückgabewert:
# (1, 2, 3)
Auch ein String kann in ein Tuple umgewandelt werden:
value = "abc"
result = to_tuple(value)
# Rückgabewert:
# ("a", "b", "c")
Wenn der übergebene Wert nicht in ein Tuple umgewandelt werden kann, wird ein leeres Tuple zurückgegeben:
result = to_tuple(None)
# Rückgabewert:
# ()
Definition und Benutzung
Die Funktion to_tuple versucht, den übergebenen Wert in ein Python-Tuple umzuwandeln.
Intern wird dafür verwendet:
tuple(tuple_)
Kann der Wert erfolgreich konvertiert werden, wird das erzeugte Tuple zurückgegeben.
Beispiel mit einer Liste:
values = ["a", "b", "c"]
result = to_tuple(values)
# Rückgabewert:
# ("a", "b", "c")
Beispiel mit einem bereits vorhandenen Tuple:
values = (1, 2, 3)
result = to_tuple(values)
# Rückgabewert:
# (1, 2, 3)
Auch andere iterierbare Werte können umgewandelt werden.
Beispielsweise wird ein String in seine einzelnen Zeichen aufgeteilt:
value = "test"
result = to_tuple(value)
# Rückgabewert:
# ("t", "e", "s", "t")
Tritt bei der Umwandlung ein Fehler auf, wird dieser intern abgefangen.
Die Funktion gibt in diesem Fall immer ein leeres Tuple zurück:
result = to_tuple(None)
# Rückgabewert:
# ()
Dadurch kann to_tuple verwendet werden, wenn ein Wert sicher als Tuple weiterverarbeitet werden soll, ohne dass ein Fehler bei einer nicht möglichen Konvertierung die Automation unterbricht.
Syntax
to_tuple(tuple_)
getsslexpiry_days
Beispiel
days = get_ssl_expiry_days("example.com")
# Beispiel-Rückgabewert:
# 42
Der Rückgabewert entspricht dabei voraussichtlich der Anzahl der verbleibenden Tage bis zum Ablauf des SSL-Zertifikats der angegebenen Domain.
Ein typischer Anwendungsfall:
days = get_ssl_expiry_days("example.com")
if days < 30:
logging.info("SSL-Zertifikat läuft bald ab")
Definition und Benutzung
Die Funktion get_ssl_expiry_days prüft das SSL-Zertifikat einer Domain.
Anhand des Funktionsnamens ist davon auszugehen, dass die Funktion die Anzahl der verbleibenden Tage bis zum Ablauf des SSL-Zertifikats zurückgibt.
Beispiel:
days = get_ssl_expiry_days("example.com")
# Beispiel-Rückgabewert:
# 42
Damit kann beispielsweise geprüft werden, ob ein Zertifikat bald abläuft:
days = get_ssl_expiry_days("example.com")
if days <= 14:
logging.info("SSL-Zertifikat läuft in Kürze ab")
Die Funktion behandelt verschiedene Fehlerfälle und wirft dafür jeweils eine AutomationException.
Bei einem SSL-Fehler:
days = get_ssl_expiry_days("example.com")
# Bei einem SSL-Problem:
# AutomationException("SSLError", ...)
Zusätzlich wird bei einem SSL-Fehler eine Warnung ins Logging geschrieben.
Mögliche Fehlertypen sind:
SSLError
InvalidDomain
TimeoutError
ConnectionRefusedError
Ein ungültiger oder nicht auflösbarer Domainname führt beispielsweise zu:
days = get_ssl_expiry_days("domain-does-not-exist.invalid")
# Exception:
# AutomationException("InvalidDomain", ...)
Wenn die Verbindung zu lange dauert:
days = get_ssl_expiry_days("example.com")
# Exception:
# AutomationException("TimeoutError", ...)
Wenn die Verbindung vom Zielserver abgelehnt wird:
days = get_ssl_expiry_days("example.com")
# Exception:
# AutomationException("ConnectionRefusedError", ...)
Andere nicht speziell behandelte Fehler werden ebenfalls als AutomationException weitergegeben. Als Fehlername wird dabei der Name der ursprünglichen Exception verwendet.
Beispielsweise:
# Ursprüngliche Exception:
# SomeError(...)
# Weitergegeben als:
# AutomationException("SomeError", ...)
Die Funktion ist besonders nützlich, um SSL-Zertifikate automatisiert zu überwachen und rechtzeitig auf bald ablaufende oder fehlerhafte Zertifikate zu reagieren.
Fehlerbehandlung
Die Funktion unterscheidet folgende Fehlerfälle:
# SSL-Fehler
AutomationException("SSLError", e)
# Domain kann nicht aufgelöst werden
AutomationException("InvalidDomain", e)
# Verbindung läuft in einen Timeout
AutomationException("TimeoutError", e)
# Verbindung wird abgelehnt
AutomationException("ConnectionRefusedError", e)
# Sonstige Fehler
AutomationException(e.__class__.__name__, e)
Syntax
get_ssl_expiry_days(domain)
AutomationException
Beispiel
raise AutomationException(
"InvalidDomain",
"Die Domain konnte nicht aufgelöst werden"
)
Beispiel innerhalb einer Funktion:
def check_domain(domain):
if not domain:
raise AutomationException(
"InvalidDomain",
"Keine Domain angegeben"
)
return True
Eine Funktion kann AutomationException auch verwenden, um einen abgefangenen Fehler mit einem eigenen Fehlernamen weiterzugeben:
try:
result = some_function()
except Exception as ex:
raise AutomationException(
"ProcessingError",
ex
)
Definition und Benutzung
AutomationException ist ein Exception-Typ für Fehler innerhalb einer Automation.
Sie kann verwendet werden, um einen Fehler gezielt auszulösen und dabei einen eigenen Fehlernamen sowie zusätzliche Fehlerinformationen zu übergeben.
Typischerweise wird sie mit zwei Werten verwendet:
AutomationException(error_name, error)
Der erste Wert beschreibt den Typ beziehungsweise Namen des Fehlers.
Beispiele:
SSLError
InvalidDomain
TimeoutError
ConnectionRefusedError
ProcessingError
MissingValue
Der zweite Wert enthält weitere Informationen zum eigentlichen Fehler.
Beispiel:
raise AutomationException(
"InvalidDomain",
"Domain konnte nicht aufgelöst werden"
)
Auch eine bereits abgefangene Exception kann als zweiter Wert weitergegeben werden:
try:
result = some_function()
except Exception as ex:
raise AutomationException(
"ProcessingError",
ex
)
Die Verwendung ist besonders nützlich, wenn Fehler in Automationen einheitlich behandelt und mit einem klaren Fehlernamen versehen werden sollen.
Ein typischer Anwendungsfall:
try:
result = process_data()
except Exception as ex:
raise AutomationException(
"ProcessingError",
ex
)
Eigene Prüfungen können ebenfalls direkt eine AutomationException auslösen:
if value is None:
raise AutomationException(
"MissingValue",
"Der benötigte Wert fehlt"
)
Syntax
AutomationException(error_name, error)
Zum Auslösen der Exception:
raise AutomationException(
error_name,
error
)
replacestringsinarow
Beispiel
text = "Hallo --- Welt"
result = replace_strings_in_a_row(
text,
"-",
" "
)
# Rückgabewert:
# "Hallo Welt"
Mehrere direkt aufeinanderfolgende gleiche Zeichen werden dabei zusammengefasst und durch den angegebenen Wert ersetzt:
text = "Test___Wert"
result = replace_strings_in_a_row(
text,
"_",
"-"
)
# Rückgabewert:
# "Test-Wert"
Auch Leerzeichen direkt vor oder nach den gefundenen Zeichen werden mit ersetzt:
text = "Hallo , Welt"
result = replace_strings_in_a_row(
text,
",",
" - "
)
# Rückgabewert:
# "Hallo - Welt"
Definition und Benutzung
Die Funktion replace_strings_in_a_row ersetzt ein oder mehrere direkt aufeinanderfolgende Vorkommen eines bestimmten Strings.
Zusätzlich werden Leerzeichen vor und nach dem gefundenen Bereich entfernt beziehungsweise zusammen mit dem Treffer ersetzt.
Der erste Parameter text enthält den Text, der bearbeitet werden soll.
Der zweite Parameter string_ enthält den String beziehungsweise das Zeichen, nach dem gesucht werden soll.
Der dritte Parameter replace enthält den Wert, durch den der gefundene Bereich ersetzt werden soll.
Beispiel:
text = "A --- B"
result = replace_strings_in_a_row(
text,
"-",
" "
)
# Rückgabewert:
# "A B"
Intern wird der Suchwert zunächst für die Verwendung in einem regulären Ausdruck vorbereitet.
Wenn string_ nicht leer ist, werden auch mehrere direkt aufeinanderfolgende Vorkommen erkannt.
Aus:
-
--
---
----
wird dadurch jeweils ein zusammenhängender Treffer.
Beispiel:
text = "A----B"
result = replace_strings_in_a_row(
text,
"-",
":"
)
# Rückgabewert:
# "A:B"
Sonderzeichen im Suchwert werden automatisch escaped. Dadurch können auch Zeichen verwendet werden, die normalerweise eine besondere Bedeutung in regulären Ausdrücken besitzen.
Beispiel mit einem Punkt:
text = "A....B"
result = replace_strings_in_a_row(
text,
".",
"-"
)
# Rückgabewert:
# "A-B"
Die Funktion berücksichtigt außerdem Whitespace direkt vor und nach dem Treffer.
Beispiel:
text = "A ___ B"
result = replace_strings_in_a_row(
text,
"_",
"-"
)
# Rückgabewert:
# "A-B"
Wenn string_ leer ist, wird nur der umgebende Whitespace durch den angegebenen Wert ersetzt.
Die Funktion ist besonders nützlich, um wiederholte Trennzeichen oder uneinheitliche Abstände innerhalb eines Textes zu normalisieren.
Syntax
replace_strings_in_a_row(text, string_, replace)
determinemailingsstatistics
Beispiel
statistics = determine_mailings_statistics(
from_="2026-10-01",
to_="2026-10-31",
query='transactionmail == 0',
cache_disabled=False
)
# Beispiel-Rückgabewert:
# {
# "data": [
# {
# "mailing_id": 31699,
# "subject": "sub",
# "listnum": 2,
# "amount": 0,
# "size": 1,
# "starttime": 1791009206,
# "datesent": "2026-10-03T06:33:26Z",
# "sendername": "sende",
# "senderemail": "hallo@hallo.de",
# "description": "kajomi",
# "splitrun": None,
# "clicks": {
# "unique": 0,
# "all": 0
# },
# "bounces": {
# "soft": 0,
# "hard": 0
# },
# "opens": {
# "unique": 0,
# "all": 0
# },
# "unsubscribes": {
# "all": 0
# },
# "complaints": {
# "all": 0
# },
# "timestampCache": "2026-10-03T08:33:27Z"
# }
# ]
# }
Auf einzelne Werte des Rückgabewerts kann anschließend beispielsweise so zugegriffen werden:
statistics = determine_mailings_statistics(
from_="2026-10-01",
to_="2026-10-31"
)
mailings = statistics.get("data")
mailing = mailings[0]
mailing_id = mailing.get("mailing_id")
subject = mailing.get("subject")
size = mailing.get("size")
opens = mailing.get("opens")
unique_opens = opens.get("unique")
all_opens = opens.get("all")
clicks = mailing.get("clicks")
unique_clicks = clicks.get("unique")
all_clicks = clicks.get("all")
Definition und Benutzung
Die Funktion determine_mailings_statistics ermittelt Statistikdaten zu Mailings.
Über from_ und to_ kann der Zeitraum eingeschränkt werden.
Mit query können zusätzlich nur bestimmte Mailings selektiert werden.
Der Parameter cache_disabled steuert, ob für die Ermittlung der Statistikdaten der Cache deaktiviert werden soll.
Der Rückgabewert enthält unter data eine Liste mit den gefundenen Mailings und deren Statistikwerten.
Ein Mailing kann unter anderem folgende Werte enthalten:
mailing_id = Mailing-ID
subject = Betreff des Mailings
listnum = Verteiler-ID
amount = geplante Anzahl der Mails
size = tatsächlich versendete Anzahl der Mails
starttime = Startzeit als Timestamp
datesent = Versanddatum
sendername = Absendername
senderemail = Absender-E-Mail
description = Beschreibung des Mailings
splitrun = Splitrun-Information
clicks = Klickstatistik
bounces = Bounce-Statistik
opens = Öffnungsstatistik
unsubscribes = Abmeldungen
complaints = Beschwerden
timestampCache = Zeitpunkt der Statistikdaten im Cache
Die Statistikfelder sind wiederum eigene Strukturen.
Beispielsweise:
opens = mailing.get("opens")
unique_opens = opens.get("unique")
all_opens = opens.get("all")
Für Klicks:
clicks = mailing.get("clicks")
unique_clicks = clicks.get("unique")
all_clicks = clicks.get("all")
Für Bounces:
bounces = mailing.get("bounces")
soft_bounces = bounces.get("soft")
hard_bounces = bounces.get("hard")
Bei verschachtelten Strukturen sollten die einzelnen Ebenen schrittweise ausgelesen werden.
Nicht:
unique_opens = mailing.get("opens").get("unique")
Sondern:
opens = mailing.get("opens")
unique_opens = opens.get("unique")
Zeitraum
Mit from_ und to_ kann der Zeitraum der Statistik eingeschränkt werden.
Beispiel:
statistics = determine_mailings_statistics(
from_="2026-09-01",
to_="2026-10-01"
)
Wenn from_ und to_ nicht gesetzt werden, verwendet die Funktion automatisch folgenden Zeitraum:
from_ = -24h
to_ = aktuelles Datum / aktuelle Zeit
Das bedeutet, dass standardmäßig die Mailings beziehungsweise Statistikdaten der letzten 24 Stunden bis zum aktuellen Zeitpunkt berücksichtigt werden.
Beispiel ohne Zeitangaben:
statistics = determine_mailings_statistics()
# Entspricht sinngemäß:
# from_ = 24 Stunden vor dem aktuellen Zeitpunkt
# to_ = aktueller Zeitpunkt
Mailing-Selektion mit query
Der Parameter query verwendet die kajomi Selektionssprache für Mailings.
Eine vollständige Beschreibung der verfügbaren Felder, Operatoren und Funktionen befindet sich hier:
[Welche Funktionen und Operatoren habe ich beim Selektieren von Mailings zur Verfügung?](#5996614919e853592ab8168288420091)
Beispiel:
statistics = determine_mailings_statistics(
query='transactionmail == 0'
)
Damit werden nur Mailings berücksichtigt, die keine Transaktionsmailings sind.
Mehrere Bedingungen können mit && verbunden werden:
statistics = determine_mailings_statistics(
query='transactionmail == 0 && size > 1000'
)
Oder mit ||:
statistics = determine_mailings_statistics(
query='subject == "Newsletter" || description == "Newsletter"'
)
Auch eine Suche mit % ist möglich:
statistics = determine_mailings_statistics(
query='subject ~ "%Newsletter%"'
)
cache_disabled
Der Parameter cache_disabled kann verwendet werden, um die Cache-Nutzung für die Statistikabfrage zu steuern.
Standardmäßig ist der Wert:
cache_disabled=False
Beispiel mit deaktiviertem Cache:
statistics = determine_mailings_statistics(
from_="2026-10-01",
to_="2026-10-31",
cache_disabled=True
)
Syntax
determine_mailings_statistics(
from_=None,
to_=None,
query=None,
cache_disabled=False
)