Come utilizzare google da delphi

Come primo passo è necessario ottenere una google api key per poter utilizzare il WebService che Google ci mette a disposizione.
La si può ottenere qui http://google.com/apis/.

Una volta registrati si otterra’ la key via email.

In delphi 7 e successivi c’e’ un utile strumento, wsdl importer che importa i wsdl e ci crea un file di interfaccia verso gli oggetti messi a disposizione dal webservice.

Usarlo è piuttosto semplice:
Entriamo in delphi e dal menu
file->new->other
scegliamo
webservices->wsdl importer

Impostiamo l’url del wsdl in http://api.google.com/GoogleSearch.wsdl

Clicchiamo Next e poi Finish.

Nell’editor si aprira’ automaticamente il file GoogleSearch.pas.

In questo file troveremo, tra le altre cose, la definizione della classe GoogleSearchPort

La definizione:
[delphi]
GoogleSearchPort = interface(IInvokable)
[‘{0B396A82-A4DD-69A7-A771-6D80F8831A71}’]
function doGetCachedPage(const key: WideString; const url: WideString): TByteDynArray; stdcall;
function doSpellingSuggestion(const key: WideString; const phrase: WideString): WideString; stdcall;
function doGoogleSearch(const key: WideString; const q: WideString; const start: Integer; const maxResults: Integer; const filter: Boolean; const restrict: WideString; const safeSearch: Boolean; const lr: WideString; const ie: WideString; const oe: WideString
): GoogleSearchResult; stdcall;
end;
[/delphi]

Notare i tre metodi che Google ci mette a disposizione:

  • doGetCachedPage
  • doSpellingSuggestion
  • doGoogleSearch

Per testarli ho creato una form con un TEdit, un TMemo ed un TButton.
APIKEY rappresenta la key che ci ha fornito Google per poter utilizzare il WebService.

Proviamo i metodi uno ad uno.

doGetCachedPage

doGetCachedPage restituisce un TByteDynArray che troviamo nella unit types.

Quindi:
[delphi]
uses
GoogleSearch
, Types;

[/delphi]

Ciò che segue è come potrebbe essere una semplice funzione che usa il metodo doGetCachedPage:
[delphi]
var
googleResult : TByteDynArray;
google : GoogleSearchPort;
mPage : string;
i : integer;
begin
google := GetGoogleSearchPort();
googleResult := google.doGetCachedPage(APIKEY, edit1.Text);

mPage := ”;
for i := 0 to length(googleResult) – 1 do
begin
mPage := mPage + char(googleResult[i]);
end;
Memo1.Lines.Text := mPage;
end;
[/delphi]

doSpellingSuggestion

doSpellingSuggestion è il metodo più semplice dato che restituisce una semplice widestring.

[delphi]
var
google : GoogleSearchPort;
mWord : string;
begin
google := GetGoogleSearchPort();
mWord := google.doSpellingSuggestion(APIKEY, edit1.Text);

Memo1.Clear;
memo1.Lines.Add(mWord);
end;
[/delphi]

doGoogleSearch

doGoogleSearch è il metodo che ci permette di effettuare ricerche.

Richiede questi parametri:

  • key Google Api key
  • q Il testo che stiamo cercando
  • start Da quale risultato partiamo
  • maxResults Quanti risultati volgiamo
  • filter Filtrare i risultati simili
  • restrict Restrizione di nazione o argomento
  • safeSearch filtro pornografia
  • lr restrizione di lingua
  • ie input encoding
  • oe output encoding

nessuno dei quali e’ opzionale.

doGoogleSearch restituisce un oggetto di tipo GoogleSearchResult anch’esso definito nel wsdl e di conseguenza nel nostro GoogleSearch.pas generato automaticamente da wsdl importer.

Questa la dichiarazione:
[delphi]
GoogleSearchResult = class(TRemotable)

published
property documentFiltering: Boolean;
property searchComments: WideString;
property estimatedTotalResultsCount: Integer;
property estimateIsExact: Boolean;
property resultElements: ResultElementArray;
property searchQuery: WideString;
property startIndex: Integer;
property endIndex: Integer;
property searchTips: WideString;
property directoryCategories: DirectoryCategoryArray;
property searchTime: Double;
end;
[/delphi]

Un altro oggetto importante è ResultElement, ovvero ogni singolo risultato della ricerca. La dichiarazione:
[delphi]
ResultElement = class(TRemotable)

published
property summary: WideString;
property URL: WideString;
property snippet: WideString;
property title: WideString;
property cachedSize: WideString;
property relatedInformationPresent: Boolean;
property hostName: WideString;
property directoryCategory: DirectoryCategory;
property directoryTitle: WideString;
end;
[/delphi]

Vediamo un po’ come possiamo implementare una semplice ricerca:

[delphi]
var
googleResult : GoogleSearchResult;
google : GoogleSearchPort;
i : integer;
begin
google := GetGoogleSearchPort();
googleResult := google.doGoogleSearch(
APIKEY, Edit1.Text, 0, 10, False, ”, False, ”, ”, ”);

Memo1.Clear;

Memo1.Lines.Add(‘Trovati ‘ + IntToStr(googleResult.estimatedTotalResultsCount) + ‘ risultati:’;
Memo1.Lines.Add(”);
for i := Low(googleResult.resultElements) to High(googleResult.resultElements) do
begin
Memo1.Lines.Add(IntToStr(i + 1));
Memo1.Lines.Add(googleResult.resultElements[i].title);
Memo1.Lines.Add(googleResult.resultElements[i].URL);
Memo1.Lines.Add(”);
end;
end;
[/delphi]

Allego un progettino di esempio dove ho cercato di utilizzare tutte le proprietà disponibili di GoogleSearchResult e di ResultElement:
TestGoogleSearch

Tags: , , , ,

Reply

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *