2010-04-23 45 views
6

Sto cercando di restituire il contenuto da maps.google.com da Delphi 2006 utilizzando il componente TIdHTTP.Come posso recuperare le mappe statiche di Google con TIdHTTP?

Il mio codice è il seguente

procedure TForm1.GetGoogleMap(); 
var 
    t_GetRequest: String; 
    t_Source: TStringList; 
    t_Stream: TMemoryStream; 
begin 
    t_Source := TStringList.Create; 

    try 
    t_Stream := TMemoryStream.Create; 

    try 
     t_GetRequest := 
     'http://maps.google.com/maps/api/staticmap?' + 
     'center=Brooklyn+Bridge,New+York,NY' + 
     '&zoom=14' + 
     '&size=512x512' + 
     '&maptype=roadmap' + 
     '&markers=color:blue|label:S|40.702147,-74.015794' + 
     '&markers=color:green|label:G|40.711614,-74.' + 
     '&markers=color:red|color:red|label:C|40.718217,-73.998284' + 
     '&sensor=false'; 

     IdHTTP1.Post(t_GetRequest, t_Source, t_Stream); 

     t_Stream.SaveToFile('google.html'); 
    finally 
     t_Stream.Free; 
    end; 
    finally 
    t_Source.Free; 
    end; 
end; 

Tuttavia continuo a ricevere la risposta HTTP/1.0 403 Forbidden. Presumo questo significa che non ho il permesso di fare questa richiesta ma se copio l'url nel mio browser IE 8, funziona bene. C'è qualche informazione di intestazione di cui ho bisogno o qualcos'altro?

risposta

0

Sei dietro un server proxy che richiede l'autenticazione?

io non ho Delphi installato più ma penso che i componenti Indy supportare l'autenticazione proxy, qualcosa di simile ... (non verificato)

IdHTTP1.ProxyParams.ProxyServer := 'http://proxyaddress'; 
idHTTP1.ProxyParams.ProxyPort := 8080; 
idHTTP.ProxyParams.ProxyUserName := 'name'; 
idHTTP.ProxyParams.ProxyPassword := 'pwd'; 
4

che stai facendo una richiesta POST, tuttavia il browser fare una richiesta GET; cambia il tuo codice delphi per fare anche una richiesta GET.

google potrebbe bloccare da UserAgent; prova a cancellarlo o cambiandolo per adattarlo al tuo browser.

0

Come glob Detto questo, è necessario fare un Get() invece di un post(), ad esempio:

procedure TForm1.GetGoogleMap(); 
var 
    t_GetRequest: String; 
    t_Stream: TMemoryStream; 
begin 
    t_Stream := TMemoryStream.Create; 
    try 
    t_GetRequest := 
     'http://maps.google.com/maps/api/staticmap?' + 
     'center=Brooklyn+Bridge,New+York,NY' + 
     '&zoom=14' + 
     '&size=512x512' + 
     '&maptype=roadmap' + 
     '&markers=color:blue|label:S|40.702147,-74.015794' + 
     '&markers=color:green|label:G|40.711614,-74.' + 
     '&markers=color:red|color:red|label:C|40.718217,-73.998284' + 
     '&sensor=false'; 

    IdHTTP1.Get(t_GetRequest, t_Stream); 

    t_Stream.SaveToFile('google.html'); 
    finally 
    t_Stream.Free; 
    end; 
end; 
1

cloudstrif3, il valore restituito dalla richiesta è un non un'immagine di una pagina html, i ho appena scritto questo articolo Using Google maps (Static Maps) without TWebBrowser sul mio blog, quindi puoi controllare il codice sorgente.

controllare questo esempio.

var 
    StreamData :TMemoryStream; 
    JPEGImage : TJPEGImage; 
    Url  : string; 
begin 
    Url  :='http://maps.google.com/maps/api/staticmap?' + 
    'center=Brooklyn+Bridge,New+York,NY' + 
    '&zoom=14' + 
    '&size=512x512' + 
    '&maptype=roadmap' + 
    '&markers=color:blue|label:S|40.702147,-74.015794' + 
    '&markers=color:green|label:G|40.711614,-74.' + 
    '&markers=color:red|color:red|label:C|40.718217,-73.998284' + 
    '&format=jpg'; //i add this param to return a jpg image , because the default format used is png. 
    '&sensor=false'; 
    StreamData := TMemoryStream.Create; 
    JPEGImage := TJPEGImage.Create; 
    try 
    try 
    idhttp1.Get(Url, StreamData); //Send the request and get the image 
    StreamData.Seek(0,soFromBeginning); 
    JPEGImage.LoadFromStream(StreamData);//load the image in a Stream 
    ImageMap.Picture.Assign(JPEGImage);//Load the image in a Timage component 
    Except On E : Exception Do 
    MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0); 
    End; 
    finally 
    StreamData.free; 
    JPEGImage.Free; 
    end; 
end; 
0
const 
NONE    = $00; //Zero-value number 
INET_USERAGENT = 'Mozilla/4.0, Indy Library (Windows; en-US)'; 
INET_REDIRECT_MAX = 10; 
var 
    StreamData :TMemoryStream; 
    JPEGImage : TJPEGImage; 
    Url,html  : string; 

begin 
    idhttp1.request.userAgent:=INET_USERAGENT;        //Define user agent 
    idhttp1.redirectMaximum:=INET_REDIRECT_MAX;       //Redirect maxumum 
    idhttp1.handleRedirects:=INET_REDIRECT_MAX<>NONE; 
    Url  :=edit1.Text; 
    StreamData := TMemoryStream.Create; 
    JPEGImage := TJPEGImage.Create; 

    try 
    try 
    html:= idhttp1.Get(Url); //Send the request and get the image 

    idhttp1.Get(Url, StreamData); //Send the request and get the image 
    StreamData.Seek(0,soFromBeginning); 
    memo1.Lines.Text:=html; 
    JPEGImage.LoadFromStream(StreamData);//load the image in a Stream 
    ImageMap.Picture.Assign(JPEGImage);//Load the image in a Timage component 

    Except On E : Exception Do 
    MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0); 
    End; 
    finally 
    StreamData.free; 
    JPEGImage.Free; 
    end; 
end; 
0

sto reinventare la ruota & codifica la stessa cosa da zero :-)

This question spiega perché si ottiene 403.

ho aggiunto questa riga di codice & ha funzionato per me:
idHttp.request.useragent := 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)';

Sì, io ri Alize che la domanda è di 3 anni (e mai assegnata una risposta), ma aggiungo questo per aiutare gli altri.

Problemi correlati