Skip to content
This repository has been archived by the owner on Feb 19, 2021. It is now read-only.
/ ffb.depot.client Public archive

Ein Java-Client für FFB-Depots. Features: Stammdaten und Depotbestände abholen, Depotperformance ermitteln.

License

Notifications You must be signed in to change notification settings

bmarwell/ffb.depot.client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

License Build Status codecov Codacy Badge Codacy Badge Maven Central Javadocs

ffb.depot.client

Ein Java-Client für FFB-Depots. Features: Stammdaten und Depotbestände abholen. Es war ursprünglich eine Scraping-Library für die FFB, die aus dem Projekt Hibiscus FFB-Depot entstanden ist. Inzwischen verwendet sie das mobile JSON-Interface von Fidelity.

(English) This used to be a FFB scraping library written in Java. Since there is now a mobile HTTP-JSON-Interface, the project switched to this kind of implementation. It is used in the Hibiscus FFB Depot-Project (see link above).

Features

  • Holen von Depotinformationen (Depotbesitzer, Depotnamen, -bestände, etc.).
  • Auslesen der Depotperformance seit Einstand (Gesamtperformance aller Depots).
  • Auslesen der Bestände jedes einzelnen Depots.
  • TODO: Posteingang.
  • TODO: Historische und offene Umsätze.

Nutzung

Zunächst sollte eine PIN und eine Loginkennung erstellt werden:

/* testlogin der FFB */
FfbLoginKennung LOGIN = FfbLoginKennung.of("22222301");
FfbPin PIN = FfbPin.of("91901");

Mit diesen Logindaten lässt sich ein Client erstellen. Dann führt man ein Login aus und holt sich die gewünschten Daten.

FfbMobileClient mobileAgent = new FfbMobileClient(LOGIN, PIN);
mobileAgent.logon();
// Value-Objekte.
MyFfbResponse accountData = mobileAgent.fetchAccountData();
FfbPerformanceResponse performance = mobileAgent.getPerformance();

Da eine Loginkennung mehrere Depots enthalten kann (teilweise eine Depotnummer mehrfach), lassen sich die Gesamtbestände einfach mit der Utils-Klasse ermitteln:

FfbDepotNummer depotNummer = FfbDepotNummer.of("222223"); // Login ohne -01.
BigDecimal gesamtBestand = FfbDepotUtils.getGesamtBestand(accountData, depotNummer);

Hinergrund zu den Depotnummern: Es kann mehrere Depots mit der selben Depotnummer geben: Einmal ein Standard-Depot, und einmal ein VL-Depot. Eine Loginkennung kann aber auch ggf. auf mehrere Depots zugreifen.

Nutzungshinweise

(German) Das Protokoll ist von der FFB nicht offiziell freigegeben. Zum Sniffen habe ich die App Packet Capture für Android genutzt.

(English) The protocol is neither documented or officially released. For sniffing I used packet capture for android, see link above.

Protokollqualität (Quality of the protocol)

(German) Das Protokoll ist furchtbar schlecht designed. Es besitzt außer https (tls) keine Transportsicherheit. Einige Felder fallen je nach anderen Feldern weg, oder sie nutzen oft den falschen Datentyp (gestringte Felder). Das sind typische Fehler einer eigenen Protokollentwicklung. Man hätte natürlich auch einfach HBCI/FinTS nutzen können, womit man auch XML-Signaturen etc. hätte nutzen können.

Die Stringifizierung der Daten wird mittels Jackson Deserializer wieder rückgängig gemacht. Derzeit werden Geldbeträge in BigDecimal gewandelt. Ein eigener Datentyp inkl. Währung wäre ebenfalls möglich.

(English) The protocol is awful. It does not have transport security other than relying on https (tls). Most datatypes were stringified (booleans, floats, dates, etc.). This is a problem when you design your own protocols. There is FinTS (famous among german banks) which uses XML Signatures etc.

Stringification is being reversed using Jackson Deserializers. Money amounts are converted to BigDecimal instances. It would also be possible to convert to it's own datatype, including currency.

HTTPS protocol

The bank is not very trustworthy. It does offer the obsolete TLS 1, but no HTTP2.0 nor SPDY. On the other hand, triple DES ciphers are allowed, they are probably vulnerable to Secure Client-Initiated Renegotiation, to BREACH and BEAST (DES-CBC3-SHA).

