Как я могу получить статические карты Google с TIdHTTP? - PullRequest
6 голосов
/ 23 апреля 2010

Я пытаюсь вернуть контент с maps.google.com из Delphi 2006 с помощью компонента TIdHTTP.

Мой код выглядит следующим образом

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;

Однако я продолжаю получать ответ HTTP / 1.0 403 Запрещено. Я предполагаю, что это означает, что у меня нет разрешения на выполнение этого запроса, но если я скопирую URL в мой веб-браузер IE 8, он будет работать нормально Есть ли какая-нибудь информация заголовка, которая мне нужна, или что-то еще?

Ответы [ 6 ]

4 голосов
/ 23 апреля 2010

вы делаете запрос POST, однако ваш браузер будет выполнять запрос GET; измените код Delphi, чтобы он также выполнял запрос GET.

Google может блокировать UserAgent; Попробуйте очистить или изменить его в соответствии с браузером.

1 голос
/ 11 августа 2010

cloudstrif3, значение, возвращаемое запросом, является изображением, а не HTML-страницей, я только что написал эту статью Использование карт Google (статических карт) без TWebBrowser в моем блоге, поэтому вы можете проверить исходный код.

проверьте этот образец.

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;
0 голосов
/ 23 февраля 2014

Я заново изобретаю колесо и кодирую то же самое с нуля: -)

Этот вопрос объясняет, почему вы получаете 403.

Я добавил эту строку кода, и у меня это сработало:
idHttp.request.useragent := 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)';

Да, я понимаю, что этому вопросу 3 года (и я так и не получил ответа), но я добавляю это, чтобы помочь другим.

0 голосов
/ 14 мая 2013
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 голосов
/ 27 апреля 2010

Как сказал glob, вам нужно выполнить Get () вместо Post (), например:

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 голосов
/ 23 апреля 2010

Вы находитесь за прокси-сервером, который нуждается в аутентификации?

У меня больше не установлен Delphi, но я думаю, что компоненты Indy поддерживают аутентификацию Proxy, что-то вроде ... (не проверено)

IdHTTP1.ProxyParams.ProxyServer := 'http://proxyaddress';
idHTTP1.ProxyParams.ProxyPort := 8080;
idHTTP.ProxyParams.ProxyUserName := 'name';
idHTTP.ProxyParams.ProxyPassword := 'pwd';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...