Viele Banken betreiben mittlerweile einen FinTS/HBCI-Server für Finanzsoftware. Einige Banken bieten jedoch leider überhaupt keine maschinenlesbare Schnittstelle an, über die eine Finanzsoftware (wie MoneyMoney) die Umsätze abrufen könnte. In so einem Fall können die Umsätze von einer Finanzsoftware nur mittels Web Scraping von der Website der Bank heruntergeladen werden. Die Web Banking Engine von MoneyMoney besteht aus einem recht umfangreichen Kern, der in C und Objective-C implementiert ist. Der Kern wird durch mehrere schlanke Extensions ergänzt. Diese Web Banking Extensions sind kurze Lua-Skripte, die einfach zu erstellen, zu modifizieren und auszuwechseln sind. Die Lua-Skripte werden von der Web Banking Engine in einer virtuellen Maschine ausgeführt und kommunizieren über eine dokumentierte API mit MoneyMoney. Das vorliegende Dokument spezifiziert diese API. Die Wahl der Skriptsprache fiel auf Lua, da sie relativ leicht zu erlernen ist und sich gut mit C/C++/Objective-C kombinieren lässt. Für unsere Extensions reicht es vollkommen aus, die ersten fünf Kapitel von »Programming in Lua« gelesen zu haben. Die meisten innerhalb einer Extension aufgerufenen Funktionen sind nämlich gar nicht Bestandteil von Lua, sondern existieren ausschließlich in MoneyMoney. Das folgende Stück Lua-Code soll einen Eindruck davon vermitteln, wie eine Web Banking Extension in der Praxis vorgeht: Zuerst wird die Login-Seite vom Server geholt und aus ihrem HTML-Code eine Baumstruktur aufgebaut ➊. Mit Hilfe dieser Baumstruktur wird im HTML-Dokument mit XPath-Ausdrücken zu den Texteingabefeldern navigiert. Deren HTML-Attribute Das Skript erzeugt das gleiche Ergebnis, also die gleiche Serverkommunikation, wie sie ein Mensch mit einem Webbrowser beim Ausfüllen derselben Login-Seite erzeugen würde. Die Web Banking Engine kann man daher mit einem automatisch gesteuerten Webbrowser vergleichen. Das Verzeichnis, in dem eigene Extensions abgelegt werden, kann über Menü Jede Änderung an Dateien in diesem Verzeichnis wirkt sich unmittelbar auf die Web Banking Engine aus, d.h. es ist nicht nötig, MoneyMoney neu zu starten. Fehlermeldungen werden im Protokoll-Fenster von MoneyMoney angezeigt. Das Protokoll-Fenster lässt sich mit der Menüfunktion »Fenster« → »Protokollfenster« erreichen. Hinweis: Für die Entwicklung eigener Extensions lässt sich die Überprüfung der digitalen Signatur in den Einstellungen von MoneyMoney ausschalten. Dazu wird eine Beta-Version von MoneyMoney benötigt. Die Option lässt sich mit der Menüfunktion »MoneyMoney« → »Einstellungen« → »Erweiterungen« → »Digitale Signatur von Extensions überprüfen« erreichen. Ein Skript weist sich als Web Banking Extension aus, indem es am Beginn des Skripts einen Aufruf der Art enthält. Bei den benannten Parameter der Funktion Die Parameter der Funktion Die Variablen Die Ausgabe der Standard-Funktion Die Standard-Funktion Das Objekt Das Skript selbst muss UTF-8-kodiert sein und es werden auch alle Strings als UTF-8-Strings zwischen dem Skript und MoneyMoney übergeben, außer es steht in der API-Beschreibung, dass es sich um Binärdaten handelt. Die Web Banking Engine treibt die Ausführung des Skripts, was bedeutet, dass jedes Skript bestimmte Funktionen als Einsprungspunkte zur Verfügung stellen muss. Es gibt zwei Anwendungsfälle, für die MoneyMoney die Web Banking Engine startet: Für den Anwendungsfall Bankzugang einrichten ruft die Web Banking Engine nacheinander folgende Funktionen des Skripts auf: Der Anwendungsfall Kontenrundruf läuft ähnlich ab: Um herauszufinden, welche Extension für welchen Bankzugang zuständig ist, ruft die Web Banking Engine diese Funktion auf: Parameter: Mögliche Rückgabewerte: Diese Funktion führt einen einfachen Anmeldevorgang durch: Parameter: Mögliche Rückgabewerte: Diese Alternative zur Funktion Parameter: Mögliche Rückgabewerte: Ein Objekt mit folgenden Feldern: Diese Funktion listet alle Konten auf, die mittels Web Scraping abgefragt werden können: Parameter: Array Mögliche Rückgabewerte: Für jedes Konto muss mindestens die Kontonummer zurückgegeben werden, andernfalls wird das Konto ignoriert. Mit dieser Funktion werden Saldo- und Umsatzinformationen oder der Wertpapierbestand eines Kontos abgefragt: Parameter: Mögliche Rückgabewerte: Bei Depots wird nur das Feld Für jeden Umsatz müssen mindestens Betrag und Buchungstag angegeben werden, andernfalls führt dies ebenfalls zu einer Fehlermeldung. Diese Funktion führt den Abmeldevorgang durch: Mögliche Rückgabewerte sind: Folgende Vorlage kann als Ausgangspunkt für eigene Web Banking Extensions dienen. Tipp: Um während der Entwicklung einer Extension nicht bei jeder Skriptänderung die Kontoeinrichtung von MoneyMoney durchlaufen zu müssen, kann man Tipp: In der Anfangsphase der Entwicklung einer Extension ist es gar nicht nötig, eine Online-Verbindung aufzubauen. Vorab mit einem Browser gespeicherte HTML-Seiten können über Lua-Funktionen geladen werden, so dass man gefahrlos mit dem Skript experimentieren kann. Die Informationen eines Konto werden in einer Lua-Tabelle gespeichert. Folgende Felder können belegt werden, soweit deren Inhalt bekannt ist: Die Daten eines Umsatzes werden in einer Lua-Tabelle gespeichert. Die Felder orientieren sich an SWIFT MT-940/MT-942 und können belegt werden, soweit deren Inhalt bekannt ist: Die Daten von Wertpapieren werden in einer Lua-Tabelle gespeichert. Die Felder orientieren sich an SWIFT MT-535/MT-571 und können belegt werden, soweit deren Inhalt bekannt ist: Erzeugt ein Objekt, mit dem eine HTTPS-Verbindung zu einem Webserver aufgebaut werden kann. Diese Methode des Connection-Objekts fordert eine Ressource vom Webserver an. Falls noch keine HTTPS-Verbindung zum Server besteht, wird diese aufgebaut. Das Connection-Objekt verwendet HTTP-Pipelining. Wenn der Server dies auch anbietet und solange über den URL-Parameter nicht der Server gewechselt wird, werden alle Anfragen über dieselbe HTTPS-Verbindung geschickt. Für JSON-basierte REST-APIs sollte im Parameter Parameter: Rückgabewerte: Zur Bestimmung des Zeichensatzes und des MIME-Typs werden der HTTP-Header des Servers und Beispiel: Tipp: Die Art und Reihenfolge der Rückgabewerte ist so gewählt, dass sie sich für die Erzeugung eines HTML-Objektes verwenden lassen: Kurzform für: Kurzform für: Schließt die HTTPS-Verbindung zum Server. Normalerweise braucht diese Methode nicht aufgerufen werden, da nach der Ausführung des Skripts alle offenen Verbindungen automatisch geschlossen werden. Diese Methode gibt die zuletzt aufgerufene URL zurück. Rückgabewert: String Jedes Skript erhält für die Dauer seiner Ausführung einen Speicher für HTTP-Cookies. Dieser Speicher wird von allen HTTP-Verbindungen, die innerhalb desselben Skripts aufgebaut werden, gemeinsam genutzt. Die Cookies werden automatisch aus dem HTTP-Header des Servers und den Mit dieser Methode können dem Speicher weitere Cookies hinzugefügt oder vorhandene Cookies geändert werden. Parameter: String Beispiel: Mit dieser Methode lassen sich die HTTP-Cookies abfragen, die für die gerade aktive, d.h. zuletzt aufgerufene URL gültig sind. Rückgabewert: String Dieses Attribut vom Typ String enthält den Wert des Felds Beispiel: Dieses Attribut vom Typ String enthält den Wert des Felds Beispiel: Erzeugt ein neues Objekt, mit dem sich in einem HTML-Dokument navigieren lässt. Parameter: Wählt HTML-Elemente mittels eines XPath-Ausdrucks aus. Parameter: String Rückgabewert: Objekt Tipp: Die Entwicklertools von Webbrowsern bieten komfortable Werkzeuge an, um XPath-Ausdrücke zu schreiben und zu testen. Diese Methode generiert aus dem HTML-Dokument neuen, formatierten HTML-Code. Dieser ist nicht unbedingt identisch zum ursprünglichen HTML-Code. Der generierte HTML-Code ist immer UTF-8-kodiert. Rückgabewert: String Diese Methode liefert die Anzahl der HTML-Elemente, die sich im Objekt Rückgabewert: Number Diese Methode wählt das Parameter: Number Rückgabewert: Objekt Beispiel: Diese Methode durchläuft alle HTML-Elemente von Parameter: Function Wenn die Funktion Beispiel: Diese Methode dreht die Reihenfolge der HTML-Elemente von Rückgabewert: Objekt Diese Methode wählt die unmittelbaren Kindelemente der HTML-Elemente aus Rückgabewert: Objekt Diese Methode wählt mittels eines XPath-Ausdrucks HTML-Elemente relativ zum ersten HTML-Element von Parameter: String Rückgabewert: Objekt Diese Methode liefert den kombinierten Text, der sich zwischen den HTML-Tags der HTML-Elemente Rückgabewert: String Diese Methode gibt den Inhalt eines Attributs des ersten HTML-Elements aus Parameter: String Rückgabewert: String Diese Methode ändert ein Attribut für alle HTML-Elements aus Parameter: Diese Methode gibt den Wert eines Formularfelds zurück. Das erste HTML-Element in Rückgabewert: String Diese Methode wählt eine Option in einer Auswahlliste ( Parameter: String Diese Methode erzeugt aus einem HTML-Link oder einem HTML-Formular die Parameter für einen HTTP-Request. In Bei einem HTML-Link wird die verlinkte URL zurückgegeben. Bei einem Formular werden die Werte der Rückgabewerte: Tipp: Die Art und Reihenfolge der Rückgabewerte ist so gewählt, dass sie sich für einen HTTP-Request verwenden lassen: Diese Methode erzeugt aus einem HTML-Formular ohne Submit-Button die Parameter für einen HTTP-Request. In Rückgabewerte: Tipp: Die Art und Reihenfolge der Rückgabewerte ist so gewählt, dass sie sich für einen HTTP-Request verwenden lassen: Diese Methode konvertiert ein JSON-Dokument in eine Lua-Datenstruktur. Parameter: Binary Rückgabewert: Dictionary oder Array Diese Methode konvertiert eine Lua-Datenstruktur zunächst in ein JSON-Dokument. Parameter: Dictionary oder Array Rückgabewert: Binary Diese Methode extrahiert, so gut wie möglich, den unformattierten Text aus einem PDF-Dokument. Parameter: Binary Rückgabewert: String Erzeugt ein neues Objekt mit Informationen zu einer Bank. Parameter: String Beispiel: Die Informationen zu einer Bank werden in einer Lua-Tabelle gespeichert. Derzeit gibt es nur ein einziges belegtes Feld: Mit dieser Funktion kann ein Text übersetzt werden. Diese Funktion ist primär für die mit MoneyMoney ausgelieferten Extensions gedacht. Sie ist ein Wrapper für die Cocoa-Funktion Parameter: String Rückgabewert: String Lokalisiert eine Zeitangabe. Da die von Lua unterstützten POSIX Locales innerhalb von macOS-Apps nicht zur Verfügung stehen, baut diese Funktion auf der Cocoa-Klasse Parameter: Rückgabewert: String Lokalisiert eine Zahl. Da die von Lua unterstützten POSIX Locales innerhalb von macOS-Apps nicht zur Verfügung stehen, baut diese Funktion auf der Cocoa-Klasse Parameter: Rückgabewert: String Lokalisiert einen Währungsbetrag. Parameter: Rückgabewert: String Wendet eine URL-Kodierung an. Parameter: Rückgabewert: String Entfernt die URL-Kodierung. Parameter: String Rückgabewert: String Konvertiert einen Text von UTF-8 zu einem anderen Zeichensatz. Parameter: Rückgabewert: Binary Konvertiert einen Text von einem anderen Zeichensatz zu UTF-8. Parameter: Rückgabewert: String Konvertiert Daten zu Base64. Parameter: Binary Rückgabewert: String Konvertiert Daten von Base64. Parameter: Binary Rückgabewert: String Berechnet einen SHA512-, SHA256-, SHA1- oder MD5-Hashwert. Parameter: Binary Rückgabewert: String Berechnet einen HMAC512-, HMAC384-, HMAC256- oder HMAC1-Message-Authentication-Code. Parameter: Rückgabewert: Binary Gibt die aktuelle Uhrzeit zurück. Im Gegensatz zum Aufruf Rückgabewert: Number Unterbricht die Ausführung des Skripts für ein paar Sekunden. Parameter: Number Diese Funktion arbeitet ähnlich zur Lua-Funktion MoneyMoney Web Banking API Für Entwickler, Stand 12.9.2023
Einführung
Warum Web Scraping?
Die Web Banking Engine
Ein Praxisbeispiel
➊ connection = Connection()
html = HTML(connection:get("https://moneymoney-app.com/onlinebanking"))
➋ html:xpath("//input[@name='kontonummer']"):attr("value", username)
html:xpath("//input[@name='pin']"):attr("value", password)
➌ connection:request(html:xpath("//input[@name='loginbutton']"):click())
value
werden dann mit den Anmeldedaten ausgefüllt ➋. Danach wird das Login-Formular abgeschickt ➌. Offensichtlich sind nur wenige Code-Zeilen notwendig, um den typischen Anmeldevorgang beim Online-Banking durchzuführen.Vom Skript zur Extension
Installation
Hilfe
→ Zeige Datenbank im Finder
im Finder geöffnet werden:~/Library/Containers/com.moneymoney-app.retail/Data/Library/Application Support/MoneyMoney/Extensions
Registrierung einer Extension
WebBanking{version = 1.00,
url = "https://moneymoney-app.com/onlinebanking",
services = {"Premium Account"},
description = "Demo"}
WebBanking
handelt es sich um:
version
: Versionsnummer der Extensionurl
(optional): URL der Einstiegsseite des Online-Bankingsservices
(optional): Die in diesem Array enthaltenen Service-Namen werden in MoneyMoney in der Auswahlliste beim Anlegen eines Kontos angezeigt.description
(optional): Beschreibung der ExtensionLua-Laufzeitumgebung
WebBanking
sind später im Skript als globale Variablen version
, url
, services
und description
zugänglich. Zusätzlich ist auch noch die globale Variable extensionName
mit dem Namen der Extension definiert.MM.productName
und MM.productVersion
enthalten Informationen zur Anwendung, also MoneyMoney.print
wird im Protokoll-Fenster von MoneyMoney angezeigt.error
bricht die Ausführung des Skripts ab. Die Fehlermeldung wird im Protokoll-Fenster und je nach Kontext auch in einem GUI-Dialog angezeigt.LocalStorage
kann über die Laufzeit des Skripts hinaus zur Speicherung von Informationen genutzt werden.Aufbau einer Web Banking Extension
Einsprungspunkte
SupportsBank
(Klärung der Zuständigkeit)InitializeSession
(Anmeldung)ListAccounts
(Auflistung der verfügbaren Konten)RefreshAccount
(Aktualisierung eines Kontos)EndSession
(Abmeldung)
SupportsBank
(Klärung der Zuständigkeit)InitializeSession
(Anmeldung)RefreshAccount
(Aktualisierung eines Kontos)EndSession
(Abmeldung)Klärung der Zuständigkeit
function SupportsBank (protocol, bankCode)
protocol
: Protokoll des Bankzugangs; Mögliche Werte sind ProtocolFinTS
und ProtocolWebBanking
. Der erste Wert ist dazu gedacht, einen FinTS/HBCI-Bankzugang um Konten zu bereichern, die von der Bank nicht über das FinTS/HBCI-Protokoll zur Verfügung gestellt werden. Der zweite Wert ist für Bankzugänge gedacht, die aussschließlich über Web Scraping abgefragt werden.bankCode
: Bankleitzahl oder Service-Name
false
, wenn die Extension für den besagten Bankzugang das Web Scraping nicht übernehmen kann.true
, wenn die Extension für den besagten Bankzugang das Web Scraping übernehmen kann. Anstelle von true
kann auch die URL der Einstiegsseite des Online-Bankings zurückgegeben werden.Anmeldung (einfach)
function InitializeSession (protocol, bankCode, username, reserved, password)
protocol
: Protokoll des Bankzugangs; Mögliche Werte sind ProtocolFinTS
und ProtocolWebBanking
.bankCode
: Bankleitzahl oder Service-Nameusername
: Benutzernamereserved
: leer, derzeit nicht verwendetpasswort
: Passwort
nil
, wenn die Anmeldung erfolgreich war.LoginFailed
, wenn die Zugangsdaten vom Server abgewiesen wurden. Um eine Sperrung des Passworts durch den Server zu vermeiden, werden die betroffenen Konten durch MoneyMoney nicht mehr automatisch aktualisiert, bis die Zugangsdaten durch den Anwender erneut eingegeben wurden.Anmeldung (mit Zwei-Faktor-Authentifizierung)
InitializeSession
führt einen Anmeldevorgang mit Zwei-Faktor-Authentifizierung durch. Wenn diese Funktion beim ersten Aufruf ein Objekt mit Informationen zur Zwei-Faktor-Authentifizierung zurückgibt, dann wird sie ein zweites Mal mit step=2
aufgerufen. Beim ersten Aufruf enthält credentials
die Benutzernamen und das Passwort. Beim zweiten Aufruf enthält credentials
die Antwort auf challenge
.function InitializeSession2 (protocol, bankCode, step, credentials, interactive)
protocol
: Protokoll des Bankzugangs; Mögliche Werte sind ProtocolFinTS
und ProtocolWebBanking
.bankCode
: Bankleitzahl oder Service-Namestep
: Schritt 1
oder 2
der Zwei-Faktor-Authentifizierungcredentials
: Liste von Benutzernamen und Passwörterninteractive
: MoneyMoney wird im Vordergrund oder Hintergrund ausgeführt
nil
, wenn die Anmeldung erfolgreich war.LoginFailed
, wenn die Zugangsdaten vom Server abgewiesen wurden. Um eine Sperrung des Passworts durch den Server zu vermeiden, werden die betroffenen Konten durch MoneyMoney nicht mehr automatisch aktualisiert, bis die Zugangsdaten durch den Anwender erneut eingegeben wurden.
title
: Überschrift für den Dialog der Zwei-Faktor-Authentifizierungchallenge
: Die Aufforderung kann entweder ein String für eine Frage sein, oder die Binärdaten eines Captchas im PNG- oder JPEG-Format.label
: Beschriftung des EingabefeldsAuflistung der verfügbaren Konten
function ListAccounts (knownAccounts)
knownAccounts
: Wenn das Protokoll des Bankzugangs FinTS/HBCI ist, Web Scraping also nur als Ergänzung dient, dann enthält dieser Parameter ein Array mit schon bekannten Konten. Das Skript kann anhand dieses Arrays feststellen, welche Kontoinformationen es nicht mehr über Web Scraping abzufragen braucht. Die Struktur der Array-Elemente ist im Abschnitt »Datenstruktur eines Kontos« beschrieben.
Aktualisierung eines Kontos
function RefreshAccount (account, since)
account
: Das Konto, das abgefragt werden soll. Die Strukur ist im Abschnitt »Datenstruktur eines Kontos« beschrieben.since
: Der Buchungstag, ab dem Umsätze geliefert werden sollten. Das Skript braucht ältere Umsätze nicht mehr zu liefern. Die Angabe erfolgt in Form eines POSIX-Zeitstempels. Bei Depots wird anstelle dieses Parameters nil
übergeben.
balance
: Kontostandbalances
: Ein Array mit Tupeln (Kontostand, Währung). Dieses Feld sollte nur dann an Stelle von balance
zurückgegeben werden, wenn das Konto mehrere Kontostände in unterschiedlichen Währungen besitzt.pendingBalance
: Summe der vorgemerkten Umsätzetransactions
: Ein Array mit Umsätzen; Diese Umsätze werden als »neu« klassifiziert, wenn sie noch nicht in der Datenbank von MoneyMoney vorhanden sind. Andernfalls werden sie als Duplikate verworfen. Das Array sollte nach Buchungstag geordnet sein, mit den neuesten Umsätzen vorne. Die Struktur der Array-Elemente ist im Abschnitt »Datenstruktur eines Umsatzes« beschrieben.securities
: Ein Array mit Depotpositionen; Die Struktur der Array-Elemente ist im Abschnitt »Datenstruktur von Wertpapieren« beschrieben.bonusPoints
: Anzahl der Punkte in einem Bonusprogrammsecurities
erwartet, bei allen anderen Konten die Felder balance
/balances
und transactions
. Wenn diese fehlen oder den Wert nil
enthalten, wird in der GUI eine Fehlermeldung angezeigt, dass der Kontostand bzw. die Umsätze bzw. der Wertpapierbestand nicht abgefragt werden konnte.Abmeldung
function EndSession ()
nil
, wenn die Abmeldung erfolgreich war.Vorlage
WebBanking{version = 1.00,
url = "https://moneymoney-app.com/onlinebanking",
services = {"Premium Account"},
description = "Demo"}
function SupportsBank (protocol, bankCode)
return protocol == ProtocolWebBanking and bankCode == "Premium Account"
end
function InitializeSession (protocol, bankCode, username, reserved, password)
-- Login.
end
function ListAccounts (knownAccounts)
-- Return array of accounts.
local account = {
name = "Premium Account",
owner = "Jane Doe",
accountNumber = "111222333444",
bankCode = "80007777",
currency = "EUR",
type = AccountTypeGiro
}
return {account}
end
function RefreshAccount (account, since)
-- Return balance and array of transactions.
local transaction = {
bookingDate = 1325764800,
purpose = "Hello World!",
amount = 42.00
}
return {balance=42.00, transactions={transaction}}
end
function EndSession ()
-- Logout.
end
ListAccounts
wie in der Vorlage statische Informationen zurückgeben lassen. Wenn man dann erst einmal die Funktionen InitializeSession
und EndSession
implementiert hat, kann man sich in Ruhe den Funktionen ListAccounts
und RefreshAccount
widmen.Die API von MoneyMoney
Datenstruktur eines Kontos
name
: Bezeichnung des Kontosowner
: Name des KontoinhabersaccountNumber
: KontonummersubAccount
: Unterkontomerkmalportfolio
: true
für Depots und false
für alle anderen KontenbankCode
: Bankleitzahlcurrency
: Kontowährungiban
: IBANbic
: BICtype
: Kontoart; Mögliche Werte sind AccountTypeGiro
(Girokonto), AccountTypeSavings
(Sparkonto), AccountTypeFixedTermDeposit
(Festgeldanlage), AccountTypeLoan
(Darlehenskonto), AccountTypeCreditCard
(Kreditkarte), AccountTypePortfolio
(Wertpapierdepot), AccountTypeOther
(Sonstige).Datenstruktur eines Umsatzes
name
: Name des Auftraggebers/ZahlungsempfängersaccountNumber
: Kontonummer oder IBAN des Auftraggebers/ZahlungsempfängersbankCode
: Bankzeitzahl oder BIC des Auftraggebers/Zahlungsempfängersamount
: Betragcurrency
: WährungbookingDate
: Buchungstag; Die Angabe erfolgt in Form eines POSIX-Zeitstempels.valueDate
: Wertstellungsdatum; Die Angabe erfolgt in Form eines POSIX-Zeitstempels.purpose
: Verwendungszweck; Mehrere Zeilen können durch Zeilenumbrüche ("\n"
) getrennt werden.transactionCode
: GeschäftsvorfallcodetextKeyExtension
: TextschlüsselergänzungpurposeCode
: SEPA-VerwendungsschlüsselbookingKey
: SWIFT-BuchungsschlüsselbookingText
: UmsatzartprimanotaNumber
: Primanota-NummerbatchReference
: SammlerreferenzendToEndReference
: SEPA-Ende-zu-Ende-ReferenzmandateReference
: SEPA-MandatsreferenzcreditorId
: SEPA-Gläubiger-IDreturnReason
: Rückgabegrundbooked
: Gebuchter oder vorgemerkter UmsatzDatenstruktur von Wertpapieren
name
: Bezeichnung des Wertpapiersisin
: ISINsecurityNumber
: WKNquantity
: Nominalbetrag oder StückzahlcurrencyOfQuantity
: Währung bei Nominalbetrag oder nil
bei StückzahlpurchasePrice
: Kaufpreis oder KaufkurscurrencyOfPurchasePrice
: Von der Kontowährung abweichende Währung des KaufpreisesexchangeRateOfPurchasePrice
: Wechselkurs zum Kaufzeitpunktprice
: Aktueller Preis oder KurscurrencyOfPrice
: Von der Kontowährung abweichende Währung des PreisesexchangeRateOfPrice
: Aktueller Wechselkursamount
: Wert der Depotposition in KontowährungoriginalAmount
: Wert der Depotposition in OriginalwährungcurrencyOfOriginalAmount
: Originalwährungmarket
: Name des BörsenplatzestradeTimestamp
: Notierungszeitpunkt; Die Angabe erfolgt in Form eines POSIX-Zeitstempels.Objekt für eine HTTPS-Verbindung
connection = Connection()
content, charset, mimeType, filename, headers = connection:request(method, url[, postContent, postContentType, headers])
headers
das HTTP-Header-Feld Accept
auf "application/json"
gesetzt werden. Dann wird auch bei einem HTTP-Fehler die Serverantwort im Skript zurückgegeben. Andernfalls wird im Fehlerfall die Ausführung des Skripts abgebrochen und stattdessen in der GUI eine Fehlermeldung angezeigt.
method
: HTTP-Request-Methode; Mögliche Werte sind "GET"
, "POST"
, "PUT"
, "PATCH"
und "DELETE"
.url
: Server-URL; Die URL darf absolut oder relativ sein. Bei der ersten Server-Anfrage muss eine absolute URL angegeben werden. Relative URLs beziehen sich wie üblich auf die gerade aktive, d.h. zuletzt aufgerufene URL.postContent
: Die Daten, die mit einem HTTP-POST-Request an den Server gesendet werden sollenpostContentType
: Der Inhalt des Felds Content-Type
für den HTTP-POST-Headerheaders
: Weitere HTTP-Header-Felder
content
: Daten vom Servercharset
: Der Zeichensatz, mit dem die vom Server gelieferten Daten zu interpretieren sindmimeType
: MIME-Type der vom Server gelieferten Datenfilename
: Dateiname aus dem HTTP-Header-Feld Content-Dispositon
headers
: Vom Server gelieferte HTTP-Header-Felder<meta>
-Tags im HTML-Code herangezogen.content, charset, mimeType = connection:request("POST",
"https://moneymoney-app.com/onlinebanking",
"username=foo&password=bar",
"application/x-www-form-urlencoded; charset=UTF-8")
print(content) -- "<html>\n<head>\n<title>[…]"
print(charset) -- "UTF-8"
print(mimeType) -- "text/html"
html = HTML(connection:request("GET", "https://moneymoney-app.com/onlinebanking"))
content, charset, mimeType = connection:get(url)
connection:request("GET", url)
content, charset, mimeType = connection:post(url, postContent[, postContentType])
connection:request("POST", url, postContent, postContentType)
connection:close()
url = connection:getBaseURL()
url
: Die zuletzt aufgerufene URLconnection:setCookie(cookie)
<meta>
-Tags im HTML-Code extrahiert. Nach der Ausführung des Skripts werden alle Cookies wieder gelöscht.cookie
: HTTP-Cookie; Das Format ist identisch zum Feld Set-Cookie
im HTTP-Header.connection:setCookie("SESSION=foobar; path=/")
cookies = connection:getCookies()
cookies
: HTTP-Cookies; Das Format ist identisch zum Feld Cookies
im HTTP-Header.connection.useragent
User-Agent
für den HTTP-Header. Durch Veränderung dieses Werts lässt sich gegenüber dem Webserver ein bestimmter Browser oder ein mobiles Endgerät simulieren.connection.useragent = "Mozilla/5.0 (compatible; " .. MM.productName .. "/" .. MM.productVersion .. ")"
connection.language
Accept-Language
für den HTTP-Header. Bei manchen Servern lässt sich so die Sprache der Inhalte auswählen. Als Standardwert ist die Sprache des Betriebssystems voreingestellt.connection.language = "de-de"
Objekt für ein HTML-Dokument
html = HTML(content[, charset])
content
: HTML-Codecharset
: Der Zeichensatz, mit dem der HTML-Code zu interpretieren ist. Wenn dieser Parameter fehlt, wird der Zeichensatz aus den <meta>
-Tags extrahiert.elements = html:xpath(query)
query
: XPath-Ausdruck in der XML Path Language Version 1.0; Alle Tag- und Attributsnamen müssen klein geschrieben werden.elements
: Eine Liste von HTML-Elementen, die durch den XPath-Ausdruck ausgewählt wurden. Die Methoden, die auf dieses Objekt angewendet werden können, sind im Abschnitt »Objekt für HTML-Elemente« beschrieben.text = html:html()
text
: HTML-Code
Objekt für HTML-Elemente
count = elements:length()
elements
befinden.count
: Anzahl der HTML-Elementeelements = elements:get(n)
n
-te HTML-Element aus elements
aus.n
: Index des auszuwählenden HTML-Elements; Wie in Lua üblich, beginnt die Indexierung bei 1.elements
: Der Rückgabewert besteht selbst wieder aus einem Objekt für HTML-Elemente. Wenn n
ein gültiger Index ist, enthält elements
das n
-te HTML-Element. Andernfalls ist elements
leer.if elements:get(2):length() == 1 then print "Fnord!" end
elements:each(function (index, element))
elemente
und führt für jedes HTML-Element eine Aktion aus.function (index, element)
: Eine Funktion, die für jedes HTML-Element ausgeführt werden soll. Die Funktion besitzt selbst zwei Parameter:
index
: Index des aktuellen HTML-Elements; Wie in Lua üblich, beginnt die Indexierung bei 1.element
: Dieser Parameter besteht selbst wieder aus einem Objekt für HTML-Elemente und enthält genau ein HTML-Element.func
den Wert false
zurückgibt, wird die Methode each
abgebrochen.elements:each(function (index, element))
print (index .. "=" .. element:text())
end
elements = elements:reverse()
elemente
um.elements
: Der Rückgabewert besteht selbst wieder aus einem Objekt für HTML-Elemente, welches die HTML-Elemente in umgekehrter Reihenfolge enthält.elements = elements:children()
elements
aus.elements
: Der Rückgabewert besteht selbst wieder aus einem Objekt für HTML-Elemente und enthält die HTML-Kindelemente.elements = elements:xpath(query)
elements
aus. Der XPath-Ausdruck query
muss dazu ebenfalls relativ sein, d.h. mit einem Punkt beginnen.query
: Relativer XPath-Ausdruck (beginnend mit einem Punkt) in der XML Path Language Version 1.0; Alle Tag- und Attributsnamen müssen klein geschrieben werden.elements
: Eine Liste von HTML-Elementen, die durch den XPath-Ausdruck ausgewählt wurden.text = elements:text()
elements
und deren Kindelementen befindet.text
: Text, der sich zwischen den HTML-Tags befindet.value = elements:attr(attribute)
elements
zurück.attribute
: Name des Attributsvalue
: Inhalt des Attributselements:attr(attribute, value)
elements
.
attribute
: Name des Attributsvalue
: Neuer Inhalt des Attributsvalue = elements:val()
elements
muss ein Formularfeld sein. Im Gegensatz zur Methode elements:attr("value")
berücksichtigt diese Methode auch das Attribut disabled
und wertet die ausgewählte Option von Auswahllisten (<select>
-Tag) aus.value
: Wert des Formularfeldselements:select(value)
<select>
-Tag) aus. Das erste HTML-Element in elements
muss eine Auswahlliste sein. Im Gegensatz zur Methode elements:attr("selected", "selected")
berücksichtigt diese Methode auch das Attribut disabled
und wählt die übrigen Optionen ab.value
: Ausgewählte Optionmethod, url[, postContent, postContentType] = elements:click()
elements
muss als erstes HTML-Element ein Link (<a href>
-Tag) oder ein Submit-Button (<input type="submit">
-Tag, <button>
-Tag) oder ein Image-Button (<input type="image">
-Tag) vorhanden sein.<input>
-Tags URL-kodiert und entweder als GET-Parameter an die URL angehängt oder als POST-Parameter zurückgegeben.
method
: HTTP-Request-Methode; Mögliche Werte sind "GET"
und "POST"
.url
: Server-URLpostContent
: Die Daten, die mit einem HTTP-POST-Request an den Server gesendet werden sollen.postContentType
: Der Inhalt des Felds Content-Type
für den HTTP-POST-Header.connection:request(elements:click())
method, url[, postContent, postContentType] = elements:submit()
elements
muss als erstes HTML-Element ein Formular (<form>
-Tag) vorhanden sein. Die Werte der <input>
-Tags werden URL-kodiert und entweder als GET-Parameter an die URL angehängt oder als POST-Parameter zurückgegeben. Die Werte von Submit-Buttons (<input type="submit">
-Tag) werden ignoriert, da das Formular ohne Submit-Button generiert wird.
method
: HTTP-Request-Methode; Mögliche Werte sind "GET"
und "POST"
.url
: Server-URLpostContent
: Die Daten, die mit einem HTTP-POST-Request an den Server gesendet werden sollen.postContentType
: Der Inhalt des Felds Content-Type
für den HTTP-POST-Header.connection:request(elements:submit())
Objekt für ein JSON-Dokument
fields = JSON(json):dictionary()
json
: JSON-Dokumentfields
: Lua-Datenstruktur des JSON-Dokumentslua = JSON():set(fields):json()
fields
: Lua-Datenstruktur des JSON-Dokumentsjson
: JSON-Dokument
Objekt für ein PDF-Dokument
text = PDF(pdf):text()
pdf
: PDF-Dokumenttext
: Unformattierter Text
Objekt für Bankinformationen
bankInfo = BankInfo(bankCode)
bankCode
: Bankleitzahlprint(BankInfo("80007777").name)
Datenstruktur für Bankinformationen
name
: Name der Bank
Sonstige Funktionen
str = MM.localizeText(str)
NSLocalizedString
und liefert natürlich nur dann eine Übersetzung, wenn der Text in MoneyMoney hinterlegt worden ist.str
: Englischer Textstr
: Übersetzter Textstr = MM.localizeDate([format, ]date)
NSDateFormatter
auf.
format
(optional): Ausgabeformat; Die Angabe erfolgt wie bei der Cocoa-Klasse NSDateFormatter
nach dem Unicode Technical Standard #35.date
: Datum; Die Angabe erfolgt in Form eines POSIX-Zeitstempels. str
: Datum im lokalisierten Formatstr = MM.localizeNumber([format, ]num)
NSNumberFormatter
auf.
format
(optional): Ausgabeformat; Die Angabe erfolgt wie bei der Cocoa-Klasse NSNumberFormatter
nach dem Unicode Technical Standard #35.num
: Zahlstr
: Zahl im lokalisierten Formatstr = MM.localizeAmount([format, ]amount[, currency])
format
(optional): Ausgabeformat; Die Angabe erfolgt wie bei der Cocoa-Klasse NSNumberFormatter
nach dem Unicode Technical Standard #35.amount
: Betragcurrency
(optional): Währung; Ohne diesen Parameter wird nur der Betrag ohne Währungsangabe zurückgegeben.str
: Währungsbetrag im lokalisierten Formaturlencoded = MM.urlencode(str, [charset])
str
: Zu kodierender Textcharset
(optional): Zeichensatz; Die Angabe erfolgt wie bei HTTP nach IANA. Ohne diesen Parameter wird ISO-8859-1 verwendet.urlencoded
: URL-kodierter Text.str = MM.urldecode(urlencoded)
urlencoded
: URL-kodierter Text.str
: Text ohne URL-Kodierung.data = MM.toEncoding(charset, str[, bom])
charset
: Zeichensatz; Die Angabe erfolgt wie bei HTTP nach IANA.str
: Text in UTF-8bom
(optional): Wenn dieser Parameter mit true
belegt ist, wird der Rückgabewert um eine Byte Order Mark (BOM) ergänzt, sofern sie für den angegeben Zeichensatz existiert.data
: Text im angegebenen Zeichensatzstr = MM.fromEncoding(charset, data)
charset
: Zeichensatz; Die Angabe erfolgt wie bei HTTP nach IANA.data
: Text im angegebenen Zeichensatzstr
: Text in UTF-8encoded = MM.base64(data)
data
: Zu konvertierende Datenencoded
: Base64-kodierte Datendata = MM.base64decode(encoded)
encoded
: Base64-kodierte Datendata
: konvertierte Datendigest = MM.sha512(data)
digest = MM.sha256(data)
digest = MM.sha1(data)
digest = MM.md5(data)
data
: Daten, über die der Hashwert berechnet werden soll.digest
: Hashwert als hexidezimaler Stringdigest = MM.hmac512(key, data)
digest = MM.hmac384(key, data)
digest = MM.hmac256(key, data)
digest = MM.hmac1(key, data)
key
: HMAC-Schlüsseldata
: Daten, über die der Message Authentication Code berechnet werden soll.digest
: Message Authentication Code als binärer Stringtimestamp = MM.time()
os.time()
enthält der Rückgabewert auch Millisekunden als Nachkommestellen.timestamp
: Aktuelle Uhrzeit in Form eines POSIX-Zeitstempels.MM.sleep(seconds)
seconds
: Anzahl der SekundenMM.printStatus(...)
print
: Die Parameter werden mittels der Lua-Funktion tostring
zu einem String konvertiert und im Protokoll-Fenster von MoneyMoney angezeigt. Zusätzlich wird der String als Statusmeldung in der GUI angezeigt.