Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Enviar datos a un formulario web y obtener respuesta (https://www.clubdelphi.com/foros/showthread.php?t=72881)

IVAND 17-03-2011 02:52:19

Enviar datos a un formulario web y obtener respuesta
 
Hola a todos

Estoy leyendo algunos hilos sobre el tema , pero para serles muy sincero soy totalmente novato en este tema de las web

Pero les comento mis inquietudes a ver si alguien se anima a ayudarme un poco

Tengo una pagina web
https://declaraciones.sri.gov.ec/fac...-documento.jsp

En esta pagina hay unos campos que rellenar para saber si un documento en mi país (Ecuador) es valido , como puedo desde delphi enviar estos parámetros y obtener el dato si es valido o no

Ejemplo para validar

1.- Es valido
Autorizacion=1109046610
Ruc = 1307109957001
tipo de documento FACTURA
Numero de documento 001 002 0045458


2- No valido

Autorizacion=1109046610
Ruc = 1307106037001
tipo de documento FACTURA
Numero de documento 001 002 0045458

Gracias por su tiempo

Un abrazo a la distancia




Utilizo delphi 6 y los componentes INDY ,,

En espera de su amable respuesta quedo muy agradecido :mad:

Neftali [Germán.Estévez] 17-03-2011 10:13:13

Revisa este hilo; Es muy parecido. Intenta montar un código tal y como está ahí (modificando los campos) y a ver si funciona. a partir de ahí podemos ver dónde está el error.

IVAND 17-03-2011 17:49:06

Mil gracias por tu respuesta

Lo que indica Roman en ese Post

Código PHP:

</script> 
<form action="/facturacion-internet/consultas/publico/resultado-validez-documento.jspa" method="post" name="forma"> 
<div>&nbsp;</div> 

el metodo es post
peor no se y perdona como enviar los parametros que si los conosco

segun tu codigo

resp := IdHTTP.Post('http://www.ibpindex.com/ibpweb.asp?LAN=es', Params);

La pagina deberia aceptar parametros , pero he intentado enviar directamente los parametros y me indica error en la pagina

o algo estoy haciendo mal

El codigo que indica me da un error en params


Yo supongo que en params , debo enviar los nombres de los campos que estan en el formulario

y de ahi ejecutar la accion del boton que da click y obtener los resultados


Perdoname Neftali pero como que estoy medio confundido

Te pongo el codigo que tengo

Código:

procedure TForm1.Button3Click(Sender: TObject);
var
  Response: String;
  AResponseContent: TMemoryStream;
  resp, ruta:string;
  TS:TStrings;
begin
  Randomize;
  AResponseContent := TMemoryStream.CReate();
  ruta := Trim('Hola'); //solo para probar pues mi pagina no  se ingresa un archivo
  if ruta <> '' then begin

    Params.Clear;
    Params.Values['ruc'] := '1307106037001';
    Params.Values['autorizacion'] := '123455566';
    resp := IdHTTP.Post('https://declaraciones.sri.gov.ec/facturacion-internet/consultas/publico/consulta-validez-documento.jsp'
, Params);
  end;
  // Se supone que resp me envie la respusta de valido o no el documento

  TS := TStringList.Create;
  TS.Add(resp);
  TS.SaveToFile('r:\response' + IntToStr(Random(1000)) + '.txt.html');
  FreeAndNil(TS);

  FreeAndNil(AResponseContent);
end;

no compila da error en params

Gracias por tu tiempo

IVAND 17-03-2011 18:36:19

He encontrado un codigo de roman usando webbrowser
que me sirve

Código:

//  form := WebBrowser1.LocationURL('https://declaraciones.sri.gov.ec/facturacion-internet/consultas/publico/consulta-validez-documento.jsp',Sender);
  form := WebBrowser1.OleObject.document.forms.item(0);
  form.item(3).value := '1109285496';
  form.item(4).value := '1307109957001';
  form.item(6).value := '001';
  form.item(7).value := '001';
  form.item(8).value := '0144887';
  form.submit;

pero como puedo hacer para no abrir el navegador y leer la respuesta de la pagina

roman 17-03-2011 19:03:59

No, no. Desecha ese método.

Te pongo un ejemplo usando IdHTTP:

Código Delphi [-]
var
    Url: String;
    Params: TStringList;
    Response: TStringStream;

begin
    Url := 'https://declaraciones.sri.gov.ec/facturacion-internet/consultas/publico/resultado-validez-documento.jspa';

    Params := nil;
    Response := nil;

    try
        Params := TStringList.Create;
        Response := TStringStream.Create('');

        Params.Values['DAY'] := '17';
        Params.Values['MON'] := '3';
        Params.Values['YEAR'] := '2011';
        Params.Values['autorizacion'] := '1109046610';
        Params.Values['ruc'] := '1307109957001';
        Params.Values['tipo_comprobante'] := '1';
        Params.Values['establecimiento'] := '001';
        Params.Values['punto_emision'] := '002';
        Params.Values['documento'] := '0045458';

        IdHttp1.Post(Url, Params, Response);

        Memo1.Lines.Text := Response.DataString;
    finally
        Params.Free;
        Response.Free;
    end;
end;

Ahora, dado que la url usa el protocolo https, no te servirá si lo pones así nada más. Debes agregar un componente IdSSLIOHandlerSocketOpenSSL (también de las Indy) y asignárselo a la propiedad IOHandler del IdHTTP.

// Saludos

IVAND 17-03-2011 19:26:57

Mil gracias Roman

Funciona perfecto , me sale un mensaje

Código:

Connection closed Gracefully
Ahora obtengo el dato en el memo , pero como puedo leer especificamente una linea de ese memo

la linea es la que me dice que se valido correctamente o no

en este caso es la

Código:

<div class="merror">El Documento que usted ha consultado, se encuentra autorizado por el SRI, y deber&aacute; contener los
siguientes datos:</div>


O si es mucha molestia me guias como puedo leer lo que me devuelve el memo
para poder colocar ese dato en campos de mi formulario


Gracias y un abrazo a la distancia

Neftali [Germán.Estévez] 18-03-2011 09:49:16

Cita:

Empezado por roman (Mensaje 393947)
Ahora, dado que la url usa el protocolo https, no te servirá si lo pones así nada más. Debes agregar un componente IdSSLIOHandlerSocketOpenSSL (también de las Indy) y asignárselo a la propiedad IOHandler del IdHTTP.

¡Qué grande Román! Dicho así parece fácil y todo. :)

