Utiliza SocketsHttpHandler para descompressão automática (GZip, Deflate, Brotli) e configura HttpRequestMessage com headers detalhados (Host, User-Agent, Accept, Accept-Encoding, Connection) para simular navegador e garantir compatibilidade com o servidor da CCEE. Troca PostAsync por SendAsync. Processamento do JSON permanece inalterado.
121 lines
5.9 KiB
C#
121 lines
5.9 KiB
C#
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<double?> 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<string, string>
|
|
{
|
|
["_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;
|
|
}
|
|
}
|
|
}
|
|
} |