google_pr 1.0.0
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 +24 -0
- data/init.rb +2 -0
- data/lib/google_pr.rb +92 -0
- data/test/pagerank_checker_test.rb +8 -0
- metadata +70 -0
data/README
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
GooglePR
|
2
|
+
===============
|
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
|
+
Example
|
11
|
+
=======
|
12
|
+
|
13
|
+
GooglePR.new("http://www.microsoft.com").page_rank
|
14
|
+
|
15
|
+
Specs
|
16
|
+
=====
|
17
|
+
|
18
|
+
Run this after each improvement in this project
|
19
|
+
spec spec/pagerank_checker_specs.rb
|
20
|
+
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/init.rb
ADDED
data/lib/google_pr.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# PagerankChecker
|
2
|
+
|
3
|
+
# (C) 2006-2007 under terms of LGPL v2.1
|
4
|
+
# by Vsevolod S. Balashov <vsevolod@balashov.name>
|
5
|
+
# based on 3rd party code snippets (see comments)
|
6
|
+
#
|
7
|
+
# transformed as a rails plugin by Olivier Ruffin (http://www.veilleperso.com)
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'uri'
|
11
|
+
require 'open-uri'
|
12
|
+
|
13
|
+
# http://blog.outer-court.com/archive/2004_06_27_index.html#108834386239051706
|
14
|
+
class AutomatedQueryError < StandardError; end;
|
15
|
+
|
16
|
+
class GooglePR
|
17
|
+
|
18
|
+
M=0x100000000 # modulo for unsigned int 32bit(4byte)
|
19
|
+
attr_accessor :uri
|
20
|
+
|
21
|
+
# Create a new GooglePR object with the given 'uri' parameter
|
22
|
+
def initialize(uri)
|
23
|
+
# TODO should raise a URI::InvalidURIError with a invalid URI parameter
|
24
|
+
@uri = uri
|
25
|
+
end
|
26
|
+
|
27
|
+
def m1(a,b,c,d)
|
28
|
+
(((a+(M-b)+(M-c))%M)^(d%M))%M # mix/power mod
|
29
|
+
end
|
30
|
+
|
31
|
+
def i2c(i)
|
32
|
+
[i&0xff, i>>8&0xff, i>>16&0xff, i>>24&0xff]
|
33
|
+
end
|
34
|
+
|
35
|
+
def c2i(s,k=0)
|
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
|
+
|
39
|
+
def mix(a,b,c)
|
40
|
+
a = a%M; b = b%M; c = c%M
|
41
|
+
a = m1(a,b,c, c >> 13); b = m1(b,c,a, a << 8); c = m1(c,a,b, b >> 13)
|
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
|
46
|
+
|
47
|
+
def old_cn(iurl = 'info:' + @uri)
|
48
|
+
a = 0x9E3779B9; b = 0x9E3779B9; c = 0xE6359A60
|
49
|
+
len = iurl.size
|
50
|
+
k = 0
|
51
|
+
while (len >= k + 12) do
|
52
|
+
a += c2i(iurl,k); b += c2i(iurl,k+4); c += c2i(iurl,k+8)
|
53
|
+
a, b, c = mix(a, b, c)
|
54
|
+
k = k + 12
|
55
|
+
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
|
+
end
|
70
|
+
|
71
|
+
# URI that gets the pagerank,
|
72
|
+
# for example to get the Google's pagerank of www.rubyonrails.com the request_uri is http://toolbarqueries.google.com/search?client=navclient-auto&hl=en&ch=6602033163&ie=UTF-8&oe=UTF-8&features=Rank&q=info:www.rubyonrails.com
|
73
|
+
def request_uri
|
74
|
+
# http://www.bigbold.com/snippets/posts/show/1260 + _ -> %5F
|
75
|
+
"http://toolbarqueries.google.com/search?client=navclient-auto&hl=en&ch=#{cn}&ie=UTF-8&oe=UTF-8&features=Rank&q=info:#{URI.escape(@uri, /[^-.!~*'()a-zA-Z\d]/)}"
|
76
|
+
end
|
77
|
+
|
78
|
+
# Return a number between 0 to 10, that represents the Google PageRank
|
79
|
+
def page_rank(uri = @uri)
|
80
|
+
@uri = uri if uri != @uri
|
81
|
+
res = HTTParty.get(request_uri, :headers => {"User-Agent" => Object.const_defined?("WITH_USER_AGENT") ? Object.const_get("WITH_USER_AGENT") : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10" })
|
82
|
+
if (m=res.to_s.match(/Rank_1:\d:(\d+)/))
|
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
|
89
|
+
end
|
90
|
+
|
91
|
+
private :m1, :i2c, :c2i, :mix, :old_cn
|
92
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google_pr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors: []
|
13
|
+
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-17 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Check Google Pagerank
|
23
|
+
email:
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- README
|
32
|
+
- init.rb
|
33
|
+
- lib/google_pr.rb
|
34
|
+
- test/pagerank_checker_test.rb
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: https://github.com/veilleperso/google_pr
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 3
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
version: "0"
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.4.2
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Google PR check
|
69
|
+
test_files: []
|
70
|
+
|