How to get google statistics maps using TIdHTTP?

I am trying to return content from maps.google.com from Delphi 2006 using the TIdHTTP component.

My code is as follows

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.012318' + '&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; 

However, I keep getting an HTTP / 1.0 403 Forbidden response. I assume this means that I do not have permission to execute this request, but if I copy the URL into my IE 8 web browser, it works fine. Is there any header information I need or something else?

+6
delphi google-maps
source share
6 answers

you execute a POST request, however your browser will execute a GET request; change your delphi code to execute a GET request.

Google may block UserAgent; try cleaning it or changing it to suit your browser.

+4
source

cloudstrif3, the value returned by the request is an image, not an html page, I just wrote this article Using Google Maps (Static Maps) without TWebBrowser on my blog so you can check the source code.

check this sample.

 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.012318' + '&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; 
+1
source

Are you behind a proxy server that requires authentication?

I no longer have Delphi, but I think Indy components support proxy authentication, something like ... (untested)

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

Like glob, you need to do Get () instead of Post (), for example:

 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.012318' + '&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; 
0
source
 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
source

I reinvent the wheel and encode the same thing from scratch :-)

This question explains why you get 403.

I added this line of code and it worked for me:
idHttp.request.useragent := 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)';

Yes, I understand that the question is 3 years old (and the answer has never been received), but I am adding this to help others.

0
source

All Articles