public async Task <List <TemperatureRecord> > ReadTemperatures(string city, int cityUtcOffset, DateTime from, DateTime to) { string cityId = await GetCityId(city); Console.WriteLine($"Идентификатор города '{cityId}'"); // Получаем список всех меток времени, по которым есть данные var timeStampsRaw = await GetTimeStamps(cityId); var timeStamps = MeteoInfoParser.ParseTimeStamps(timeStampsRaw); return(await ReadCityTemperatures(cityId, cityUtcOffset, timeStamps, from, to)); }
private static async Task <string> GetCityId(string cityName) { var dataArray = await Post(HourArchiveHomeUrl, "0", "0"); var cityList = MeteoInfoParser.GetOptions(dataArray[4].ToString().Replace("[", string.Empty).Replace("]", string.Empty).Trim()).ToList(); // Ищем нормализованное имя города, чтобы не учитывать регистр. var cityInfo = cityList.Find(x => x.Name.ToUpperInvariant().Contains(cityName.ToUpperInvariant())); if (cityInfo == null) { throw new Exception($"На сайте не найден город '{cityName}'"); } return(cityInfo.UrlPart); }
/// <summary> /// Считывает температуры с указанного URL за период importStart - importEnd. /// </summary> /// <param name="cityUrl"></param> /// <param name="cityTimeOffset"></param> /// <param name="timeStamps"></param> /// <param name="importStart"></param> /// <param name="importEnd"></param> /// <returns></returns> private static async Task <List <TemperatureRecord> > ReadCityTemperatures(string cityUrl, int cityTimeOffset, Dictionary <DateTime, string> timeStamps, DateTime importStart, DateTime importEnd) { // Считываем данные по температурам. Console.WriteLine($"Чтение температур с {importStart} по {importEnd}"); var result = new List <TemperatureRecord>(); // Проходим по всем доступным меткам времени. foreach (var kvp in timeStamps) { // Все метки времени на этом сайте в UTC. // Чтобы узнать местное время, нужно добавить смещение территории относительно UTC. var localTime = kvp.Key.AddHours(cityTimeOffset); if (localTime >= importStart && localTime < importEnd) { string hourContent = await GetTimeData(cityUrl, kvp.Value); if (string.IsNullOrWhiteSpace(hourContent)) { Console.WriteLine($"Не удалось получить температуру за {localTime}"); } else { float?value = MeteoInfoParser.ExtractTemperature(hourContent); if (value.HasValue) { result.Add(new TemperatureRecord { Date = localTime, Temperature = value.Value }); Console.WriteLine($"Получена температура за {localTime}"); } else { Console.WriteLine($"Не найдена температура за {localTime}"); } } } } return(AggregateTemperatures(result)); }