2010-04-23 22 views
6

Próbuję zwrócić zawartość z maps.google.com z Delphi 2006 przy użyciu komponentu TIdHTTP.Jak mogę pobrać mapy statyczne Google za pomocą TIdHTTP?

Mój kod wygląda następująco

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; 

Jednak wciąż otrzymuję odpowiedzi HTTP/1.0 403 Forbidden. Zakładam, że oznacza to, że nie mam pozwolenia na wykonanie tej prośby, ale jeśli skopiuję URL do mojej przeglądarki internetowej IE 8, to działa dobrze. Czy są jakieś informacje nagłówkowe, których potrzebuję, czy coś innego?

Odpowiedz

0

Czy jesteś za serwerem proxy, który wymaga uwierzytelnienia?

ja nie mają już zainstalowane Delphi, ale myślę, że Indy elementy obsługi uwierzytelniania serwera proxy, coś takiego ... (niesprawdzone)

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

robisz wniosek POST jednak przeglądarka robienie żądania GET; zmień kod delphi, aby wykonać także żądanie GET.

Google może być blokowany przez UserAgent; spróbuj wyczyścić lub zmienić, aby pasowała do przeglądarki.

0

jak glob powiedział, trzeba zrobić get() zamiast Post(), na przykład:

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, wartość zwracana przez wniosek jest obraz nie jest strona html, i Właśnie napisałem ten artykuł na swoim blogu na stronie Using Google maps (Static Maps) without TWebBrowser, abyś mógł sprawdzić kod źródłowy.

sprawdź tę próbkę.

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

mam wymyślać koło & kodowania samo od podstaw :-)

This question wyjaśnia dlaczego masz 403.

dodałem tego wiersza kodu & pracował dla ja:
idHttp.request.useragent := 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)';

Tak, nie mam alize, że pytanie ma 3 lata (i nigdy nie udzielono odpowiedzi), ale dołączam to, aby pomóc innym.

Powiązane problemy