roman 18-03-2011 15:50:27

Ja, ja. Sí parece fácil ¿verdad? Pero lo cierto es que yo no sé casi nada de eso, salvo que lo he usado anteriormente para mandar correo con gmail que usa el protocolo ssl. Pero, a diferencia de aquél caso, aquí parece que no son necesarias las bibliotecas openssl, y eso sí que no lo entiendo, je, je.

// Saludos

IVAND 18-03-2011 19:20:00

Gracias a todos por colaborar en mi problema , ya esta solucionado

Mil gracias nuevamente
:D

roman 18-03-2011 19:25:17

Hola,

Sería bueno que pusieras cómo hiciste para encontrar el dato específico en la página de resultados y así tener la solución completa.

// Saludos

IVAND 18-03-2011 22:52:01

Claro , solo hice algo sencillo,

Use un componente Richedit
y busque dentro de el la cadena que busco , si la encuentro el documento es valido , caso contrario no


Código:

procedure TFIng_Fact.Validar_documentoClick(Sender: TObject);
Var
  Encontrado : LongInt;
  Desde, Hasta : Integer;
  Cad : String;
begin
 Cad:='El Documento que usted ha consultado, se encuentra autorizado por el SRI';
  //Ahora la busqueda

  If RichEdit1.SelLength <> 0 then
    Desde := RichEdit1.SelStart + RichEdit1.SelLength
  Else
    Desde := 0;
  Hasta := Length(RichEdit1.Text) - Desde;
  Encontrado := RichEdit1.FindText(Cad, Desde, Hasta, [stMatchCase]);
  If Encontrado <> -1 then
    // ShowMessage('La palabra se encontro en : '+IntToStr(Encontrado))
    Showmessage('Documento autorizado')
  Else
    ShowMessage('Documento no autorizado');
end;

Lo ideal seria tomar los valores que retorna en html y convertirlos en campos en delphi , pero eso aun no se como hacerlo

elmacu 24-10-2013 20:22:40

Roman, como estas?

Te hago una consulta. Por ahi es facil pero no logro dar con la tecla.

Estoy haciendo un POST a una web ASP, y tengo que enviar un token firmado previamente.

