diff --git a/tariff/pun.go b/tariff/pun.go index 29703bcf6..0fd135fd1 100644 --- a/tariff/pun.go +++ b/tariff/pun.go @@ -4,7 +4,6 @@ import ( "encoding/xml" "fmt" "io" - "net/http" "net/http/cookiejar" "net/url" "slices" @@ -16,6 +15,7 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/evcc-io/evcc/api" "github.com/evcc-io/evcc/util" + "github.com/evcc-io/evcc/util/request" "golang.org/x/net/html" ) @@ -124,28 +124,21 @@ func (t *Pun) Type() api.TariffType { } func (t *Pun) getData(day time.Time) (api.Rates, error) { - // Initial URL - urlString := "https://www.mercatoelettrico.org/It/WebServerDataStore/MGP_Prezzi/" + day.Format("20060102") + "MGPPrezzi.xml" - // Cookie Jar zur Speicherung von Cookies zwischen den Requests - jar, _ := cookiejar.New(nil) - client := &http.Client{ - Jar: jar, - } + client := request.NewClient(t.log) + client.Jar, _ = cookiejar.New(nil) // Erster Request - resp, err := client.Get(urlString) + uri := "https://www.mercatoelettrico.org/It/WebServerDataStore/MGP_Prezzi/" + day.Format("20060102") + "MGPPrezzi.xml" + resp, err := client.Get(uri) if err != nil { - fmt.Println("Error fetching URL:", err) return nil, err } defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - formData, err := parseFormFields(body) + formData, err := parseFormFields(resp.Body) if err != nil { - fmt.Println("Error parsing form fields:", err) - return nil, err + return nil, fmt.Errorf("form fields: %w", err) } redirectURL := resp.Request.URL.String() @@ -164,21 +157,16 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) { defer resp.Body.Close() // Erneuter Request auf die ursprüngliche URL - resp, err = client.Get(urlString) + resp, err = client.Get(uri) if err != nil { - fmt.Println("Error fetching URL after form submission:", err) return nil, err } defer resp.Body.Close() // Verarbeitung der erhaltenen Daten - body, _ = io.ReadAll(resp.Body) - xmlData := []byte(string(body)) // Ersetzen Sie [Ihr XML-Datenstring hier] mit Ihrem XML-String - var dataSet NewDataSet - err = xml.Unmarshal(xmlData, &dataSet) - if err != nil { - fmt.Println("Error unmarshalling XML: ", err) + if err := xml.NewDecoder(resp.Body).Decode(&dataSet); err != nil { + return nil, err } data := make(api.Rates, 0, len(dataSet.Prezzi)) @@ -186,17 +174,17 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) { for _, p := range dataSet.Prezzi { date, err := time.Parse("20060102", p.Data) if err != nil { - fmt.Println("Error parsing date: ", err) + return nil, fmt.Errorf("parse date: %w", err) } hour, err := strconv.Atoi(p.Ora) if err != nil { - fmt.Println("Error parsing hour: ", err) + return nil, fmt.Errorf("parse hour: %w", err) } location, err := time.LoadLocation("Europe/Rome") if err != nil { - fmt.Println("Error loading location: ", err) + return nil, fmt.Errorf("load location: %w", err) } start := time.Date(date.Year(), date.Month(), date.Day(), hour-1, 0, 0, 0, location) @@ -205,7 +193,7 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) { priceStr := strings.Replace(p.PUN, ",", ".", -1) // Ersetzen Sie Komma durch Punkt price, err := strconv.ParseFloat(priceStr, 64) if err != nil { - fmt.Println("Error parsing price: ", err) + return nil, fmt.Errorf("parse price: %w", err) } ar := api.Rate{ @@ -220,11 +208,11 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) { return data, nil } -func parseFormFields(body []byte) (url.Values, error) { - formData := url.Values{} - doc, err := html.Parse(strings.NewReader(string(body))) +func parseFormFields(body io.Reader) (url.Values, error) { + data := url.Values{} + doc, err := html.Parse(body) if err != nil { - return formData, err + return data, err } var f func(*html.Node) f = func(n *html.Node) { @@ -242,7 +230,7 @@ func parseFormFields(body []byte) (url.Values, error) { } } if inputType == "hidden" && inputName != "" { - formData.Set(inputName, inputValue) + data.Set(inputName, inputValue) } } for c := n.FirstChild; c != nil; c = c.NextSibling { @@ -250,5 +238,5 @@ func parseFormFields(body []byte) (url.Values, error) { } } f(doc) - return formData, nil + return data, nil }