faiteanu / JavaStockQuotes

Java library for fetching historical stock quotes.
Other
11 stars 5 forks source link

Ariva kaputt für ausgewählte Werpapiere #3

Closed Stullemon closed 5 months ago

Stullemon commented 1 year ago

Hallo, beim Versuch die Kurse für ein Wertpapier (WKN: 919730 ISIN: CH0012221716) zu aktualisieren habe ich einen Fehler bemerkt. Nachdem ich zunächst auf die letzte Version der Ariva.js (siehe https://github.com/faiteanu/JavaStockQuotes/commit/443a17379fff10468a505f5129d034aa00720199 ) aktualisiert habe verschwand der erste Fehler, wurde dafür aber durch die Fehlernachricht Character   is neither a decimal digit number, decimal point, nor "e" notation exponential mark. ersetzt. Ich habe ein wenig rumprobiert, finde aber keine Lösung.

Stullemon commented 1 year ago

Ich habe weiter rumprobiert. Wenn ich folgende Zeile in ariva.js text = webClient.getPage(histUrl) in text = webClient.getPage(histUrl).replace(/[^\x00-\x7F]/g, ''); ändere, dann verschwindet die obige Fehlermeldung, aber es kommt in Jameica trotzdem noch ein Hinweis, dass es einen Fehler beim Abruf der Kurse gab. Die Idee wäre, dass wir einfach "merkwürdige" Zeichen (non-ASCII) so schnell wie möglich weggeschmissen werden.

Auffällig ist, dass nun zwar neuere Kursinformationen vorliegen, zugleich aber nur eine Spalte gefüllt ist, und eine Spalte leer ist, wenn man im DepotViewer unter Wertpapiere den Reiter Kurse auswählt. Bei anderen Wertpapieren werden immer zwei Spalten mit identischen Werten angezeigt.

Ich habe mir das Sonderzeichen auch mal angesehen. Laut Excel ist es Zeichen UNICODE bzw. ASCII 160. Die CSV sieht sauber aus, wenn ich sie direkt runterlade. Es bleibt auch bislang das einzige Wertpapier, welches betroffen ist.

faiteanu commented 1 year ago

Hallo, das Verhalten kann ich reproduzieren. Allerdings liegt die Ursache nicht bei den Kursen an sich, sonden bei den abgerufenen Ereignissen. Die siehst du hier: https://www.ariva.de/abb-aktie/dividende-split/ Bei Ereignissen wie Splits müssen alle vorherigen Kurse mit dem in Spalte Verhältnis oder Betrag angegebenen Faktor multipliziert werden, weil sich gleichzeitig die Anzahl der Wertpapiere im Depot um den Kehrwert verändert. Dadurch bleibt der Wert insgesamt identisch.

Bei ABB gibt es nun am 03.10.22 ein Event "Allg. Korrektur", bei dem weder ein Verhältnis noch ein Betrag eingetragen ist. Der Parser kommt damit nicht zurecht. Anscheinend ist diese Konstellation noch nie bei irgendeinem Wertpapier aufgefallen. Mein Vorschlag wäre, dass wir so ein Event ohne Zahlenangaben ignorieren. Einverstanden?

Stullemon commented 1 year ago

Hi, das war auch meine ursprüngliche Vermutung. Leider waren meine Versuche genau diesen Ausschluss zu machen nicht erfolgreich - aber ich kann auch nicht wirklich JS. Insofern klingt das für mich nach einer sauberen Lösung.

Das Event war eine Wertberichtigung infolge eines Spin-offs. Die sollte sich im Kurswert widerspiegeln und Aktionäre haben anteilig Aktien des Spin-offs erhalten, so dass es idealerweise im Portfolio keinen nennenswerten Unterschied machen sollte.

Stullemon commented 1 year ago

Hi, wollte mal nachfragen, wie es mit dem Fix aussieht? Sehe bisher noch nichts in den Commits und mein eigenes Gebastle wirkt nicht so von Erfolg gekrönt...

faiteanu commented 1 year ago

Hallo, aus verschiedenen Gründen war ich bisher nicht dazu gekommen, einen Fix einzubauen. Wie mir scheint, hat Ariva allerdings kürzlich den CSV-Abruf von Kursdaten abgeklemmt. Unten auf der Seite steht "Sie brauchen die historischen Kursdaten als CSV? Dann legen Sie sich jetzt ein ARIVA Konto an oder melden Sie sich an." Da müssten neben der ariva.js auch Teile des DepotViewers umprogrammiert werden, so dass Benutzerkonten für den Kursabruf verwaltet werden können.

Ansonsten war Ariva.de die letzte mir bekannte Quelle für kostenlose Kursdaten. Finanzen.net und Yahoo funktionieren schon länger nicht mehr.

Stullemon commented 1 year ago

Hi, da ist keine Entschuldigung nötig (falls das so gemeint war).

Das mit dem Abruf über Avira ist mir auch schon aufgefallen. Werde mal dort die Issues durchsehen und ggf. einen neuen dort erstellen. Mittlerweile glaube ich eh, dass das fehlerhafte Event irgendwas in meiner Datenbank zerstört hat. :-/

MHoeller commented 1 year ago

Hallo zusammen, ich versuche den / die o.g. Fehler nachzustellen da auch ich am Ende keine Kurse mehr aktualisieren kann. Bis zu dem vermutlich entscheidenden Punkt, dass man sich für den csv Download anmelden muss bin ich noch gar nicht vorgedrungen..

Nutze ich den code im Original page = webClient.getPage(url + "/search/livesearch.m?searchname=" + search); so bekomme ich folgende Fehlermeldung:

[Sun Feb 26 23:28:51 CET 2023][DEBUG][bg-task:UpdateStock][jdk.nashorn.internal.scripts.Script$Recompilation$63$628AAAAAAAA$\^eval\_.prepare] >>>>>url<<<<http://www.ariva.de/
[Sun Feb 26 23:28:51 CET 2023][DEBUG][bg-task:UpdateStock][jdk.nashorn.internal.scripts.Script$Recompilation$63$628AAAAAAAA$\^eval\_.prepare] >>>>>search<<<<LU0950674761
[Sun Feb 26 23:28:51 CET 2023][DEBUG][bg-task:UpdateStock][jdk.nashorn.internal.scripts.Script$Recompilation$63$628AAAAAAAA$\^eval\_.prepare] >>>>>page<<<<com.gargoylesoftware.htmlunit.TextPage@beb57cc
[26.02.2023 23:31:56] Starte mit LU1681046857
[26.02.2023 23:31:58] [Handelsplatz: [Düsseldorf, Frankfurt, München, Xetra, L&S RT, Stuttgart (EUWAX), SIX Swiss Exchange, Tradegate, Quotrix, Fondsgesellschaft, Gettex] / [Düsseldorf]]
[26.02.2023 23:31:59] Speichern
[26.02.2023 23:31:59] Fehler beim Abruf der Kurse.

Passe ich den url für den search so an wie er auf der Webseite verwendet wird: page = webClient.getPage(url + "/search/search.m?searchname=" + search); dann erhalte ich folgende Fehlermeldung, aber auch eine gültige URL.

[Sun Feb 26 23:30:27 CET 2023][DEBUG][bg-task:UpdateStock][jdk.nashorn.internal.scripts.Script$Recompilation$35$628AAAAAAAA$\^eval\_.prepare] >>>>>url<<<<http://www.ariva.de/
[Sun Feb 26 23:30:27 CET 2023][DEBUG][bg-task:UpdateStock][jdk.nashorn.internal.scripts.Script$Recompilation$35$628AAAAAAAA$\^eval\_.prepare] >>>>>search<<<<LU1681046691
[Sun Feb 26 23:30:29 CET 2023][DEBUG][bg-task:UpdateStock][jdk.nashorn.internal.scripts.Script$Recompilation$35$628AAAAAAAA$\^eval\_.prepare] >>>>>page<<<<HtmlPage(https://www.ariva.de/etf/ais_am_g_h_e_b_i_g_eoc?utp=1)@1422865038
[26.02.2023 23:30:27] Starte mit LU1681046691
[26.02.2023 23:30:29] TypeError: page.getContent is not a function in <eval> at line number 54
[26.02.2023 23:30:29] Fehler beim Abruf der Kurse.

Zeile 54 ist bei mir: var link = page.getContent().match(/<a href="([^"]+)"/);

Der Fehler scheint durch das .match() zu entstehen.
Ist das nun ein neuer Fehler? Könnt Ihr Euch einen Reim draus machen?

Viele Grüße Michael

Stullemon commented 1 year ago

Ich glaube mittlerweile, dass mein ursprünglicher Fehler war, dass ich die aktuelle Version hier genommen habe, die für "Allg. Korrekturen" vorbereitet war, die bei o.g. Wertpapier aber nicht richtig formatiert war und die fehlerhaften Daten dennoch in die Datenbank eingetragen wurden. Ich habe mich dann kürzlich entschlossen die DB aus einem älteren Backup wiederherzustellen - Fehler ist nun weg.

Bezüglich login: Ich habe mir mittlerweile in Power Automate Desktop einen Flow entwickelt, mit dem ich über CSV Downloads aktualisieren kann. Ist ein zartes Pflänzchen und dauert recht lang. In jedem Falle ist es aber so, dass ich im Browser ein Mal einloggen (natürlich vorher Konto angelegt) muss und dann funktionieren auch die CSV updates. Ob und wie man über den Web Scraper einen Login realisieren kann entzieht sich meiner Kenntnisse und Fähigkeiten. Vermutlich ja, nur keine Ahnung wie... In jedem Falle funktioniert der Seitenaufruf einzelner Wertpapiere im Browser über PAD zuverlässig. Sieht bei mir so aus: https://www.ariva.de/search/search.m?searchname=%ISIN%

MHoeller commented 1 year ago

Hallo @Stullemon das klingt ja ganz gut.

Dieses muss man aber auch wenn man das Ganze per Datei macht, erledigst du diese vielen Klicks mit PAD oder hast du einen Trick gefunden diese zu umgehen?

Stullemon commented 1 year ago

Hallo, mein ursprünglicher Fehler scheint nur das o.g. Wertpapier zu betreffen. Das ist unabhängig von dem "Download ohne Login" Fehler.

Zum Download Fehler: So sieht es ohne Login aus: Download ohne Login Den Button kann man nicht klicken.

So mit Login: Download mit Login Den Button kann man klicken und hinter dem versteckt sich letztlich der Link, der im Ariva.js zusammgebaut wird. Entsprechend muss irgendwo her die Login Information zugeordnet werden, damit Ariva "die Tür aufmacht".

Dahingehend könnte ich theroetisch die Downloads auch ohne Aufruf der eigentlichen Wertpapierseiten in PAD automatisieren. Ich tue es nicht, weil ich auf dem aktuellen Weg (Seitenaufruf, Selektionen machen, Download ausführen mit Auswahl des Zielorts) alles Weitere zum Einlesen der Dateien besser steuern kann.

Ich habe deinen Ansatz allerdings auch noch nicht ganz verstanden. Rufst du die Seite auf und scrapest die jetzt direkt, weil der CSV-Download nicht mehr funktioniert? Das würde ja aber nur für die letzten 30 Tage oder monatsweise funktionieren oder? Wenn du es so machst, dann denke ich aber schon, dass es klappt über die URL. Hier mal eine beispielhadfte URL.

https://www.ariva.de/_abb-aktie_/kurse/historische-kurse?go=1&**boerse_id=123&month=2023-02-28&currency=&clean_split=1&clean_bezug=1**

Man müsste die relevante Wertpapierseite (kursiv) halt nur korrekt raussuchen, bevor man die Seite aufruft. Ich denke das müsste dann wiederum mit der o.g. https://www.ariva.de/search/search.m?searchname=%ISIN% Adresse funktionieren.

Alles in allem ist aber das Problem, dass man nicht mehr die CSV als solches rauskriegt und daher entweder auf Webseiten Scraping (mehrere Monate?!) oder auf Login umstellen muss.

MHoeller commented 1 year ago

Hallo Initial hatte ich vor über wget oder curl die Daten über ein Script herunterzuladen, die login Infos müssten dort als parameter übertragbar sein. Den Ansatz habe ich aber verworfen nachdem ich unter "Aktualisierungen (Einstellungen wählen)" die option gefunden habe: "CSV Import (via URL)" gefunden habe. In den folgenden Dialogen kannst du eine Download URL und das import Schema hinterlegen. Hier ein Beispiel URL, die Zeiträume kann man über parameter steuern, wobei ich das Jahr des Starts schlicht fest übergebe: https://www.ariva.de/quote/historic/historic.csv?secu=4701&boerse_id=207&clean_split=1&clean_payout=1&clean_bezug=1&min_time=${day}.${month}.2022&max_time=${day}.${month}.${year}&trenner=%3B&go=Download

Den URL habe ich manuell rausgesucht...

Dieser Teil funktioniert einwandfrei. Ärgerlich ist das bei einem zweiten Aufruf immer wieder ale Parameter bestätigt werden müssen. Ich hoffe ich finde noch die Stelle an der ich das unterbinden kann. Der Login ist nachwievor nötig,, muss aber nur einmal gemacht werden vor dem ersten Aufruf des Downloads der csv. I Moment kämpfe ich noch damit dass zwar alle Kurse korrekt in der Datenbank stehen aber die Salden nicht erneut berechnet wurden.

Somit steht auf meinem Plan

  1. Verstehen wann die Salden aktualisiert werden
  2. Sicherstellen das nun wieder die Salden berechnet werden
  3. Vermeiden dass das bei jedem Abruf die Werte erneut bestätigt werden
faiteanu commented 1 year ago

Hallo!

Alles in allem ist aber das Problem, dass man nicht mehr die CSV als solches rauskriegt und daher entweder auf Webseiten Scraping (mehrere Monate?!) oder auf Login umstellen muss.

Genau das scheinen die Optionen zu sein. Jedoch ist beides auch mit einigem Programmieraufwand verbunden, für den ich aktuell keine Zeit habe.

Für den Login müsste man zumindest folgendes machen, evtl. auch mehr: Im Depotviewer eine Tabelle anlegen, um Benutzername und Passwort pro Dienst zu speichern, wobei Ariva ein Dienst wäre. Man sollte nicht für jedes einzelne Wertpapier Benutzer und Passwort speichern, sonst ist das äußerst umständlich zu benutzen. (Ich habe ca. 30 verschiedene Wertpapiere.) Im Depotviewer eine entsprechende Ansicht bauen, um die Daten pflegen zu können. Evtl. in den Dialog "Aktualisieren (Einstellung ändern)" mit aufnehmen. Aber darauf achten, dass manche Dienste auch ohne Benutzer und Passwort verwendet werden können, zB. CSV-Import. Die Schnittstelle zu JavaStockQuotes ändern, so dass optional auch Benutzer und Passwort übergeben werden. Im Ariva.js zuerst die Login-Seite aufrufen, Benutzer und Passwort aus den Parametern auslesen und per Skript in die Webseite eintragen, dann den Login-Button anklicken. Anschließend kann der CSV-Abruf vermutlich wie bisher auch erfolgen. Vermutlich muss man noch berücksichtigen, dass der Login nur beim ersten Wertpapier erfolgt. Es können aber mehrere Wertpapiere pro Session abgerufen werden.

Alternative für das Webseiten-Scraping: man könnte mit einer Schleife durch die letzten Monate laufen. Dann jeweils das Monats-Auswahlfeld auf den Monat setzen. Anschließend mit einer Schleife durch die einzelnen Zeilen der Tabelle laufen und alle Werte auslesen.

@MHoeller: Die Salden werden einfach immer aktualisiert, sobald du eine Synchronisierung deines Depots über HBCI machst. Die Bank überträgt den Saldo des Kontos beim Abruf der Bestände: https://github.com/littleyoda/hibiscus.depotviewer/blob/e8ab7cf2313eb39df8da666f265b20cac0611320/src/de/open4me/depot/hbcijobs/HBCIDepotBestandJob.java#L150

Den aktuellen Saldo für jede einzelne Buchungszeile berechnet DepotViewer beim Abruf der Depot-Umsätze: https://github.com/littleyoda/hibiscus.depotviewer/blob/e8ab7cf2313eb39df8da666f265b20cac0611320/src/de/open4me/depot/tools/UmsatzHelper.java#L86-L88 Das funktioniert aber nur, falls für jedes am Stichtag vorhandene Wertpapier auch ein Kurs ermittelt werden kann.

Vermeiden dass das bei jedem Abruf die Werte erneut bestätigt werden

Hier solltest du trotzdem darauf achten, dass der Benutzer nachvollziehen kann, was genau abgerufen wird, und er das auch leicht korrigieren kann. min_time sollte ja nicht für zu lange Zeit identisch bleiben, sonst werden jedes Mal wieder die gleichen Daten abgerufen und überschrieben.

MHoeller commented 1 year ago

Hallo, @faiteanu besten Dank für die Vorschläge, sehe ich analog. Da ich nun so gar nicht in der Java-Welt programierend unterwegs bin kann ich das nicht implementieren und bin deshalb auf der Suche nach einem Workaround, der (wie immer nicht die Lösung darstellen soll...) Was das Login angeht, so bin ich noch irritiert. Warum kann man:

Bzgl. der Aktualisierung der Salden: das muss ich mir nochmal genauer ansehen. Ich hatte für einen Test die automatisch angelegten Umsätze gelöscht und per HBCI abgeholt. Eine Bank unterstützt nur die Option Bestände per HBCI abholen, eine andere unterstützt alle Optionen. Salden werden allerdings nirgendwo aktualisiert.

Hier solltest du trotzdem darauf achten, dass der Benutzer nachvollziehen kann, was genau abgerufen wird, und er das auch >leicht korrigieren kann. min_time sollte ja nicht für zu lange Zeit identisch bleiben, sonst werden jedes Mal wieder die gleichen >Daten abgerufen und überschrieben.

Wäre m.E. gegen da das Datum des letzten Kurses gut sichtbar in der Ansicht ist. 30 mal mit ca. 5 Klicks jeweils den Kurs zu bestätigen ist nicht wirklich benutzerfreundlich, daher wäre die Option dieses zu unterdrücken beim Aufruf über die Option "Aktualisieren" m.E. die Lösung da beim Einrichten diese weiter bestehen würde. Die Option "Einrichten" wäre auch der Weg um Fehler schnell zu finden und die Sichtbarkeit wäre über das letzte Datum gegeben.

MHoeller commented 1 year ago

Das die Salden nicht aktualisiert wurden muss an meinem manuellen Eingriff gelegen haben. Nachdem ich die Depots gelöscht und neu hinzugefügt habe funktioniert der Prozess.

MHoeller commented 1 year ago

Hallo zusammen, ich habe es nun ein paar Tage probiert: Kennt man die URL dann ist die Anmeldung nicht nötig. Ruft mal diese URL auf OHNE angemeldet zu sein: https://www.ariva.de/quote/historic/historic.csv?secu=102535008&boerse_id=12&clean_split=1&clean_payout=1&clean_bezug=1&min_time=${day}.${month}.2022&max_time=${day}.${month}.${year}&trenner=%3B&go=Download klar das manuelle ermitteln der URL ist nicht gerade benutzerfreundlich und schon gar nicht eine Lösung aber es tut... Wenn einer vor Euch der es JAVA mächtig ist mir verraten kann wie ich bei der Aktualisierung umgehen kann dass ich immer das Format prüfen kann (das geschieht ja schon beim Einrichten) dann wäre der Workaround sogar tragbar. Aktuell sind das noch 5 clicks pro Papier, das nervt... Wär super wenn Ihr da helfen könntet

KarlHeesch commented 1 year ago

Hallo allerseits,

ich habe eine Kopie von ariva.js als ariva_hotfix.js erstellt, in der ich ein Paar Zeilen geändert habe. Bei mir scheint damit das Laden der historischen Kurse zu klappen. Ich bin mir nicht sicher, ob dies bei allen Wertpapierarten klappt, also bitte mit Vorsicht genießen.

Einfach die Datei ariva_hotfix.js extrahieren und in das entsprechende Verzeichnis .../hibiscus.depotviewer/js/ kopieren. Eventuell Hibiscus neu starten und beim Aktualisieren (Einstellung wählen) den Anbieter _Arivahotfix wählen.

ariva_hotfix.zip

Viele Grüße Kalle

MHoeller commented 1 year ago

Danke Kalle, der hotfix funktioniert. Deutlich angenehmer als die variante die ich bisher genutzt habe (s.o.) Michael

faiteanu commented 1 year ago

Hallo @KarlHeesch,

danke für den Fix! Ich bin etwas überrascht, dass der Abruf ohne Login funktioniert. Ich würde vermuten, dass Ariva das demnächst noch ändert. Aber warten wir es mal ab.

Ich war so frei, deinen Hotfix in die ariva.js zu übernehmen und den Namen bei Ariva zu belassen, damit die Benutzer leichter ein Update machen können. Im Quellcode und auf https://faiteanu.github.io/JavaStockQuotes/ bist du nun in den Credits benannt.

Viele Grüße, Fabian

faiteanu commented 1 year ago

Das eigentliche Problem dieses Tickets wurde gar nicht behoben, wie mir gerade auffällt...

KarlHeesch commented 1 year ago

Freut mich, Deine Beiträge hatten mich dazu inspiriert. Der Dank geht also zurück.

On Tue, 21 Mar 2023 15:14:22 -0700 Michael Höller @.***> wrote:

Danke Kalle, der hotfix funktioniert. Deutlich angenehmer als die variante die ich bisher genutzt habe (s.o.) Michael

KarlHeesch commented 1 year ago

Hallo Fabian,

freut mich, helfen zu können. Ja, diese Lösung steht auf tönernen Füßen.

Viele Grüße, Kalle

On Tue, 21 Mar 2023 16:09:49 -0700 Fabian Aiteanu @.***> wrote:

Hallo @KarlHeesch,

danke für den Fix! Ich bin etwas überrascht, dass der Abruf ohne Login funktioniert. Ich würde vermuten, dass Ariva das demnächst noch ändert. Aber warten wir es mal ab.

Ich war so frei, deinen Hotfix in die ariva.js zu übernehmen und den Namen bei Ariva zu belassen, damit die Benutzer leichter ein Update machen können. Im Quellcode und auf https://faiteanu.github.io/JavaStockQuotes/ bist du nun in den Credits benannt.

Viele Grüße, Fabian

Stullemon commented 1 year ago

Das eigentliche Problem dieses Tickets wurde gar nicht behoben, wie mir gerade auffällt...

Leider ist das der Fall. Ich habe es gerade mal probiert. Dazu habe ich die Änderungen aus Commit 443a173 bzgl. Allg. Korrektur und Ratio zurück gebaut (damit nichts schief geht). Im Ergebnis steht nun dieser Fehler bei der ABB Aktie: [28.03.2023 16:39:29] Speichern [28.03.2023 16:39:29] class jdk.nashorn.internal.runtime.Undefined cannot be cast to class java.lang.String (jdk.nashorn.internal.runtime.Undefined is in module jdk.scripting.nashorn of loader 'platform'; java.lang.String is in module java.base of loader 'bootstrap') [28.03.2023 16:39:29] Fehler beim Abruf der Kurse.

Auf jeden Fall kudos an Karl für den Fix!

Stullemon commented 5 months ago

Hi @faiteanu , ich habe mal mein Glück versucht. Zumindest läuft die Aktualisierung wieder bei mir durch. Ich weiß aber ehrlicherweise nicht, ob ich einfach alle Events ignoriere. Weiß aber auch nicht, wie ich das sinnvoll prüfen kann. ;-) Wie dem auch sei, sieh es dir doch mal an: https://github.com/faiteanu/JavaStockQuotes/pull/7

faiteanu commented 5 months ago

Hi @Stullemon, danke für den PR. Bei mir läuft die ABB Aktie damit durch, also scheint es zu funktionieren. Falls etwas anderes dadurch kaputt gegangen ist, wird sich bestimmt jemand melden :-) Viele Grüße, Fabian