Con el WebBrowser lo puedo hacer sin problema, pero con las Indy no logro hacerlo andar.
Según lo que pude encontrar en la web es que viajan de forma distinta los datos o por lo menos van formateados en forma distinta.
Con el WebBrowser envio los datos se la siguiente manera:

Código Delphi [-]

var
  EncodedDataString: string;
  PostData  : OleVariant;
  Headers   : OleVariant;
  i         : integer;
  TokenSend :TStringlist;


begin

  TokenSend:=TStringlist.create;
  TokenSend.LoadFromFile('Token_a_Enviar.txt');

  EncodedDataString := 'XXX='+HTTPEncode('valor1')+'&'+
                                'XXX='+HTTPEncode('valor2')+'&'+
                                'Token='+HTTPEncode(TokenSend.Text);

  PostData := VarArrayCreate([0, length(EncodedDataString)-1], varByte);

  for i := 1 to length(EncodedDataString) do
    PostData[i-1] := ord(EncodedDataString[i]);

  Headers := 'Content-type: application/x-www-form-urlencoded'#10#13;

  WebBrowser1.Navigate('https://..........', EmptyParam, EmptyParam,  PostData, Headers);

Los datos que van dentro del Token_a_Enviar.txt es algo como esto:


Código Delphi [-]
-----BEGIN PKCS7-----
MIIMXwYJKoZIhvcNAQcCoIIMUDCCDEwCAQExCzAJBgUrDgMCGgUAMIGrBgkqhkiG9w0BBwGggZ0E
gZpiYW5jbz0wODE0fGJhbmNvX3NhbT0wODE0fHNlcnZpZG9yPTAwMDF8c3VjdXJzYWw9ODc5OXx0
ZXJtaW5hbD0xNjk5fGNvZF9zZXJ2aWNpbz18cnVicm89fGNvZGlnbz0zMDUzMDU0MzAwMzE1MTIw
MDAyMjQwMDEwMjMwMDAwMjI0MDAxMDIzMTN8SW1wb3J0ZU1hbnVhbD18oIIIWzCCCFcwggY/oAMC
AQICAQQwDQYJKoZIhvcNAQEFBQAwgfwxCzAJBgNVBAYTAkFSMSgwJgYDVQQIEx9DaXVkYWQgQXV0
b25vbWEgZGUgQnVlbm9zIEFpcmVzMSgwJgYDVQQHEx9DaXVkYWQgQXV0b25vbWEgZGUgQnVlbm9z
IEFpcmVzMSIwIAYDVQQKExlCYXBybyBNZWRpb3MgZGUgUGFnbyBTLkEuMSUwIwYDVQQLExxUZWNu
-----END PKCS7-----

Luego en el evento "WebBrowser1NavigateComplete2" me hago del resultado.

Quisiera hacer lo mismo con las Indy.
Ya que aunque me devuelva error de que ingrese mal los datos, la obtención del resultado es más rapida.

Intente de varías manera, pero no lo he logrado...

Este es uno de los intentos, con las Indys.::
Código Delphi [-]

        Token_Send:=TStringlist.create;
        Token_Send.LoadFromFile('Token_a_Enviar.txt');
        Params := TStringStream.create('');
        Params.WriteString(URLEncode('XXX=' + 'valor1' + '&'));
        Params.WriteString(URLEncode('XXX=' + 'valor2' + '&'));
        Params.WriteString(URLEncode('Token=' +Token_Send.Text));

        sHttpSocket := TIdHTTP.Create;
        try
          //como es una llamada a una https, asigno el HandlerSSL
          sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create(sHttpSocket);
          sshSocketHandler.Intercept:= TIdConnectionIntercept(IdLogFile1);
          sHttpSocket.IOHandler := sshSocketHandler;
          sHttpSocket.ReadTimeout:=15000;

          sHttpSocket.Request.ContentType := 'Content-type: application/x-www-form-urlencoded'#10#13;
          //creo el dato que va a obtener la respuesta
          resStreamRes:= TStringlist.create;
          //Hago la llamada
          sHttpSocket.post('https://.....',Params, resStream);
          //Obtengo respuesta y guardo 
          resStreamRes.Add(resStream.DataString);
          resStreamRes.SaveToFile('Resultado.txt');
        Except
        on E: EIdHTTPProtocolException do
        begin
        end;

Por ahora con el WebBrowser salgo del apuro, pero quisiera hacerlo mas optimo...
Desde ya mil gracias!

Sdos.-


La franja horaria es GMT +2. Ahora son las 05:34:00.

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