$ testssl.sh -p www.fidelity.de
--> Testing protocols (via sockets except TLS 1.2 and SPDY/NPN)

 SSLv2      not offered (OK)
 SSLv3      not offered (OK)
 TLS 1      offered
 TLS 1.1    not offered
 TLS 1.2    offered (OK)
 SPDY/NPN   not offered

Protokoll

Das Protokoll basiert auf dem Mobile-Protokoll der FFB-App. Es verwendet Cookies für Session-Informationen und gibt bei bestimmten GET-Requests einfach JSON-Responses aus.

Login

ParameterContent
URL https://www.fidelity.de/de/mobile/MyFFB/account/userLogin.page
Methode POST
Request-Body login=*user*&password=*passwort*
Header
Accept: application/json; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Language: en-GB,en-US,en;q=0.8
Accept-Encoding: gzip,deflate
Accept-Charset: utf-8;q=0.7,*;q=0.3
X-Requested-With: ffb.depot.client
User-Agent: ffb.depot.client
Cache-Control: no-cache
Pragma: no-cache
Origin: file:https://
Response-Body
{
  "loggedIn": "true",
  "username": "Firstname Lastname",
  "firstname": "Firstname",
  "lastname": "Lastname"
  "usertype": "Customer",
  "ZustimmungNutzungsbedingungenFFS": "".
  "errormessage": ""
}

Depotübersicht

ParameterContent
URL https://www.fidelity.de/de/mobile/MyFFB/account/MyFFB.page
Methode GET
Header
Accept: application/json; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Language: en-GB,en-US,en;q=0.8
Accept-Encoding: gzip,deflate
Accept-Charset: utf-8;q=0.7,*;q=0.3
X-Requested-With: ffb.depot.client
User-Agent: ffb.depot.client
Cache-Control: no-cache
Pragma: no-cache
Origin: file:https://
Response-Body
{
  "login": "true",
  "modelportfolio":
    false
    ,
  "letztesUpdate": "",
  "gesamtwert": "1.234,56",
  "depots": [
    {
      "depotname": "Standard-Depot",
      "depotnummer": "1234567890",
      "bestand": "1.234,56",
      "fondsbestaende"  : [
        {
          "wkn"           : "847512",
          "isin"            : "DE0008475120",
          "fondsname"         : "Allianz Informationstechnologie ",
          "fondswaehrung"       : "EUR",
          "bestandStueckzahl"     : "132,633",
          "bestandWertInFondswaehrung"  : "22.758,50",
          "bestandWertInEuro"     : "22.758,50",
          "ruecknahmepreis"     : "171,59",
          "preisDatum"        : "05.08.2016",
          "benchmarkName"       : "MSCI ACWI/INFORMATION TECH STRD USD"
        },
        {..}
      ]
    }
  ]
}
Anmerkdungen Hier wird bislang nur ein Ausschnitt der Daten gezeigt.

Depotperformance

ParameterContent
URL https://www.fidelity.de/de/mobile/MyFFB/account/performance.page
Methode GET
Header
Accept: application/json; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Language: en-GB,en-US,en;q=0.8
Accept-Encoding: gzip,deflate
Accept-Charset: utf-8;q=0.7,*;q=0.3
X-Requested-With: ffb.depot.client
User-Agent: ffb.depot.client
Cache-Control: no-cache
Pragma: no-cache
Origin: file:https://
Response-Body
{
  "login"                   : "true",
  "performanceGesamt"       : "22,67",

"performanceDurchschnitt" : "7,93",

"ersterZufluss" : "22.01.1991", "errormessage" : "" }

Anmerkungen Die Ausgabe erfolgt "pretty printed" und mit eigentlich unnötigen, sogar doppelten Zeilenumbruechen. Das Datum ist irrsinnigerweise nicht per ISO 8601, sondern im Deutschen Datumsformat angegeben. Ach die Prozentbeträge verwenden das international unübliche Komma als Dezimaltrennzeichen. Die Begriffe Zufluss, Durchschnitt und Gesamt sind Deutsche Begriffe, während die restlichen Begriffe englisch sind (login, performance, error, message).

Logout

ParameterContent
URL https://www.fidelity.de/de/mobile/account/logout.page
Method GET
Header
Accept: application/json; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Language: en-GB,en-US,en;q=0.8
Accept-Encoding: gzip,deflate
Accept-Charset: utf-8;q=0.7,*;q=0.3
X-Requested-With: ffb.depot.client
User-Agent: ffb.depot.client
Cache-Control: no-cache
Pragma: no-cache
Origin: file:https://
Response-Body none
Additional information Cookie should probably be deleted by hand.