Ciao ragazzi, io ho bisogno di interrogare automaticamente google da una mia applicazione, solo che trovo difficoltà a recuperare il risultato quando si tratta (come per google) di https e non http. Io uso synapse con httpmethod ma non funziona, chi mi sa dire perchè?!
Quello che segue è il mio codice
uses
ssl_openssl,ssl_openssl_lib
var http : THTTPSend;
begin
http:=THTTPSend.Create;
Http.Sock.CreateWithSSL(TSSLOpenSSL);
http.Sock.SSLDoConnect;
if not http.HTTPMethod('GET',Url) then
begin
RecuperaSSLHtml:='';
exit;
end
else
begin
page.LoadFromStream(http.Document);
for i:=0 to page.Count-1 do
risultato:=risultato + UpCase(page[i]);
end;
http.Clear;
page.Clear;
end;
Edit:
ho fatto delle prove mettendo un memo di nome page su un form e mi funziona.
Nella penultima riga del tuo codice, dovresti spazzare via (:D) l'istruzione 'page.Clear;' in quanto è fuori dall'if e quindi viene eseguito sempre, anche se l'interrogazione va a buon fine. Ho dei dubbi sul ciclo for e per questo l'ho commentato, non vorrei che il problema fosse tutto qua.
Manca anche la liberazione delle risorse (hhtp viene creato ma non distrutto), prova con questo spezzone di codice:
begin
http:=THTTPSend.Create;
try
Http.Sock.CreateWithSSL(TSSLOpenSSL);
http.Sock.SSLDoConnect;
if not http.HTTPMethod('GET',Url) then
begin
RecuperaSSLHtml:='';
exit;
end
else
begin
page.Lines.LoadFromStream(http.Document);
//for i:=0 to page.Count-1 do
// risultato:=risultato + UpCase(page[i]);
end;
finally
http.Free;
end;
end;
PS:
page di che tipo è?
Ora però ho un altro problema, quando eseguo una ricerca con google mi restituisce:
<!DOCTYPE HTML><HTML LANG=EN> <META CHARSET=UTF-8> <META NAME=VIEWPORT CONTENT="INITIAL-SCALE=1, MINIMUM-SCALE=1, WIDTH=DEVICE-WIDTH"> <TITLE>ERROR 404 (NOT FOUND)!!1</TITLE> <STYLE> *{MARGIN:0;PADDING:0}HTML,CODE{FONT:15PX/22PX ARIAL,SANS-SERIF}HTML{BACKGROUND:#FFF;COLOR:#222;PADDING:15PX}BODY{MARGIN:7% AUTO 0;MAX-WIDTH:390PX;MIN-HEIGHT:180PX;PADDING:30PX 0 15PX}* > BODY{BACKGROUND:URL(//WWW.GOOGLE.COM/IMAGES/ERRORS/ROBOT.PNG) 100% 5PX NO-REPEAT;PADDING-RIGHT:205PX}P{MARGIN:11PX 0 22PX;OVERFLOW:HIDDEN}INS{COLOR:#777;TEXT-DECORATION:NONE}A IMG{BORDER:0}@MEDIA SCREEN AND (MAX-WIDTH:772PX){BODY{BACKGROUND:NONE;MARGIN-TOP:0;MAX-WIDTH:NONE;PADDING-RIGHT:0}} </STYLE> <A HREF=//WWW.GOOGLE.COM/><IMG SRC=//WWW.GOOGLE.COM/IMAGES/ERRORS/LOGO_SM.GIF ALT=GOOGLE></A> <P><B>404.</B> <INS>THAT’S AN ERROR.</INS> <P>THE REQUESTED URL <CODE>/%23Q=WEBMAIL</CODE> WAS NOT FOUND ON THIS SERVER. <INS>THAT’S ALL WE KNOW.</INS>
La sintassi della ricerca è
https://www.google.it/#q=webmail
se lo inserisco nel browser ovviamente funziona, mi sa che si tratta di cookies o altro. Qualcuno ha qualche idea?
Non è che il carattere # non venga correttamente codificato?
THE REQUESTED URL <code>/%23Q=WEBMAIL</CODE> WAS NOT FOUND ON THIS SERVER.
In php sposti il browser ad nuovo link così
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.miosito.it/nuova_pagina.php");
?>
Sono 2 header 😉
Ciao,
questo è quello che lancio:
if (not fHTTP.HTTPMethod('HEAD', LinkInternet)) then begin
E questo è l'header di ritorno (ho oscurato il link ....):
HTTP/1.1 301 Moved Permanently
Date: Sat, 15 Sep 2018 15:41:03 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=kkj3trop6eupsk9jh5pkqgvbn3; path=/
Location: https://xxxxxxxx.com/2013/11/10/yyyyyyyyyyyyyy/
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Il link della riga "Location:" è lo stesso che uso io per la chiamata !!!
Forse l'informazione che cerco è sul secondo haeder, ma come faccio a scaricare il secondo header ???
Grazie, Mario
Ok, ho risolto e ora è tornato a funzionare tutto come sempre.
In pratica sembra esserci una incompatibilità tra la libreia synapse 40 e la libreria di sistema (Linux, Raspbian Stretch) che gestisce il protocollo SSL.
In Raspbian Stertch, tra le librerie di sistema presenti c'è sia la libssl_1.1.0 sia la libssl_1.0.2.
Un link simbolico fa in modo a tutto il sistema (e a chi ne ha bisogno) veda la nuova versione 1.1 e infatti synapse usa ciò che il sistema gli dice di utilizzare, purtroppo però l'interrogazione tramite HTTSender su un server via HTTPS genera un errore 500 (Internal Server Error).
Questo errore però può trarre in inganno in quanto (in genere) è un errore lato server più che lato client, ma non in questo caso.
Per ovviare al problema ci sono due strade:
1) modificare il link simbolico in modo che punti alla libssl 1.0.2, però se funziona con synapse non è detto che altri programmi o servizi di sistema invece si aspettino la libreria più aggiornata e cioè la 1.1
2) modificare il file ssl_openssl_lib.pas di synapse, modificando le righe:
DLLSSLName = 'libssl.so';
DLLUtilName = 'libcrypto.so';
con
DLLSSLName = '/usr/lib/arm-linux-gnueabihf/libssl.so.1.0.2';
DLLUtilName = '/usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.2';
*** non ho provato col full-path e se non funziona provare solo con 'libssl.so.1.0.2' e 'libcrypto.so.1.0.2' ***
dovete ovviamente sotituire la vers. 1.0.2 con quella presente nel vostro sistema (basta che sia inferiore alla 1.1 -> non l'ho testato ma credo che qualunque libreria 1.0.x funzioni senza problemi).
In effetti leggendo il commento introduttivo del file ssl_opnessl.pas di synapse si evince che...
Compatibility with OpenSSL versions:
0.9.6 should work, known mysterious crashing on FreePascal and Linux platform.
0.9.7 - 1.0.0 working fine.
1.1.0 should work, under testing.
OpenSSL libraries are loaded dynamicly - you not need OpenSSL librares even you
compile your application with this unit. SSL just not working when you not have
OpenSSL libraries.
...che sostiene in pieno l'ipotesi di non ancora piena compatibilità tra synapse 40 e la nuova libreria libssl 1.1
Ciao e scusate il mega post :D
Prova con un:
sudo find / | grep -i libssl
e manda output
meglio ancora:
sudo apt list --installed | grep -i libssl