Google的搜索API的Delphi封装
这个东西实现了已经有一段时间了,那个时候谷歌还没有退出中国内地呢!而现在呢,谷歌都退了有一些日子了!紧以此纪念一番!
话说谷歌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.
Google的搜索API的Delphi封装的更多相关文章
- 使用Javascript从Google Places搜索api获取纬度和经度
如何使用谷歌地图搜索框api从搜索到的位置获取经度和纬度. 我使用与谷歌演示相同的代码 – https://developers.google.com/maps/documentation/javas ...
- 通过Google Custom Search API 进行站内搜索
今天突然想把博客的搜索改为google的站内搜索,印象中google adsense中好像提高这个站内搜索的代码,但苦逼的是google adsense帐号一直审核不通过,所以只能通过google c ...
- Google地图接口API之申请免费API Key(一)
使用谷歌地图API V3创建交互式地图,首先需要拥有一个免费的 Google 地图 API key. 如果想调用Google地图的接口,首先需要拥有一个免费的 Google 地图 API key.想要 ...
- google map android api v2
我在这主要列举几个需要注意的问题: 1.需要注意使用的api版本的问题,例如google map android api v1就和v2差别很大,包括申请key方面,所以在搜索资料的时候一定注意版本问题 ...
- ElasticSearch查询 第一篇:搜索API
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- [转]MBTiles 离线地图演示 - 基于 Google Maps JavaScript API v3 + SQLite
MBTiles 是一种地图瓦片存储的数据规范,它使用SQLite数据库,可大大提高海量地图瓦片的读取速度,比通过瓦片文件方式的读取要快很多,适用于Android.IPhone等智能手机的离线地图存储. ...
- 如何使用google地图的api(整理)
如何使用google地图的api(整理) 一.总结 一句话总结:直接用script标签引google地图api即可. 1.如何使用google地图的api? 页面引用javascript文件<s ...
- google批量搜索实现方式
本文主要记录一下最近所做的关于Google批量搜索的实现方式. 搜索目的: 获取关键词在某个域名下对应的Google搜索结果数 搜索方式: 关键词+inurl 例如:"爬虫" in ...
- 一个扩展搜索API的优化过程
概述 API 是一个服务的门面,就像衣装是人的形象一样. 优雅的 API 设计,能让业务方使用起来倍儿爽,提升开发效率,降低维护成本:糟糕的 API 设计,则让业务方遭心,陷入混沌. 本文将展示一个扩 ...
随机推荐
- linux服务器自动备份与删除postgres数据库数据
1.先创一个back.sh 文件,授权,然后在下面这个文件添加脚本 export PGPASSWORD='123456' #这是登录服务器密码cur_time=`date +%Y%m%d ...
- java 连接远程Linux 服务器
创建闭锁,确保能连接到zk服务器. // 创建闭锁final CountDownLatch countDownLatch = new CountDownLatch(1); String connect ...
- Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
原文:http://blog.csdn.net/liuyiming_/article/details/7704923 SharedPreferences介绍: SharedPreferences是An ...
- keil Bulid Ouput窗口中PROGRAM SIZE项的具体含义
在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI ...
- C/C++ - CallBack
这是实验楼上一个callback debug例子,我没有提交结果,但在本地上运行没有任何问题,也无警告: #include <stdio.h> #define MAX 3 typedef ...
- mysql innodb cluster 无感知集群
MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster 利用组复制的 pxos 协议,保障数据一致性 ...
- IDEA中找不到spring的配置文件,或者不存在某个目录(比如没有src 目录)
比如 项目中src目录找不到了,解决方式为: 这类问题都是设置这儿.
- windows XAMPP下安装mongoDB
1.下载 下载地址:http://www.mongodb.org/downloads 2.安装 进入cmd第一步:D:\xampp\mongodb\bin\mongod.exe --dbpath=D: ...
- 使用oracle 的 PL/Sql 定时执行一个存储过程
CSDN日报20170322--<关于软件研发的一些体会总结> 同步博客至 CSDN ,让更多开发者看到你的文章 看微博技术大咖解析互联网应用架构实战 使用oracle 的 PL/Sql ...
- pip3与pyttsx3文字语音转换
今天想做个语音读取的小脚本,在网上查了一下发现python里有个pyttsx可以识别文字, 打算通过pip3 install pyttsx安装包,结果报错, 然后试了一下发现不行,去网上查了一下发现p ...