如何从delphi获取google pagerank

如何从delphi获取google pagerank,delphi,pagerank,Delphi,Pagerank,任何人都可以展示示例代码,如何从delphi获得GooglePageRank?e、 g.使用INDY。 我的意思是不使用外部PHP脚本。所以我的意思是直接从delphi调用google服务器,解码数据并显示站点(页面)pagerank。通过@Joe引用的线程中的代码,我成功地生成了这个delphi代码。尝试使用它时,我发现google使用了不同的算法来检查Unicode请求的哈希。由于不再引用该算法,也没有时间继续研究,我对其进行了一些调整,以使用IOHandler的DirectWrite方法而

任何人都可以展示示例代码,如何从delphi获得GooglePageRank?e、 g.使用INDY。
我的意思是不使用外部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?