示例#1
0
        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));
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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));
        }