Get Google PageRank From Shell

December 23rd, 2006

Domain name in, Google PageRank (toolbar value) out. Examples of usage:

[~]$ pr rubyonrails.com
8
[~]$ pr del.icio.us
8
[~]$ pr http://script.aculo.us
7
[~]$ pr dairon.net
4
[~]$ pr apple.com
10

Here is a Ruby code:

    1 #!/usr/bin/env ruby -w
    2 
    3 # Google PageRank
    4 # K.Kodama 2004-09-01
    5 # Original: http://blog.outer-court.com/archive/2004_06_27_index.html#108834386239051706
    6 # modified by dairon
    7 
    8 require "net/http"
    9 require "getoptlong"
   10 
   11 M = 0x100000000 # modulo for unsigned int 32bit(4byte)
   12 
   13 def m1(a,b,c,d) # mix/power mod
   14   return (((a+(M-b)+(M-c))%M)^(d%M))%M
   15 end
   16 
   17 def c2i(s = "", k = 0) # char codes to int. Little Endian
   18   return ((s[k+3].to_i*0x100+s[k+2].to_i)*0x100+s[k+1].to_i)*0x100+s[k].to_i
   19 end
   20 
   21 def mix(a,b,c)
   22   a = a%M; b = b%M; c = c%M
   23   a = m1(a, b, c, c >> 13); b = m1(b, c, a, a <<  8); c = m1(c, a, b, b >> 13);
   24   a = m1(a, b, c, c >> 12); b = m1(b, c, a, a << 16); c = m1(c, a, b, b >>  5);
   25   a = m1(a, b, c, c >>  3); b = m1(b, c, a, a << 10); c = m1(c, a, b, b >> 15);
   26   return [a,b,c];
   27 end
   28 
   29 def check_sum(url)
   30   a = 0x9E3779B9; b = 0x9E3779B9; c = 0xE6359A60;
   31   iurl = "info:"+url; len = iurl.size; k=0;
   32   while(len >= k+12) do
   33     a += c2i(iurl,k);
   34     b += c2i(iurl,k+4);
   35     c += c2i(iurl,k+8);
   36     a,b,c = mix(a,b,c);
   37     k = k+12
   38   end
   39   a += c2i(iurl,k);
   40   b += c2i(iurl,k+4);
   41   c += (c2i(iurl,k+8)<<8)+len;
   42   a,b,c = mix(a,b,c);
   43   return c;
   44 end
   45 
   46 def get_pr(url) # get Google PageRank
   47   port = 80
   48   ch = check_sum(url);
   49   g_path = sprintf("/search?client=navclient-auto&failedip=216.239.51.102;821&ch=6%u&q=info:%s", ch, url);
   50   p = "" # rank
   51   Net::HTTP::new("toolbarqueries.google.com", port).get(g_path) do |line|
   52     pos = line.index("<RK>") # format: <RK>(rank)</RK>
   53     if pos != nil
   54       p = (line[pos+4,2]).to_i;
   55       break;
   56     end;
   57   end
   58   if p.size > 0
   59     return p.to_i
   60   elsif (url[-1,1] != "/")
   61     return get_pr(url+"/");
   62   else return -1;
   63   end
   64 end
   65 
   66 if ARGV.empty?
   67   puts <<-T
   68 google pagerank by dairon
   69 usage: pr <url>
   70   T
   71   exit
   72 end
   73 
   74 puts get_pr(ARGV[0])