public IEnumerable <ShipmentProgress> Track(string id) { var ret = new List <ShipmentProgress>(); var result = string.Empty; try { result = this.httpClient.GetStringAsync(this.apiUrl + id).Result; } catch (Exception ex) { Console.WriteLine(ex); ret.Add(new ShipmentProgress { Status = ShipmentStatus.Invalid, Message = "Invalid number", UpdatedAt = DateTime.Now, }); return(ret); } var json = JArray.Parse(result).First; var history = json["statusHistory"]; // { // "description": "Die Sendung wurde zugestellt. ", // "dateTime": "31.07.2019 12:14" //} // { // "description": "Die Sendung befindet sich in der Zustellung.", // "dateTime": "31.07.2019 08:35" // } // { // "description": "Die Sendung ist im Hermes Verteilzentrum LC Berlin eingetroffen.", // "dateTime": "30.07.2019 10:55" // } // { // "description": "Die Sendung wurde im Hermes Logistikzentrum sortiert.", // "dateTime": "30.07.2019 10:55" // } // { // "description": "Die Sendung ist im Hermes Verteilzentrum LC Berlin eingetroffen.", // "dateTime": "29.07.2019 17:37" // } // { // "description": "Die Sendung wurde im Hermes Logistikzentrum sortiert.", // "dateTime": "29.07.2019 17:37" // } // { // "description": "Die Sendung wurde Hermes elektronisch angekündigt.", // "dateTime": "29.07.2019 07:54" // } foreach (var entry in history) { var desc = entry["description"].ToString().Trim(); var time = entry["dateTime"].ToString().Trim(); var dt = DateTime.ParseExact(time, "dd.MM.yyyy HH:mm", null); var match = Regex.Match(desc, "Die Sendung ist im Hermes Verteilzentrum (.*?) eingetroffen"); var location = match.Groups.Count > 1 ? match.Groups[1].Value : ""; var status = desc switch { "Die Sendung wurde Hermes elektronisch angekündigt." => ShipmentStatus.Transit, "Die Sendung wurde zugestellt." => ShipmentStatus.Done, "Die Sendung befindet sich in der Zustellung." => ShipmentStatus.Delivery, "Die Sendung wurde im Hermes Logistikzentrum sortiert." => ShipmentStatus.Transit, _ when desc.Contains("Die Sendung ist im Hermes Verteilzentrum") => ShipmentStatus.Transit, _ => throw new Exception("No valid status found.") }; var progress = new ShipmentProgress { Status = status, Location = location, Message = desc, UpdatedAt = dt, }; ret.Add(progress); } ret.Reverse(); return(ret); } }
public IEnumerable <ShipmentProgress> Track(string id) { var ret = new List <ShipmentProgress>(); string result; try { result = this.httpClient.GetStringAsync(this.apiUrl + id).GetAwaiter().GetResult(); } catch (HttpRequestException ex) { if (ex.Message.Contains("404") || ex.Message.Contains("400")) { ret.Add(new ShipmentProgress { Status = ShipmentStatus.Invalid, UpdatedAt = DateTime.Now, Message = "Invalid tracking id.", }); return(ret); } else if (ex.Message.Contains("429")) { ret.Add(new ShipmentProgress { Status = ShipmentStatus.Unknown, UpdatedAt = DateTime.Now, Message = "API ERROR: TOO MANY REQUESTS", }); return(ret); } throw ex; } var json = JObject.Parse(result); var history = json["shipments"][0]["events"]; foreach (var entry in history) { var time = entry["timestamp"].ToString(); var location = entry["location"]?["address"]?["addressLocality"]?.ToString(); var message = entry["status"].ToString(); //Console.WriteLine(message); //Console.WriteLine(entry["message"].ToString()); var statusCode = entry["statusCode"].ToString() switch { "transit" when message.Contains("Die Sendung wurde in das Zustellfahrzeug geladen.") => ShipmentStatus.Delivery, "transit" => ShipmentStatus.Transit, "delivered" => ShipmentStatus.Done, "pre-transit" => ShipmentStatus.Transit, "unknown" => ShipmentStatus.Transit, "failure" => ShipmentStatus.Transit, _ => throw new Exception("Status not found."), }; if (statusCode == ShipmentStatus.Done) { location = string.Empty; } var progress = new ShipmentProgress { Message = message, Location = location ?? string.Empty, UpdatedAt = DateTime.Parse(time), Status = statusCode, }; ret.Add(progress); } ret.Reverse(); return(ret); }