这个东西实现了已经有一段时间了,那个时候谷歌还没有退出中国内地呢!而现在呢,谷歌都退了有一些日子了!紧以此纪念一番!
话说谷歌API,我相信很多人应该都知道!不晓得在实际应用中,用的人多不多(我说的不是Web方面的)。谷歌API提供了很多接口,但是貌似唯独没有提供对Delphi的接口(我们Delphi程序员果然很尴尬啊,很多类库,都没有我们的份,都需要自己来实现)。而我又需要这么个东西,于是,我就写了这么个东西,完全基于搜索API的封装!用来实现在自己的软件中实现搜索的目的!
谷歌的搜索API的详细资料在:
http://code.google.com/intl/zh-CN/apis/ajaxsearch/documentation/reference.html#_class_GSearch
有兴趣的,可以自行参考一下!因为这个资料已经说的很详细了,所以我也就不多费口舌了,直接上代码
代码:
代码
{Google搜索API 参考资料: http://code.google.com/intl/zh-CN/apis/ajaxsearch/documentation/reference.html#_class_GSearch 作者:不得闲 2010-4-1 } unit DxGoogleSearchApi;
interface uses Classes,SysUtils,msxml,uLkJSON,Variants;
type //搜索类型 Web搜索 本地搜索 视频搜索 博客 新闻 书籍 图片 专利搜索 TDxSearchType = (Sh_Web,Sh_Local,Sh_Video,Sh_Blog,Sh_News,Sh_Book,Sh_Image,Sh_patent);
//搜索返回的结果 TDxSearchRecord = class private RetList: TStringList; function GetFieldCount: Integer; function GetFields(index: Integer): string; function GetValues(index: Integer): string; public constructor Create; procedure FromJsonObj(JsonObj: TlkJSONobject); destructor Destroy;override; property FieldCount: Integer read GetFieldCount; property Fields[index: Integer]: string read GetFields; property Values[index: Integer]: string read GetValues; function FieldByName(FieldName: string): string; end;
TDxSearchRecords = class private List: TList; FSearchType: TDxSearchType; function GetCount: Integer; function GetRecords(index: Integer): TDxSearchRecord; public procedure Clear; constructor Create; property SearchType: TDxSearchType read FSearchType; destructor Destroy;override; property Count: Integer read GetCount; property Records[index: Integer]: TDxSearchRecord read GetRecords; end;
//搜索API TDxGoogleSearch = class private FSearchType: TDxSearchType; FBigSearchSize: Boolean; FSearchStart: Integer; FVersion: string; HttpReq: IXMLHttpRequest; FRecords: TDxSearchRecords; Pages: array of Integer; FCurSearchInfo: string; ClearOld: Boolean; FCurPageIndex: Integer; function GetPageCount: Integer; public constructor Create; destructor Destroy;override; procedure Search(SearchInfo: string); property CurPageIndex: Integer read FCurPageIndex; function NextSearch: Boolean;//搜索下一个页 property PageCount: Integer read GetPageCount; property Records: TDxSearchRecords read FRecords; property BigSearchSize: Boolean read FBigSearchSize write FBigSearchSize default true;//rsz参数 property SearchStart: Integer read FSearchStart write FSearchStart default 0;//搜索开始的位置,start参数 property Version: string read FVersion write FVersion; property SearchType: TDxSearchType read FSearchType write FSearchType default Sh_Web;//搜索类型 end; implementation
type TBytes = array of Byte;
function BytesOf(const Val: AnsiString): TBytes; var Len: Integer; begin Len := Length(Val); SetLength(Result, Len); Move(Val[1], Result[0], Len); end;
function ToUTF8Encode(str: string): string; var b: Byte; begin for b in BytesOf(UTF8Encode(str)) do Result := Format('%s%s%.2x', [Result, '%', b]); end;
{ TDxGoogleSearch }
constructor TDxGoogleSearch.Create; begin HttpReq := CoXMLHTTPRequest.Create; ClearOld := True; FRecords := TDxSearchRecords.Create; FVersion := '1.0'; FSearchType := Sh_Web; FBigSearchSize := True; FSearchStart := 0; end;
destructor TDxGoogleSearch.Destroy; begin HttpReq := nil; SetLength(Pages,0); FRecords.Free; inherited; end;
function TDxGoogleSearch.GetPageCount: Integer; begin Result := High(Pages) + 1; end;
function TDxGoogleSearch.NextSearch: Boolean; var i: Integer; begin Result := False; for i := 0 to High(Pages) do begin if Pages[i] = FSearchStart then begin if i + 1 <= High(Pages) then begin FSearchStart := Pages[i + 1]; Result := True; end; Break; end; end; if Result then Search(FCurSearchInfo); end;
procedure TDxGoogleSearch.Search(SearchInfo: string); const BaseUrl = 'http://ajax.googleapis.com/ajax/services/search/'; var Url: string; Json: TlkJsonObject; ChildJson,tmpJson: TlkJSONbase; SRecord: TDxSearchRecord; procedure OnSearch; var i: Integer; begin Url := Url + '&start='+inttostr(FSearchStart); HttpReq.open('Get', Url, False, EmptyParam, EmptyParam); HttpReq.send(EmptyParam);//开始搜索 Url := HttpReq.responseText; Json := Tlkjson.ParseText(url) as TlkJSONobject; ChildJson := Json.Field['responseData']; if ChildJson.SelfType = jsObject then begin ChildJson := ChildJson.Field['results']; if ChildJson.SelfType = jsList then begin for i := 0 to ChildJson.Count - 1 do begin tmpJson := ChildJson.Child[i]; SRecord := TDxSearchRecord.Create; SRecord.FromJsonObj(tmpJson as TlkJSONobject); FRecords.List.Add(SRecord); end; end; if ClearOld or (Length(Pages) = 0) then begin //查看分页情况,获得分页情况 ChildJson := Json.Field['responseData'].Field['cursor'].Field['pages']; if ChildJson.SelfType = jsList then begin SetLength(Pages,ChildJson.Count); for i := 0 to ChildJson.Count - 1 do begin tmpJson := ChildJson.Child[i]; Pages[i] := StrToInt(VarToStr(tmpJson.Field['start'].Value)); end; end; ChildJson := Json.Field['responseData'].Field['cursor']; FCurPageIndex := strtoint(vartostr(ChildJson.Field['currentPageIndex'].Value)); end else begin ChildJson := Json.Field['responseData'].Field['cursor']; FCurPageIndex := strtoint(vartostr(ChildJson.Field['currentPageIndex'].Value)); end; end; Json.Free; end; begin FCurSearchInfo := SearchInfo; case FSearchType of Sh_Web: Url := BaseUrl + 'web?v='+FVersion+'&q='; Sh_Local: Url := BaseUrl + 'local?v='+FVersion+'&q='; Sh_Video: Url := BaseUrl + 'video?v='+FVersion+'&q='; Sh_Blog: Url := BaseUrl + 'blogs?v='+FVersion+'&q='; Sh_News: Url := BaseUrl + 'news?v='+FVersion+'&q='; Sh_Book: Url := BaseUrl + 'books?v='+FVersion+'&q='; Sh_Image: Url := BaseUrl + 'images?v='+FVersion+'&q='; Sh_patent: Url := BaseUrl + 'patent?v='+FVersion+'&q='; else Url := ''; end; if Url <> '' then begin FRecords.FSearchType := FSearchType; if ClearOld then FRecords.Clear; Url := Url + ToUTF8Encode(SearchInfo); if FBigSearchSize then Url := Url + '&rsz=large' else Url := Url + '&rsz=small'; if FSearchStart < 0 then begin //搜索返回所有结果 ClearOld := False; FSearchStart := 0; OnSearch; while NextSearch do;//搜索下一个 end else begin OnSearch; end; end; end;
{ TDxSearchRecord }
constructor TDxSearchRecord.Create; begin RetList := TStringList.Create; end;
destructor TDxSearchRecord.Destroy; begin RetList.Free; inherited; end;
function TDxSearchRecord.FieldByName(FieldName: string): string; var index: Integer; begin index := RetList.IndexOfName(FieldName); if (index > -1) and (index < FieldCount) then Result := RetList.ValueFromIndex[index] else Result := ''; end;
procedure TDxSearchRecord.FromJsonObj(JsonObj: TlkJsonObject); var i: Integer; str: String; begin RetList.Clear; for i := 0 to JsonObj.Count - 1 do begin str := JsonObj.NameOf[i]; str := str + '=' + VarToStr(JsonObj.FieldByIndex[i].Value); RetList.Add(str); end; end;
function TDxSearchRecord.GetFieldCount: Integer; begin Result := RetList.Count; end;
function TDxSearchRecord.GetFields(index: Integer): string; begin if (index > -1) and (index < FieldCount) then Result := RetList.Names[index] else Result := ''; end;
function TDxSearchRecord.GetValues(index: Integer): string; begin if (index > -1) and (index < FieldCount) then Result := RetList.ValueFromIndex[index] else Result := ''; end;
{ TDxSearchRecords }
procedure TDxSearchRecords.Clear; begin while List.Count > 0 do begin TDxSearchRecord(List[List.Count - 1]).Free; List.Delete(List.Count - 1); end; end;
constructor TDxSearchRecords.Create; begin List := TList.Create; FSearchType := Sh_Web; end;
destructor TDxSearchRecords.Destroy; begin clear; List.Free; inherited; end;
function TDxSearchRecords.GetCount: Integer; begin Result := List.Count; end;
function TDxSearchRecords.GetRecords(index: Integer): TDxSearchRecord; begin if (index > -1) and (index < Count) then Result := List[index] else Result := nil; end;
end.
详细例子下载
作者:不得闲
出处:http://dxsoft.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 文连接,否则保留追究法律责任的权利。
|
请发表评论