package main import ( "encoding/csv" "encoding/json" "fmt" "net/http" "os" "strconv" "time" "git.ultraware.nl/Ultraware/util" ) type day struct { Date int `json:"valid_time_gmt"` AvgTemperature int `json:"temp"` } type data struct { Observations []day `json:"observations"` } func main() { from := getNextDate() if from.After(time.Now()) { fmt.Println(`Nothing to get, exiting ...`) os.Exit(0) } to := from.AddDate(0, 0, 21) if to.After(time.Now()) { to = time.Now() } url := `https://api.weather.com/v1/location/EHGG:9:NL/observations/historical.json?apiKey=6532d6454b8aa370768e63d6ba5a832e&units=e&startDate=` + from.Format(`20060102`) + `&endDate=` + to.Format(`20060102`) resp, err := http.Get(url) util.PanicOnErr(err) // f, err := os.Open(`data.json`) // util.PanicOnErr(err) var d data err = json.NewDecoder(resp.Body).Decode(&d) util.PanicOnErr(err) out, err := os.OpenFile(`weather.csv`, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) util.PanicOnErr(err) csvout := csv.NewWriter(out) for _, day := range d.Observations { csvout.Write([]string{strconv.Itoa(day.Date), fToCString(day.AvgTemperature)}) } csvout.Flush() } func getNextDate() time.Time { f, err := os.Open(`weather.csv`) if err != nil { return time.Date(2019, 11, 1, 0, 0, 0, 0, time.Local) } csvf := csv.NewReader(f) var last []string for { row, err := csvf.Read() if err != nil { break } last = row } u, err := strconv.ParseInt(last[0], 10, 64) util.PanicOnErr(err) t := time.Unix(u, 0) return t.AddDate(0, 0, 1) } func fToCString(temp int) string { return strconv.FormatFloat(float64(temp-32)/1.8, 'f', 1, 64) }