如何从delphi获取google pagerank
任何人都可以展示示例代码,如何从delphi获得GooglePageRank?e、 g.使用INDY。如何从delphi获取google pagerank,delphi,pagerank,Delphi,Pagerank,任何人都可以展示示例代码,如何从delphi获得GooglePageRank?e、 g.使用INDY。 我的意思是不使用外部PHP脚本。所以我的意思是直接从delphi调用google服务器,解码数据并显示站点(页面)pagerank。通过@Joe引用的线程中的代码,我成功地生成了这个delphi代码。尝试使用它时,我发现google使用了不同的算法来检查Unicode请求的哈希。由于不再引用该算法,也没有时间继续研究,我对其进行了一些调整,以使用IOHandler的DirectWrite方法而
我的意思是不使用外部PHP脚本。所以我的意思是直接从delphi调用google服务器,解码数据并显示站点(页面)pagerank。通过@Joe引用的线程中的代码,我成功地生成了这个delphi代码。尝试使用它时,我发现google使用了不同的算法来检查Unicode请求的哈希。由于不再引用该算法,也没有时间继续研究,我对其进行了一些调整,以使用IOHandler的DirectWrite方法而不是通常的Writeln或IDTCPClient.WriteHeaders发送Ansi字符的请求 重要的是,它似乎起作用了 类别定义:
TPageRankCalc = class
private
protected
class function PageRankStrToNum(const S: string; Check: Int64; Magic: Cardinal): Int64;
class function PageRankHashURL(const S: string): Int64;
class function CheckHash(HashNum: Int64): AnsiString;
public
class function SearchURI(const url: AnsiString): AnsiString;
end;
类实现:
class function TPageRankCalc.CheckHash(HashNum: Int64): AnsiString;
var
CheckByte: Int64;
Flag: Integer;
HashStr: AnsiString;
Len: Integer;
I: Integer;
Re: Byte;
begin
CheckByte := 0;
Flag := 0;
HashStr := Format('%d', [HashNum]);
Len := Length(HashStr);
for I := Len downto 1 do
begin
Re := StrToInt(HashStr[I]);
if (Flag mod 2) = 1 then
begin
Re := Re + Re;
Re := (Re div 10) + (Re mod 10);
end;
CheckByte := CheckByte + Re;
Inc(Flag);
end;
CheckByte := CheckByte mod 10;
if (CheckByte <> 0) then
begin
CheckByte := 10 - CheckByte;
if (Flag mod 2) = 1 then
begin
if (CheckByte mod 2) = 1 then
CheckByte := CheckByte + 9;
CheckByte := CheckByte shr 1;
end;
end;
Result := '7' + IntToStr(CheckByte) + HashStr;
end;
class function TPageRankCalc.PageRankHashURL(const S: string): Int64;
var
Check1, Check2: Int64;
T1, T2: Int64;
begin
Check1 := PageRankStrToNum(S, $1505, $21);
Check2 := PageRankStrToNum(S, $0, $1003F);
Form2.Label5.Caption := FormatBin(Check1);
Form2.Label8.Caption := FormatBin(Check2);
Check1 := Check1 shr 2;
Form2.Label6.Caption := FormatBin(Check1);
Check1 := ((Check1 shr 4) and $3FFFFC0) or (Check1 and $3F);
Check1 := ((Check1 shr 4) and $3FFC00) or (Check1 and $3FF);
Check1 := ((Check1 shr 4) and $3C000) or (Check1 and $3FFF);
T1 := ((((Check1 and $3C0) shl 4) or (Check1 and $3C)) shl 2) or (Check2 and $F0F);
T2 := ((((Check1 and $FFFFC000) shl 4) or (Check1 and $3C00)) shl $A) or (Check2 and $F0F0000);
Result := T1 or T2;
end;
class function TPageRankCalc.PageRankStrToNum(const S: string; Check: Int64; Magic: Cardinal): Int64;
const
Int32Uint = 4294967296;
var
_length: integer;
I: Integer;
begin
Result := Check;
_length := Length(S);
for I := 1 to _length do
begin
Result := Result * Magic;
if (Result >= Int32Uint) then
begin
Result := Result - Int32Uint * Integer(Result div Int32UInt); //should be div?
if Result < -2147483648 then
Result := Result + Int32UInt;
end;
Result := Result + Ord(S[I]);
end;
end;
class function TPageRankCalc.SearchURI(const url: AnsiString): AnsiString;
begin
Result := '/search?client=navclient-auto&ch=' + CheckHash(PageRankHashURL(url)) + '&features=Rank&q=info:'+url+'&num=100&filter=0';
end;
类函数TPageRankCalc.CheckHash(HashNum:Int64):AnsiString;
变量
校验字节:Int64;
标志:整数;
HashStr:AnsiString;
Len:整数;
I:整数;
Re:字节;
开始
校验字节:=0;
标志:=0;
HashStr:=格式('%d',[HashNum]);
Len:=长度(HashStr);
对于I:=Len downto 1 do
开始
Re:=stroint(HashStr[I]);
如果(标志mod 2)=1,则
开始
Re:=Re+Re;
Re:=(Re div 10)+(Re mod 10);
结束;
校验字节:=校验字节+Re;
公司(旗);
结束;
校验字节:=校验字节模块10;
如果(检查字节0),则
开始
校验字节:=10-校验字节;
如果(标志mod 2)=1,则
开始
如果(校验字节mod 2)=1,则
校验字节:=校验字节+9;
校验字节:=校验字节shr 1;
结束;
结束;
结果:='7'+IntToStr(CheckByte)+HashStr;
结束;
类函数TPageRankCalc.PageRankHashURL(常量S:string):Int64;
变量
Check1,Check2:Int64;
T1,T2:Int64;
开始
支票1:=PageRankStrToNum(S$1505$21);
检查2:=PageRankStrToNum(S,$0,$1003F);
Form2.Label5.Caption:=FormatBin(选中1);
Form2.Label8.Caption:=FormatBin(选中2);
Check1:=Check1 shr 2;
Form2.Label6.Caption:=FormatBin(选中1);
检查1:=((检查1 shr 4)和$3FFFFC0)或(检查1和$3F);
支票1:=((支票1 shr 4)和$3FFC00)或(支票1和$3FF);
支票1:=((支票1 shr 4)和$3C000)或(支票1和$3FFF);
T1:=(((支票1和$3C0)第4列)或(支票1和$3C))第2列)或(支票2和$F0F);
T2:=(((支票1和$FFFFC000)第4列)或(支票1和$3C00))第1列$A)或(支票2和$F0000);
结果:=T1或T2;
结束;
类函数TPageRankCalc.PageRankStrToNum(常量S:string;检查:Int64;魔术:基数):Int64;
常数
Int32Uint=4294967296;
变量
_长度:整数;
I:整数;
开始
结果:=检查;
_长度:=长度(S);
对于I:=1到_长度do
开始
结果:=结果*魔术;
如果(结果>=Int32Uint),则
开始
结果:=Result-Int32Uint*整数(Result div Int32Uint)//应该是div吗?
如果结果<-2147483648,则
结果:=Result+Int32UInt;
结束;
结果:=结果+Ord(S[I]);
结束;
结束;
类函数TPageRankCalc.SearchURI(constURL:AnsiString):AnsiString;
开始
结果:='/search?client=navclient auto&ch='+CheckHash(pagerankhashull(url))+'&features=Rank&q=info:'+url+'&num=100&filter=0';
结束;
类别用途:
procedure TForm2.Button1Click(Sender: TObject);
var
Msg: AnsiString;
Rsp: TStringList;
S: string;
PIni: Integer;
sPR: string;
begin
IdTCPClient1.Host := 'toolbarqueries.google.com';
IdTCPClient1.Port := 80;
Msg := '';
Rsp := TStringList.Create;
try
Msg := Msg + Format('GET %s HTTP/1.1', [TPageRankCalc.SearchURI(LabeledEdit1.Text)]) + #13#10;
Msg := Msg + 'Host: toolbarqueries.google.com' + #13#10;
Msg := Msg + 'User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)' + #13#10;
Msg := Msg + 'Connection: Close' + #13#10;
Msg := Msg + '' + #13#10; //header end
IdTCPClient1.Connect;
try
IdTCPClient1.IOHandler.WriteDirect(TBytes(@Msg[1]), Length(Msg));
try
repeat
s := IdTCPClient1.IOHandler.ReadLn();
if IdTCPClient1.IOHandler.ReadLnTimedout then
S := '';
Rsp.Add(s);
IdTCPClient1.IOHandler.ReadStrings(Rsp);
until false;
except
on EIdConnClosedGracefully do
IdTCPClient1.Disconnect;
end;
sPR := 'Error';
if Rsp[0]='HTTP/1.1 200 OK' then
begin
PIni := Pos('Rank_', Rsp[Rsp.Count - 1]);
if PIni <> 0 then
sPR := Copy(Rsp[Rsp.Count - 1], PIni + 9, MaxInt);
end;
ShowMessage('Page rank is: ' + sPR);
finally
if IdTCPClient1.Connected then
IdTCPClient1.Disconnect;
end;
finally
Rsp.Free;
end;
end;
procedure TForm2.按钮1单击(发送方:TObject);
变量
Msg:AnsiString;
Rsp:TStringList;
S:字符串;
PIni:整数;
sPR:字符串;
开始
IdTCPClient1.Host:=“toolbarquerys.google.com”;
IdTCPClient1.端口:=80;
味精:='';
Rsp:=TStringList.Create;
尝试
Msg:=Msg+格式('GET%s HTTP/1.1',[TPageRankCalc.SearchURI(LabeledEdit1.Text)])+#13#10;
Msg:=Msg+'主机:toolbarquerys.google.com'+#13#10;
Msg:=Msg+'用户代理:Mozilla/4.0(兼容;GoogleToolbar 2.0.114-big;Windows XP 5.1)+#13#10;
Msg:=Msg+'连接:关闭'+#13#10;
味精:=味精+“”+#13#10//收割台端
IdTCPClient1.Connect;
尝试
IdTCPClient1.IOHandler.WriteDirect(TBytes(@Msg[1]),长度(Msg));
尝试
重复
s:=IdTCPClient1.IOHandler.ReadLn();
如果IdTCPClient1.IOHandler.ReadLnTimedout,则
S:='';
Rsp.Add(s);
IdTCPClient1.IOHandler.ReadStrings(Rsp);
直到错误;
除了
在艾德康纳德格拉斯做什么
IdTCPClient1.断开连接;
结束;
sPR:='错误';
如果Rsp[0]=“HTTP/1.1200正常”,则
开始
PIni:=Pos('Rank_',Rsp[Rsp.Count-1]);
如果PIni为0,则
sPR:=复制(Rsp[Rsp.Count-1],PIni+9,MaxInt);
结束;
ShowMessage('页面排名为:'+sPR);
最后
如果IdTCPClient1.已连接,则
IdTCPClient1.断开连接;
结束;
最后
无悬浮粒子;
结束;
结束;
编译器警告从AnsiString/Char到string/Char以及从AnsiString/Char到string/Char的隐式字符串转换。您必须对代码进行最后的改进,以使其能够更好地工作并进行干净的转换
我测试了两三个案例。。。由于我不是从php到Delphi的专家翻译,这是我错过的一个机会,所以我按原样给你,没有任何保证,等等等等
它适用于现代unicode Delphi版本(2009+)。我假设它将使用以前的版本编译,但我没有机会测试它。为什么不将此代码移植到delphi?