„JSON invalid value“ bei Deka-Kurs von 1956

Hallo zusammen,

ich versuche gerade die Kurse von der Deka-Seite als JSON Kursquelle zu konfigurieren. Das hat auch bei einem anderen Fonds gut geklappt, bei dem folgenden klappt es leider aber nicht:

https://www.deka.de/site/privatkunden_site/wertentwicklung/12843335/index.html?assetcategory=10&isin=DE0008474503&action=preisentwicklung

image

Der Fehlerstack sagt, dass die ersten Werte scheinbar außerhalb des gültigen Bereichs liegen. Erster Wert im JSON ist nämlich -413298000000 (also 26. November 1956, epochtime), PP kann aber als kleinsten/frühesten Wert den -365243219162 (also 5. June 1958) verarbeiten.

Fehlerstack:

Mon May 30 21:42:33 CEST 2022
Invalid value for EpochDay (valid values -365243219162 - 365241780471): -413298000000

java.time.DateTimeException: Invalid value for EpochDay (valid values -365243219162 - 365241780471): -413298000000

	at java.base/java.time.temporal.ValueRange.checkValidValue(Unknown Source)

	at java.base/java.time.temporal.ChronoField.checkValidValue(Unknown Source)

	at java.base/java.time.LocalDate.ofEpochDay(Unknown Source)

	at java.base/java.time.LocalDateTime.ofEpochSecond(Unknown Source)

	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.parseDateTimestamp(GenericJSONQuoteFeed.java:363)

	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.extractDate(GenericJSONQuoteFeed.java:330)

	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.parse(GenericJSONQuoteFeed.java:249)

	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getHistoricalQuotes(GenericJSONQuoteFeed.java:155)

	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.previewHistoricalQuotes(GenericJSONQuoteFeed.java:83)

	at name.abuchen.portfolio.ui.wizards.security.HistoricalQuoteProviderPage$LoadHistoricalQuotes.run(HistoricalQuoteProviderPage.java:308)

	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)



Hat jemand eine Idee wie man das fixen könnte? Ich brauche auch gar nicht so alte Kurse aber ich wüsste auch nicht, wie man die älteren Werte überspringen könnte. Leider sind ariva und onvista immer Mal wieder unzuverlässig und es fehlen Kurse. Außerdem ist der Kurs bei der Deka meist früher verfügbar. Daher wollte ich es über diesen Weg versuchen.

Grüße
Johannes

Es sind Tage relativ zur Epoche. Das Minimum entspricht also nicht 1958, sondern etwa 1 Million Jahre v. Chr. Das Problem ist die Unterscheidung, ob die vorgefundene Zahl in Tagen, Sekunden oder Millisekunden angegeben ist. Da funktionieren die Faustregeln von PP nur für Daten in der Zukunft gut.

Als Workaround: Wenn die Deka keine Möglichkeit bietet, nur einen begrenzten Zeitraum abzufragen, bliebe höchstens ein zwischengeschalter Proxy, der die ältesten Einträge entfernt.

2 Likes

Aah, okay! Wieder was gelernt, danke!

Die Deka bietet leider scheinbar an der Stelle tatsächlich keine weiteren Parameter zur Einstellung, die laden scheinbar tatsächlich immer alle Kurse und steuern dann nur über die GUI was angezeigt wird. Wahrscheinlich lasse ich es dann einfach bei ariva und akzeptiere bei dem einen Fond den Versatz (wird sowieso umgeschichtet, dumme Jugendentscheidung aber das tut hier nichts zur Sache). Aber Mal für die Theorie, wie würde ich so einen Proxy bauen/konfigurieren? Einfach ein python script o.ä. was dazwischengeschaltet wird? Falls es wichtig ist, nutze Win10. Vielleicht kannst du mich da mal in die richtige Richtung stupsen?

In einem etwas länglichen Thread war das mal Thema: JSON Historical quotes ends with :: Text could not be parsed at index 0 - #18 by jonathlan

Endete in GitHub - jonathlan/proxyformatter: Basic proxy web service for formatting the date in other web services in Ruby geschrieben

1 Like

Dank dir, werde ich mir Mal zu Gemüte führen :slight_smile:

Habe grade mal golang als Sprache ausprobiert. Weil mir nix vernünftiges zum probieren einfiel hab ich diesen Case mal versucht.

package main

import (
   "io/ioutil"
   "log"
   "net/http"
   "fmt"
   "regexp"
)

func history_DE0008474503(w http.ResponseWriter, req *http.Request) {
   resp, err := http.Get("https://www.deka.de/site/privatkunden_site/wertentwicklung/12843335/index.html?assetcategory=10&isin=DE0008474503&action=preisentwicklung")
   if err != nil {
      log.Fatalln(err)
   }
//HTTP Body einlesen
   body, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      log.Fatalln(err)
   }
//Convert the body to type string
   jsonstring := string(body)
//JSON bereinigen
   negativetimestampsrausRegexp := regexp.MustCompile(`.*1454410800000`)
   newbody := negativetimestampsrausRegexp.ReplaceAllString(jsonstring, "[[1454410800000")
   fmt.Fprintf(w, newbody)
}

func headers(w http.ResponseWriter, req *http.Request) {
    for name, headers := range req.Header {
        for _, h := range headers {
            fmt.Fprintf(w, "%v: %v\n", name, h)
        }
    }
}


func main() {
   http.HandleFunc("/history_DE0008474503", history_DE0008474503)
   http.HandleFunc("/headers", headers)
   http.ListenAndServe(":8090", nil)
}

Bildschirmfoto_2022-06-11_21-09-44

http://localhost:8090/history_DE0008474503

wäre dann die URL

Scheint soweit zu funktionieren. Falls Du selber “go” installieren willst → Downloads - The Go Programming Language

Falls nicht, ich hab obiges Script schon für Windows kompiliert, aber wie das mit selbstgebautem Kram meistens so ist, meckert irgendein Schlangenöl rum: https://www.virustotal.com/gui/file/a4ca77369d06af7e22671c7121f98cccdffaa6b23d2e1f459cf2918ef6d6468e/detection

1 Like