google_pr 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +0 -10
- data/lib/google_pr.rb +92 -62
- metadata +31 -43
- data/init.rb +0 -2
data/README
CHANGED
@@ -1,12 +1,6 @@
|
|
1
1
|
GooglePR
|
2
2
|
===============
|
3
3
|
|
4
|
-
This plugin for Ruby on Rails allow to check the Google PageRank of an URL
|
5
|
-
The original script was wrote by Vsevolod S. Balashov <vsevolod@balashov.name>
|
6
|
-
and is base on code snippets found on the web (see code comments)
|
7
|
-
|
8
|
-
This script was rewritten to become a Rails gem
|
9
|
-
|
10
4
|
Example
|
11
5
|
=======
|
12
6
|
|
@@ -18,7 +12,3 @@ Specs
|
|
18
12
|
Run this after each improvement in this project
|
19
13
|
spec spec/pagerank_checker_specs.rb
|
20
14
|
It requires Rspec installation: gem install rspec
|
21
|
-
|
22
|
-
|
23
|
-
(C) 2006-2007 under terms of LGPL v2.1
|
24
|
-
by Vsevolod S. Balashov <vsevolod@balashov.name>
|
data/lib/google_pr.rb
CHANGED
@@ -11,82 +11,112 @@ require 'uri'
|
|
11
11
|
require 'open-uri'
|
12
12
|
|
13
13
|
# http://blog.outer-court.com/archive/2004_06_27_index.html#108834386239051706
|
14
|
-
class AutomatedQueryError < StandardError
|
14
|
+
class AutomatedQueryError < StandardError
|
15
|
+
end
|
15
16
|
|
16
|
-
class GooglePR
|
17
17
|
|
18
|
-
M=0x100000000 # modulo for unsigned int 32bit(4byte)
|
19
|
-
attr_accessor :uri
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@uri = uri
|
25
|
-
end
|
19
|
+
# extracted from PageRankr
|
20
|
+
# cf. https://github.com/blatyo/page_rankr
|
21
|
+
# use: Google::Pagerank.new(domain).check
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
class GoogleChecksum
|
24
|
+
class << self
|
25
|
+
def generate(site)
|
26
|
+
bytes = byte_array(site)
|
27
|
+
length = bytes.length
|
28
|
+
a = b = 0x9E3779B9
|
29
|
+
c = 0xE6359A60
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
k, len = 0, length
|
32
|
+
while(len >= 12)
|
33
|
+
a, b, c = mix(*shift(a, b, c, k, bytes))
|
34
|
+
k += 12
|
35
|
+
len -= 12
|
36
|
+
end
|
34
37
|
|
35
|
-
|
36
|
-
((s[k+3].to_i*0x100+s[k+2].to_i)*0x100+s[k+1].to_i)*0x100+s[k].to_i
|
37
|
-
end
|
38
|
+
c = c + length
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
a = m1(a,b,c, c >> 12); b = m1(b,c,a, a << 16); c = m1(c,a,b, b >> 5)
|
43
|
-
a = m1(a,b,c, c >> 3); b = m1(b,c,a, a << 10); c = m1(c,a,b, b >> 15)
|
44
|
-
[a, b, c]
|
45
|
-
end
|
40
|
+
c = mix(*toss(a, b, c, bytes, len, k))[2]
|
41
|
+
"6" + c.to_s
|
42
|
+
end
|
46
43
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
44
|
+
private
|
45
|
+
|
46
|
+
def byte_array(site)
|
47
|
+
bytes = []
|
48
|
+
site.each_byte {|b| bytes << b}
|
49
|
+
bytes
|
50
|
+
end
|
51
|
+
|
52
|
+
# Need to keep numbers in the unsigned int 32 range
|
53
|
+
def m(v)
|
54
|
+
v % 0x100000000
|
55
|
+
end
|
56
|
+
|
57
|
+
def shift(a, b, c, k, bytes)
|
58
|
+
a = m(a + bytes[k + 0] + (bytes[k + 1] << 8) + (bytes[k + 2] << 16) + (bytes[k + 3] << 24))
|
59
|
+
b = m(b + bytes[k + 4] + (bytes[k + 5] << 8) + (bytes[k + 6] << 16) + (bytes[k + 7] << 24))
|
60
|
+
c = m(c + bytes[k + 8] + (bytes[k + 9] << 8) + (bytes[k + 10] << 16) + (bytes[k + 11] << 24))
|
61
|
+
|
62
|
+
[a, b, c]
|
63
|
+
end
|
64
|
+
|
65
|
+
def mix(a, b, c)
|
66
|
+
a, b, c = m(a), m(b), m(c)
|
67
|
+
|
68
|
+
a = m(a-b-c) ^ m(c >> 13)
|
69
|
+
b = m(b-c-a) ^ m(a << 8)
|
70
|
+
c = m(c-a-b) ^ m(b >> 13)
|
71
|
+
|
72
|
+
a = m(a-b-c) ^ m(c >> 12)
|
73
|
+
b = m(b-c-a) ^ m(a << 16)
|
74
|
+
c = m(c-a-b) ^ m(b >> 5)
|
75
|
+
|
76
|
+
a = m(a-b-c) ^ m(c >> 3)
|
77
|
+
b = m(b-c-a) ^ m(a << 10)
|
78
|
+
c = m(c-a-b) ^ m(b >> 15)
|
79
|
+
|
80
|
+
[a, b, c]
|
81
|
+
end
|
82
|
+
|
83
|
+
def toss(a, b, c, bytes, len, k)
|
84
|
+
case len
|
85
|
+
when 9..11
|
86
|
+
c = c + (bytes[k+len-1] << ((len % 8) * 8))
|
87
|
+
when 5..8
|
88
|
+
b = b + (bytes[k+len-1] << ((len % 5) * 8))
|
89
|
+
when 1..4
|
90
|
+
a = a + (bytes[k+len-1] << ((len - 1) * 8))
|
91
|
+
else
|
92
|
+
return [a, b, c]
|
93
|
+
end
|
94
|
+
toss(a, b, c, bytes, len-1, k)
|
55
95
|
end
|
56
|
-
a += c2i(iurl,k); b += c2i(iurl,k+4); c += (c2i(iurl,k+8) << 8) + len
|
57
|
-
a,b,c = mix(a,b,c)
|
58
|
-
return c
|
59
|
-
end
|
60
|
-
|
61
|
-
# Calculates de checksum to use as 'ch' parameter on request_uri,
|
62
|
-
# for example the checksum of www.rubyonrails.com is 6602033163
|
63
|
-
def cn
|
64
|
-
ch = old_cn
|
65
|
-
ch = ((ch/7) << 2) | ((ch-(ch/13).floor*13)&7)
|
66
|
-
new_url = []
|
67
|
-
20.times { i2c(ch).each { |i| new_url << i }; ch -= 9 }
|
68
|
-
('6' + old_cn(new_url).to_s).to_i
|
69
96
|
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class GooglePR
|
100
|
+
attr_accessor :domain, :checksum
|
70
101
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
# http://www.bigbold.com/snippets/posts/show/1260 + _ -> %5F
|
75
|
-
"http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&ch=#{cn}&ie=UTF-8&oe=UTF-8&features=Rank&q=info:#{URI.escape(@uri, /[^-.!~*'()a-zA-Z\d]/)}"
|
102
|
+
def initialize(domain)
|
103
|
+
self.domain = domain
|
104
|
+
self.checksum = GoogleChecksum.generate("info:#{self.domain}")
|
76
105
|
end
|
77
106
|
|
78
107
|
# Return a number between 0 to 10, that represents the Google PageRank
|
79
|
-
def
|
80
|
-
|
81
|
-
res = HTTParty.get(
|
82
|
-
|
83
|
-
return m[1].to_i
|
84
|
-
elsif res.to_s.match(/automated queries/im)
|
85
|
-
raise AutomatedQueryError.new("Blacklisted for automated queries")
|
86
|
-
end
|
87
|
-
rescue OpenURI::HTTPError, SocketError
|
88
|
-
nil
|
108
|
+
def check
|
109
|
+
url = "#{toolbar_url}?" + params.collect {|k,v| "#{k}=#{v}"}.join("&")
|
110
|
+
res = HTTParty.get(url, :headers => {"User-Agent" => "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" }, :format => :raw)
|
111
|
+
res.to_s.match(/Rank_\d+:\d+:(\d+)/) ? $1.to_i : nil
|
89
112
|
end
|
90
113
|
|
91
|
-
private
|
114
|
+
private
|
115
|
+
def toolbar_url
|
116
|
+
"http://toolbarqueries.google.com/tbr"
|
117
|
+
end
|
118
|
+
|
119
|
+
def params
|
120
|
+
{:client => "navclient-auto", :ch => @checksum, :features => "Rank", :q => "info:#{self.domain}"}
|
121
|
+
end
|
92
122
|
end
|
metadata
CHANGED
@@ -1,70 +1,58 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_pr
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 1.0.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
7
|
+
authors:
|
8
|
+
- Various
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
date: 2012-02-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: httparty
|
16
|
+
requirement: &70337698930980 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70337698930980
|
22
25
|
description: Check Google Pagerank
|
23
26
|
email:
|
24
27
|
executables: []
|
25
|
-
|
26
28
|
extensions: []
|
27
|
-
|
28
29
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
30
|
+
files:
|
31
31
|
- README
|
32
|
-
- init.rb
|
33
32
|
- lib/google_pr.rb
|
34
33
|
- test/pagerank_checker_test.rb
|
35
|
-
has_rdoc: true
|
36
34
|
homepage: https://github.com/veilleperso/google_pr
|
37
35
|
licenses: []
|
38
|
-
|
39
36
|
post_install_message:
|
40
37
|
rdoc_options: []
|
41
|
-
|
42
|
-
require_paths:
|
38
|
+
require_paths:
|
43
39
|
- lib
|
44
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
41
|
none: false
|
46
|
-
requirements:
|
47
|
-
- -
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
|
50
|
-
|
51
|
-
- 0
|
52
|
-
version: "0"
|
53
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
47
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 0
|
61
|
-
version: "0"
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
62
52
|
requirements: []
|
63
|
-
|
64
53
|
rubyforge_project:
|
65
|
-
rubygems_version: 1.
|
54
|
+
rubygems_version: 1.8.15
|
66
55
|
signing_key:
|
67
56
|
specification_version: 3
|
68
57
|
summary: Google PR check
|
69
58
|
test_files: []
|
70
|
-
|
data/init.rb
DELETED