PDA

Ver la Versión Completa : Enviar datos a PHP y leer resultados (pagina ajena)


dosher81
08-04-2018, 16:32:02
Buenas a todos,

pues aunque ponga que soy nuevo la verdad es que sigo esta pagina desde hace mil años y ha sido mi principal base para solucionar mis problemas siempre pero esta vez no encuentro por donde seguir.

Estoy desarrollando una aplicación de autoescuelas y necesito consultar el resultado de los alumnos contra la pagina de trafico, para ellos tengo que enviarle una serie de datos, pulsar en enviar y obtener el resultado.

sinceramente no tengo ni idea de como puedo realizar esto desde delphi.

¿alguna idea?

gracias!!!

dec
08-04-2018, 16:48:22
Hola,

Puedes utilizar el componente "IdHttp" que viene con los componentes Indy (http://www.indyproject.org/index.en.aspx), seguramente, incluido ya en tu Delphi. El componente "IdHttp" implementa un cliente HTTP, con el que podrás hacer peticiones GET y POST a las URL de los scripts PHP que necesites, enviando valores y recibiendo la correspondiente respuesta del servidor. Si buscas por "IdHttp Indy Delphi" encontrarás más información.

dosher81
09-04-2018, 05:39:41
Mil Gracias! voy a probarlo :)

dosher81
10-04-2018, 08:07:51
sigo con la locura, no hay forma de hacerlo funcionar.

el problema es que la pagina web donde quiero acceder es https, con lo que tengo que utilizar ssl y aqui choco contra una pared con la que ya chocaron compañeros del foro y con la que no he encontrado solución hasta la fecha.

pongo algo de código:


uses: IdMultipartFormData,IdSSLOpenSSL;

procedure Tfautoescuela.FormCreate(Sender: TObject);
var
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
///
IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(self);
with idSSLIOHandlerSocketOpenSSL1 do
begin
SSLOptions.Method := sslvSSLv2;
SSLOptions.Mode := sslmUnassigned;
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 0;
//host := '';
end;
IdHTTP1 := TIdHTTP.Create(Self);
with IdHTTP1 do
begin
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
AllowCookies := True;
ProxyParams.BasicAuthentication := False;
ProxyParams.ProxyPort := 0;
Request.ContentLength := -1;
Request.ContentRangeEnd := 0;
Request.ContentRangeStart := 0;
Request.Accept := 'text/html, */*';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := [hoForceEncodeParams];
end;
End;

procedure Tfautoescuela.Button1Click(Sender: TObject);
var S: TStringList;
M: TStream;
begin
S := TStringList.Create;
M := TMemoryStream.Create;
try
S.Values['nif'] := '455654654S';
S.Values['fecha-exa'] := '04/01/2018';
S.Values['tipo-exa'] := 'B';
S.Values['fecha-nac'] := '18/02/1975';

IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP1.Post('https://aegranvia.es/resultados', S, M);
Memo1.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
Memo1.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));

M.Position := 0;
S.LoadFromStream(M);
Memo1.Lines.AddStrings(S);
finally
S.Free;
M.Free;
end;


el problema es que TIdSSLIOHandlerSocketOpenSSL me dice undeclared identifier.

ya actualicé a indy10, he descarado las dll y sinceramente no se que mas le puedo hacer

¿se os ocurre algo?

mil gracias!!

dec
10-04-2018, 08:24:21
Hola a todos,

La clase "TIdSSLIOHandlerSocketOpenSSL" se declara en la unidad "IdSSLOpenSSL.pas".

dosher81
10-04-2018, 14:20:19
La clase "TIdSSLIOHandlerSocketOpenSSL" se declara en la unidad "IdSSLOpenSSL.pas".
Gracias! Solucionado

le añadí ademas las dll´s necesarias para que funcionara y funcionó pero ahora tengo otro problema.

Ya me devuelve datos, el problema es que no ejecuta el php, simplemente me devuelve el código de la pagina pero la "ejecuta" o pulsa el boton buscar.

estoy atascado porque estoy muy muy verde en este tema y cuando mas leo mas me lio :(

¿alguna idea de porque no estará ejecutando?

gracias!

bucanero
10-04-2018, 17:06:53
Hola Dosher81

quizás el problema viene del hecho de que estas lanzando los datos contra la misma URL que te los envía a ti, pero en realidad el formulario dentro de esa pagina HTML los envía a otra dirección distinta cuando pulsas sobre el botón enviar "../php/obtener-notas.php" . Prueba a enviarlos a esa nueva dirección. Por otra parte no añades el parámetro submit del propio formulario, y dependiendo de la validación es posible que lo tengas que insertar también.

<form name="form-resultados" id="form-resultados-id" action="../php/obtener-notas.php" method="post">
...
<button type="submit" class="submit">Ver Resultados</button>
</form>

Por otra parte con las conexiones SSL y dependiendo de la configuración del servidor de la pagina web (en muchos servidores están configurados sin la opción SNI) y la versión de las INDY que tengas instaladas, puedes llegar a tener bastantes complicaciones para poder acceder. Las INDY en las versiones anteriores no están bien preparadas para las conexiones de tipo SSL y hay que aplicar distintos tratamientos. En estos enlaces se habla de este problema en particular:

https://stackoverflow.com/questions/49260327/delphi-idhttpssl-get-403-forbidden-from-server
https://stackoverflow.com/questions/39545080/tidhttp-and-tls-sni-doesnt-work

Y la solución que proponen y yo estoy aplicando para este problema es esta, en particular en el evento StatusInfoEx del IdSSLIOHandlerSocketOpenSSL1 inserta el siguiente código, aunque aun hay sitios que se resisten y no consigo acceder

procedure TForm1.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(
ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: Integer;
const AType, AMsg: string);
begin
if (ASender is TIdSSLIOHandlerSocketOpenSSL) then
SSL_set_tlsext_host_name(AsslSocket, (ASender as TIdSSLIOHandlerSocketOpenSSL).host);
end;

Un saludo

darkbits
04-06-2018, 07:16:00
hola
dosher81 yo tambien estoy haciendo el mismo proyecto pero no se donde comenzar
porfa me podes compartir un ejemplo de como manehas httcli get o post

necesito autentificarme a una pagina y dentro del panel realizar insertar modificar y elimanar

te agradesco tu colaboracion