using System.Text.Json; using System.Globalization; using Application; using System.Net; using System.Net.Http; using System.Net.Http.Headers; namespace Infrastructure { public class CalendarioService : ICalendarioService { private const string Url = "https://www.ccee.org.br/en/web/guest/calendario?p_p_id=com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn&p_p_lifecycle=2&p_p_cacheability=cacheLevelPage&doAsUserId=&p_p_resource_id=calendarBookings"; public async Task ObterEventoLimiteColetaAsync(DateTime dataReferencia, CancellationToken ct = default) { var year = dataReferencia.Year; var month = dataReferencia.Month - 1; var dayFinal = DateTime.DaysInMonth(year, month + 1); var values = new Dictionary { ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_calendarIds"] = "55985", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeDay"] = dayFinal.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeHour"] = "23", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeMinute"] = "59", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeMonth"] = month.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeYear"] = year.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_eventsPerPage"] = "-1", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeDay"] = "1", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeHour"] = "0", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeMinute"] = "0", ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeMonth"] = month.ToString(), ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeYear"] = year.ToString(), }; try { using var handler = new SocketsHttpHandler { // Adiciona Accept-Encoding automaticamente e faz a descompressão transparente AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli }; using var client = new HttpClient(handler); using var content = new FormUrlEncodedContent(values); using var request = new HttpRequestMessage(HttpMethod.Post, Url) { Content = content }; // Headers solicitados request.Headers.Host = "www.ccee.org.br"; request.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); request.Headers.Accept.Clear(); request.Headers.Accept.ParseAdd("*/*"); request.Headers.AcceptEncoding.Clear(); request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate")); request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("br")); request.Headers.Connection.Add("keep-alive"); var resp = await client.SendAsync(request, ct); var resposta = await resp.Content.ReadAsStringAsync(ct); var alvo = $"Data limite para coleta diária dos dados de medição no SCDE"; try { using var doc = JsonDocument.Parse(resposta); double? encontrado = null; double? startTimeDay = null; void SearchJson(JsonElement el) { if (encontrado != null) return; if (el.ValueKind == JsonValueKind.Object) { // Verifica se alguma propriedade contém o texto alvo foreach (var prop in el.EnumerateObject()) { if (prop.Value.ValueKind == JsonValueKind.String) { var s = prop.Value.GetString() ?? ""; if (s.Contains(alvo, StringComparison.OrdinalIgnoreCase)) { // Encontrou o evento, extrair dados do mesmo objeto if (el.TryGetProperty("startTimeDay", out var day)) startTimeDay = day.GetInt32(); if (startTimeDay != null) encontrado = startTimeDay; return; } } } foreach (var prop in el.EnumerateObject()) SearchJson(prop.Value); } else if (el.ValueKind == JsonValueKind.Array) { foreach (var item in el.EnumerateArray()) SearchJson(item); } } SearchJson(doc.RootElement); if (encontrado != null) return encontrado; } catch { } return null; } catch { return null; } } } }