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. Wird None ü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 `
erreicht werden.

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 ist 0.

Rückgabewert

  • Pattern
    Ein kompiliertes Regex-Pattern-Objekt, das wie das Ergebnis von re.compile verwendet 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
)