| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package WWW::Google::PageRank; | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | # -*- perl -*- | 
| 4 |  |  |  |  |  |  |  | 
| 5 | 3 |  |  | 3 |  | 44876 | use strict; | 
|  | 3 |  |  |  |  | 7 |  | 
|  | 3 |  |  |  |  | 99 |  | 
| 6 | 3 |  |  | 3 |  | 15 | use warnings; | 
|  | 3 |  |  |  |  | 4 |  | 
|  | 3 |  |  |  |  | 98 |  | 
| 7 |  |  |  |  |  |  |  | 
| 8 | 3 |  |  | 3 |  | 14 | use vars qw($VERSION); | 
|  | 3 |  |  |  |  | 9 |  | 
|  | 3 |  |  |  |  | 149 |  | 
| 9 |  |  |  |  |  |  |  | 
| 10 | 3 |  |  | 3 |  | 3078 | use LWP::UserAgent; | 
|  | 3 |  |  |  |  | 244188 |  | 
|  | 3 |  |  |  |  | 116 |  | 
| 11 | 3 |  |  | 3 |  | 35 | use URI::Escape; | 
|  | 3 |  |  |  |  | 7 |  | 
|  | 3 |  |  |  |  | 5080 |  | 
| 12 |  |  |  |  |  |  |  | 
| 13 |  |  |  |  |  |  | $VERSION = '0.17'; | 
| 14 |  |  |  |  |  |  |  | 
| 15 |  |  |  |  |  |  | sub new { | 
| 16 | 0 |  |  | 0 | 1 | 0 | my $class = shift; | 
| 17 | 0 |  |  |  |  | 0 | my %par = @_; | 
| 18 | 0 |  |  |  |  | 0 | my $self; | 
| 19 | 0 | 0 | 0 |  |  | 0 | $self->{ua} = LWP::UserAgent->new(agent => $par{agent} || | 
| 20 |  |  |  |  |  |  | 'Mozilla/4.0 (compatible; GoogleToolbar 2.0.111-big; Windows XP 5.1)') | 
| 21 |  |  |  |  |  |  | or return; | 
| 22 | 0 | 0 |  |  |  | 0 | $self->{ua}->env_proxy if $par{env_proxy}; | 
| 23 | 0 | 0 |  |  |  | 0 | $self->{ua}->proxy('http', $par{proxy}) if $par{proxy}; | 
| 24 | 0 | 0 |  |  |  | 0 | $self->{ua}->timeout($par{timeout}) if $par{timeout}; | 
| 25 | 0 |  | 0 |  |  | 0 | $self->{host} = $par{host} || 'toolbarqueries.google.com'; | 
| 26 | 0 |  |  |  |  | 0 | bless($self, $class); | 
| 27 |  |  |  |  |  |  | } | 
| 28 |  |  |  |  |  |  |  | 
| 29 |  |  |  |  |  |  | sub get { | 
| 30 | 0 |  |  | 0 | 1 | 0 | my ($self, $url) = @_; | 
| 31 | 0 | 0 | 0 |  |  | 0 | return unless defined $url and $url =~ m[^https?://]i; | 
| 32 |  |  |  |  |  |  |  | 
| 33 | 0 |  |  |  |  | 0 | my $ch = '6' . _compute_ch_new('info:' . $url); | 
| 34 | 0 |  |  |  |  | 0 | my $query = 'http://' . $self->{host} . '/tbr?client=navclient-auto&ch=' . $ch . | 
| 35 |  |  |  |  |  |  | '&ie=UTF-8&oe=UTF-8&features=Rank&q=info:' . uri_escape($url); | 
| 36 |  |  |  |  |  |  |  | 
| 37 | 0 |  |  |  |  | 0 | my $resp = $self->{ua}->get($query); | 
| 38 | 0 | 0 | 0 |  |  | 0 | if ($resp->is_success && $resp->content =~ /Rank_\d+:\d+:(\d+)/) { | 
| 39 | 0 | 0 |  |  |  | 0 | if (wantarray) { | 
| 40 | 0 |  |  |  |  | 0 | return ($1, $resp); | 
| 41 |  |  |  |  |  |  | } else { | 
| 42 | 0 |  |  |  |  | 0 | return $1; | 
| 43 |  |  |  |  |  |  | } | 
| 44 |  |  |  |  |  |  | } else { | 
| 45 | 0 | 0 |  |  |  | 0 | if (wantarray) { | 
| 46 | 0 |  |  |  |  | 0 | return (undef, $resp); | 
| 47 |  |  |  |  |  |  | } else { | 
| 48 | 0 |  |  |  |  | 0 | return; | 
| 49 |  |  |  |  |  |  | } | 
| 50 |  |  |  |  |  |  | } | 
| 51 |  |  |  |  |  |  | } | 
| 52 |  |  |  |  |  |  |  | 
| 53 |  |  |  |  |  |  | sub _compute_ch_new { | 
| 54 | 16 |  |  | 16 |  | 308 | my $url = shift; | 
| 55 |  |  |  |  |  |  |  | 
| 56 | 16 |  |  |  |  | 31 | my $ch = _compute_ch($url); | 
| 57 | 16 |  |  |  |  | 39 | $ch = (($ch % 0x0d) & 7) | (($ch / 7) << 2); | 
| 58 |  |  |  |  |  |  |  | 
| 59 | 16 |  |  |  |  | 30 | return _compute_ch(pack("V20", map {my $t = $ch; _wsub($t, $_*9); $t} 0..19)); | 
|  | 320 |  |  |  |  | 289 |  | 
|  | 320 |  |  |  |  | 455 |  | 
|  | 320 |  |  |  |  | 486 |  | 
| 60 |  |  |  |  |  |  | } | 
| 61 |  |  |  |  |  |  |  | 
| 62 |  |  |  |  |  |  | sub _compute_ch { | 
| 63 | 32 |  |  | 32 |  | 38 | my $url = shift; | 
| 64 |  |  |  |  |  |  |  | 
| 65 | 32 |  |  |  |  | 262 | my @url = unpack("C*", $url); | 
| 66 | 32 |  |  |  |  | 89 | my ($a, $b, $c, $k) = (0x9e3779b9, 0x9e3779b9, 0xe6359a60, 0); | 
| 67 | 32 |  |  |  |  | 40 | my $len = scalar @url; | 
| 68 |  |  |  |  |  |  |  | 
| 69 | 32 |  |  |  |  | 74 | while ($len >= 12) { | 
| 70 | 144 |  |  |  |  | 464 | _wadd($a, $url[$k+0] | ($url[$k+1] << 8) | ($url[$k+2] << 16) | ($url[$k+3] << 24)); | 
| 71 | 144 |  |  |  |  | 346 | _wadd($b, $url[$k+4] | ($url[$k+5] << 8) | ($url[$k+6] << 16) | ($url[$k+7] << 24)); | 
| 72 | 144 |  |  |  |  | 329 | _wadd($c, $url[$k+8] | ($url[$k+9] << 8) | ($url[$k+10] << 16) | ($url[$k+11] << 24)); | 
| 73 |  |  |  |  |  |  |  | 
| 74 | 144 |  |  |  |  | 220 | _mix($a, $b, $c); | 
| 75 |  |  |  |  |  |  |  | 
| 76 | 144 |  |  |  |  | 211 | $k += 12; | 
| 77 | 144 |  |  |  |  | 299 | $len -= 12; | 
| 78 |  |  |  |  |  |  | } | 
| 79 |  |  |  |  |  |  |  | 
| 80 | 32 |  |  |  |  | 51 | _wadd($c, scalar @url); | 
| 81 |  |  |  |  |  |  |  | 
| 82 | 32 | 50 |  |  |  | 62 | _wadd($c, $url[$k+10] << 24) if $len > 10; | 
| 83 | 32 | 100 |  |  |  | 57 | _wadd($c, $url[$k+9] << 16) if $len > 9; | 
| 84 | 32 | 100 |  |  |  | 67 | _wadd($c, $url[$k+8] << 8) if $len > 8; | 
| 85 | 32 | 100 |  |  |  | 81 | _wadd($b, $url[$k+7] << 24) if $len > 7; | 
| 86 | 32 | 100 |  |  |  | 77 | _wadd($b, $url[$k+6] << 16) if $len > 6; | 
| 87 | 32 | 100 |  |  |  | 82 | _wadd($b, $url[$k+5] << 8) if $len > 5; | 
| 88 | 32 | 100 |  |  |  | 69 | _wadd($b, $url[$k+4]) if $len > 4; | 
| 89 | 32 | 100 |  |  |  | 79 | _wadd($a, $url[$k+3] << 24) if $len > 3; | 
| 90 | 32 | 100 |  |  |  | 80 | _wadd($a, $url[$k+2] << 16) if $len > 2; | 
| 91 | 32 | 100 |  |  |  | 84 | _wadd($a, $url[$k+1] << 8) if $len > 1; | 
| 92 | 32 | 50 |  |  |  | 80 | _wadd($a, $url[$k]) if $len > 0; | 
| 93 |  |  |  |  |  |  |  | 
| 94 | 32 |  |  |  |  | 50 | _mix($a, $b, $c); | 
| 95 |  |  |  |  |  |  |  | 
| 96 | 32 |  |  |  |  | 115 | return $c; # integer is positive always | 
| 97 |  |  |  |  |  |  | } | 
| 98 |  |  |  |  |  |  |  | 
| 99 |  |  |  |  |  |  | sub _mix { | 
| 100 | 176 |  |  | 176 |  | 218 | my ($a, $b, $c) = @_; | 
| 101 |  |  |  |  |  |  |  | 
| 102 | 176 |  |  |  |  | 255 | _wsub($a, $b); _wsub($a, $c); $a ^= $c >> 13; | 
|  | 176 |  |  |  |  | 245 |  | 
|  | 176 |  |  |  |  | 180 |  | 
| 103 | 176 |  |  |  |  | 227 | _wsub($b, $c); _wsub($b, $a); $b ^= ($a << 8) % 4294967296; | 
|  | 176 |  |  |  |  | 228 |  | 
|  | 176 |  |  |  |  | 202 |  | 
| 104 | 176 |  |  |  |  | 235 | _wsub($c, $a); _wsub($c, $b); $c ^= $b >>13; | 
|  | 176 |  |  |  |  | 227 |  | 
|  | 176 |  |  |  |  | 174 |  | 
| 105 | 176 |  |  |  |  | 219 | _wsub($a, $b); _wsub($a, $c); $a ^= $c >> 12; | 
|  | 176 |  |  |  |  | 218 |  | 
|  | 176 |  |  |  |  | 165 |  | 
| 106 | 176 |  |  |  |  | 238 | _wsub($b, $c); _wsub($b, $a); $b ^= ($a << 16) % 4294967296; | 
|  | 176 |  |  |  |  | 229 |  | 
|  | 176 |  |  |  |  | 230 |  | 
| 107 | 176 |  |  |  |  | 237 | _wsub($c, $a); _wsub($c, $b); $c ^= $b >> 5; | 
|  | 176 |  |  |  |  | 230 |  | 
|  | 176 |  |  |  |  | 181 |  | 
| 108 | 176 |  |  |  |  | 243 | _wsub($a, $b); _wsub($a, $c); $a ^= $c >> 3; | 
|  | 176 |  |  |  |  | 249 |  | 
|  | 176 |  |  |  |  | 186 |  | 
| 109 | 176 |  |  |  |  | 240 | _wsub($b, $c); _wsub($b, $a); $b ^= ($a << 10) % 4294967296; | 
|  | 176 |  |  |  |  | 227 |  | 
|  | 176 |  |  |  |  | 180 |  | 
| 110 | 176 |  |  |  |  | 233 | _wsub($c, $a); _wsub($c, $b); $c ^= $b >> 15; | 
|  | 176 |  |  |  |  | 217 |  | 
|  | 176 |  |  |  |  | 170 |  | 
| 111 |  |  |  |  |  |  |  | 
| 112 | 176 |  |  |  |  | 441 | @_[0 .. $#_] = ($a, $b, $c); | 
| 113 |  |  |  |  |  |  | } | 
| 114 |  |  |  |  |  |  |  | 
| 115 | 686 |  |  | 686 |  | 1017 | sub _wadd { $_[0] = int(($_[0] + $_[1]) % 4294967296);} | 
| 116 | 3488 |  |  | 3488 |  | 4219 | sub _wsub { $_[0] = int(($_[0] - $_[1]) % 4294967296);} | 
| 117 |  |  |  |  |  |  |  | 
| 118 |  |  |  |  |  |  | 1; | 
| 119 |  |  |  |  |  |  |  | 
| 120 |  |  |  |  |  |  |  | 
| 121 |  |  |  |  |  |  | __END__ |