Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 201
Poder: 11
razorxxx Va por buen camino
Cita:
Empezado por mqm Ver Mensaje
Aqua lo tenéis convertido a Delphi 10 y probado. Espero que os sirva


Código Delphi [-]
unit Unit2;

interface

uses
  System.SysUtils, System.DateUtils, IdHTTP, IdSSLOpenSSL, System.JSON;

function LeeFechaHoraInternet: string;

implementation

function LeeFechaHoraInternet: string;
var
  Http: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Respuesta: string;
  JsonRespuesta: TJSONObject;
  UnixTicks: Int64;
  FechaHora: TDateTime;
begin
  Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
  Http := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    Http.IOHandler := SSLHandler;
    Http.Request.Accept := 'application/json';
    Http.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
    try
      // Realiza la solicitud a la API
      Respuesta := Http.Get('https://www2.roa.es/cgi-bin/horautc');

      // Si la respuesta es un número de ticks Unix, conviértelo
      UnixTicks := StrToInt64(Trim(Respuesta)); // Ajusta el formato si la API devuelve algo diferente
      FechaHora := UnixToDateTime(UnixTicks div 1000); // Divide entre 1000 para convertir milisegundos a segundos
      FechaHora := TTimeZone.Local.ToLocalTime(FechaHora);
      Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);
    except
      on E: Exception do
        // En caso de error, retorna la hora local
        Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
    end;
  finally
    Http.Free;
    SSLHandler.Free;
  end;
end;
end.


Librerías utilizadas:

IdHTTP y IdSSLOpenSSL para manejar la conexión HTTPS.
System.DateUtils para trabajar con fechas y convertir ticks Unix a TDateTime.
Formato de la fecha: Utiliza FormatDateTime para formatear las fechas en el formato ISO 8601 con zona horaria.

Manejo de errores: Si ocurre un error durante la solicitud HTTP, devuelve la hora local en el formato esperado.

Conversión de ticks Unix: La API devuelve ticks Unix en milisegundos. Esto se divide entre 1000 para convertirlos a segundos antes de usar UnixToDateTime.

Dependencia de OpenSSL: Asegúrate de que tu entorno tenga acceso a las DLL de OpenSSL (libeay32.dll y ssleay32.dll o sus equivalentes actuales) para que TIdSSLIOHandlerSocketOpenSSL funcione correctamente.
Hola a todos. ¿Realmente se puede usar https://www2.roa.es/cgi-bin/horautc, o hay que usar alguna URL propia de la AEAT?
Cuando pregunté al mail de Veri*Factu me remitieron a la siguiente web: https://sede.agenciatributaria.gob.e...a_oficial.html, pero no me he puesto a leerla a fondo.
Responder Con Cita
  #2  
Antiguo 10-12-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por razorxxx Ver Mensaje
Hola a todos. ¿Realmente se puede usar https://www2.roa.es/cgi-bin/horautc, o hay que usar alguna URL propia de la AEAT?
Cuando pregunté al mail de Veri*Factu me remitieron a la siguiente web: https://sede.agenciatributaria.gob.e...a_oficial.html, pero no me he puesto a leerla a fondo.
Hola, la hora oficial del gobierno de españa , para todas las paginas oficiales, derivan de la que pones, que a su vez coje la hora del Real Observatorio de la Armada (ROA) que es la que cojemos nosotros, desde la pagina que ellos referencian , no hay forma de capturar la hora, solo esta alli, para que la veas...
__________________
Uno se alegra de ser útil. (Isaac Asimov)
Responder Con Cita
  #3  
Antiguo 10-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 201
Poder: 11
razorxxx Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, la hora oficial del gobierno de españa , para todas las paginas oficiales, derivan de la que pones, que a su vez coje la hora del Real Observatorio de la Armada (ROA) que es la que cojemos nosotros, desde la pagina que ellos referencian , no hay forma de capturar la hora, solo esta alli, para que la veas...
Aclarado gracias!
Responder Con Cita
  #4  
Antiguo 12-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 201
Poder: 11
razorxxx Va por buen camino
Les traigo una pequeña mejora del código de mqm, que permite pasarle el UTC que queramos. Por tanto, independientemente de la fecha, hora y región que tenga el equipo desde el que se ejecuta la aplicación, nos dará siempre la fecha-hora de Internet correcta:

Código Delphi [-]
function TPPRUEBAS.LeerFechaHoraInternet(UTC: Integer): string;
var
   Https: TIdHTTP;
   SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
   Respuesta: string;
   UnixTicks: Int64;
   FechaHora: TDateTime;
begin
     Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
     try
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];  // TLS 1.2 es compatible desde Windows 7 SP1 y Server 2008 R2 SP1, y aún no ha sido descatalogado
        SSLHandler.SSLOptions.Mode := sslmClient;
        Https := TIdHTTP.Create(nil);
        Https.IOHandler := SSLHandler;
        Https.Request.Accept := 'text/html';
        Https.Request.UserAgent := 'Mozilla/5.0 (compatible; Delphi)';
        Https.ConnectTimeout := 5000;  // Máximo 5 segundos para establecer la conexión con el servidor
        Https.ReadTimeout := 5000;  // Máximo 5 segundos para obtener la respuesta
        try
           Respuesta := Https.Get('https://www2.roa.es/cgi-bin/horautc');  // Realiza la solicitud a la API del ROA
           UnixTicks := StrToInt64(Trim(Respuesta));  // Si la respuesta viene en formato Unix (ajusta el formato si la API devuelve algo diferente)
           FechaHora := UnixToDateTime(UnixTicks div 1000);  // Divide entre 1000 para convertir milisegundos a segundos
           FechaHora := IncHour(FechaHora, UTC);  // Adaptarlo al huso horario seleccionado en el parámetro UTC: 1 = UTC+1 (Península y Baleares), 0 = UTC+0 (Canarias), etc
           Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);  // Formatear la fecha-hora en el formato aceptado por Veri*Factu
           Consola.Lines.Add('Fecha-hora de internet sincronizada correctamente.');
        except
              on E: Exception do
              begin
                   // En caso de error, retorna la hora local y avisa de ello en la consola
                   Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
                   Consola.Lines.Add('No se pudo sincronizar la fecha-hora de internet. Se muestra la fecha-hora del equipo.');
              end;
        end;
     finally
            If Assigned(Https) Then Https.Free;
            If Assigned(SSLHandler) Then SSLHandler.Free;
     end;
end;
Responder Con Cita
  #5  
Antiguo 12-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 201
Poder: 11
razorxxx Va por buen camino
Estuve intentando hacer la función anterior con TRESTClient, pero al ejecutar la petición me da el error 403 forbidden:

Código Delphi [-]
RESTClient.Authenticator := nil;
RESTClient.BaseURL := 'https://www2.roa.es/cgi-bin/';
RESTClient.ContentType := 'text/html; charset=UTF-8';
Request.Resource := 'horautc';
Request.Method := TRESTRequestMethod.rmGET;
Try
   Request.Execute;
Except
   on E: Exception do
   Begin
    Consola.Lines.Add('Error en la petición "' + Request.Resource + '": ' + E.ClassName + ' - ' + E.Message);
    Result := FALSE;
    EXIT;
   End;
End;

¿Alguien tiene idea de cómo hacer que funcione con TRESTClient? Esto nos ahorraría tener que usar las librerías Openssl.
Responder Con Cita
  #6  
Antiguo 12-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 201
Poder: 11
razorxxx Va por buen camino
Lo conseguí con objetos TNetHTTPClient:

Código Delphi [-]
function TPPRUEBAS.LeerFechaHoraInternet(UTC: Integer): string;
var
   UnixTicks: Int64;
   FechaHora: TDateTime;
   HttpClient: TNetHTTPClient;
   HttpResponse: IHTTPResponse;
begin
     Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now); // Formato inicial por defecto
     Try
        HttpClient := TNetHTTPClient.Create(nil);
        Try
           // Ejecutar la solicitud
           HttpResponse := HttpClient.Get('https://www2.roa.es/cgi-bin/horautc');  // Realizar la solicitud a la API del ROA
           If HttpResponse.StatusCode = 200 Then
           Begin
                UnixTicks := StrToInt64(Trim(HttpResponse.ContentAsString));  // Si la respuesta viene en formato Unix (ajusta el formato si la API devuelve algo diferente)
                FechaHora := UnixToDateTime(UnixTicks div 1000);  // Divide entre 1000 para convertir milisegundos a segundos
                FechaHora := IncHour(FechaHora, UTC);  // Adaptarlo al huso horario indicado en el parámetro UTC: 1 = UTC+1 (Península y Baleares), 0 = UTC+0 (Canarias), etc
                Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', FechaHora);  // Formatear la fecha-hora en el formato aceptado por Veri*Factu
                Consola.Lines.Add('Fecha-hora de internet sincronizada correctamente.');
           End
           Else
               Consola.Lines.Add('Error: ' + HttpResponse.StatusCode.ToString + ' ' + HttpResponse.StatusText);
        Except
              on E: Exception do
              Begin
                   // En caso de error, retorna la hora local y avisa de ello en la consola
                   Result := FormatDateTime('yyyy-mm-dd"T"hh:nn:ss"Z"', Now);
                   Consola.Lines.Add('No se pudo sincronizar la fecha-hora de internet. Se muestra la fecha-hora del equipo.');
              End;
        End;
     Finally
            If Assigned(HttpClient) Then HttpClient.Free;
     End;
end;

Acordarse de poner en el uses: System.Net.HttpClient, System.Net.URLClient, System.Net.HttpClientComponent
Responder Con Cita
  #7  
Antiguo 12-12-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.441
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Actualizado el mensaje #2 que recopila códigos con este hilo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 10-12-2024
Avatar de YellowStone
YellowStone YellowStone is offline
Miembro
 
Registrado: feb 2007
Ubicación: Adeje
Posts: 165
Poder: 20
YellowStone Va por buen camino
Cita:
Empezado por razorxxx Ver Mensaje
Hola a todos. ¿Realmente se puede usar https://www2.roa.es/cgi-bin/horautc, o hay que usar alguna URL propia de la AEAT?
Cuando pregunté al mail de Veri*Factu me remitieron a la siguiente web: https://sede.agenciatributaria.gob.e...a_oficial.html, pero no me he puesto a leerla a fondo.
Tampoco es que tenga mucho que leer, que son 25 líneas

Pero si, se puede usar.
Responder Con Cita
  #9  
Antiguo 10-12-2024
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 201
Poder: 11
razorxxx Va por buen camino
Cita:
Empezado por YellowStone Ver Mensaje
Tampoco es que tenga mucho que leer, que son 25 líneas

Pero si, se puede usar.
Me refería a los enlaces dentro de esa URL hombre!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TimeStamp Willo MySQL 4 22-03-2016 21:15:00
Consulta TimeStamp Jose Roman SQL 2 06-09-2012 04:03:11
TimeStamp = TimeStamp me da error Chogo Firebird e Interbase 7 16-03-2011 04:13:38
TIMESTAMP en restriccion Cañones SQL 6 28-08-2007 23:19:27
Timestamp y bde 5.2 Toni Firebird e Interbase 2 27-05-2003 09:26:33


La franja horaria es GMT +2. Ahora son las 15:41:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi