blekko 0.0.1
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/lib/blekko.rb +89 -0
- metadata +45 -0
data/lib/blekko.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
require 'json'
|
5
|
+
require 'open-uri'
|
6
|
+
|
7
|
+
|
8
|
+
BlekkoResult = Struct.new :title, :abstract, :url, :display_url, :short_host,
|
9
|
+
:short_host_url, :rss, :main_slashtag_boosted
|
10
|
+
|
11
|
+
|
12
|
+
class Blekko
|
13
|
+
# API for Blekko search engine
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
# >> Blekko.new('[Referer]', ['Num results']).search('nano fibers')
|
17
|
+
# => [ #<ClioResult:...>, ... ]
|
18
|
+
#
|
19
|
+
# Arguments:
|
20
|
+
# referer: (String)
|
21
|
+
# num_results: (Integer+)
|
22
|
+
|
23
|
+
API_PROTOCOL_HTTPS = 'https://'
|
24
|
+
API_PROTOCOL_HTTP = 'http://'
|
25
|
+
API_PATH = 'www.blekko.com/ws/?q='
|
26
|
+
CHUNK_SIZE = 10
|
27
|
+
MAX_TTL = 2
|
28
|
+
MIN_SECS_BTWN_REQS = 1
|
29
|
+
|
30
|
+
attr_accessor :referer, :num_results, :api_key, :last_request
|
31
|
+
|
32
|
+
def initialize(api_key='', referer='', num_results=100, secure=true)
|
33
|
+
@api_protocol = secure ? API_PROTOCOL_HTTPS : API_PROTOCOL_HTTP
|
34
|
+
@api_key = api_key
|
35
|
+
@referer = referer
|
36
|
+
@num_results = num_results
|
37
|
+
@last_request = nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def search(query, page=1)
|
41
|
+
# API Parameters
|
42
|
+
# auth=api key
|
43
|
+
# q=query
|
44
|
+
# p=page
|
45
|
+
# ps=num results
|
46
|
+
|
47
|
+
params = "#{CGI.escape(query)}+/json&auth=#{@api_key}&ps=#{@num_results}"
|
48
|
+
|
49
|
+
url = "#{@api_protocol}#{API_PATH}#{params}&p=#{page}"
|
50
|
+
|
51
|
+
# enforce rate limit
|
52
|
+
sleep_for_rate_limit
|
53
|
+
|
54
|
+
response = open(url, { 'Referer' => @referer })
|
55
|
+
unless response.class.superclass == Net::HTTPServerError
|
56
|
+
doc = JSON.load(response)
|
57
|
+
@json = doc
|
58
|
+
|
59
|
+
# if total_num is defined, then RESULTS is
|
60
|
+
return [] unless doc['total_num']
|
61
|
+
doc['RESULT'].map do |result|
|
62
|
+
BlekkoResult.new(
|
63
|
+
result['url_title'],
|
64
|
+
result['snippet'],
|
65
|
+
result['url'],
|
66
|
+
result['display_url'],
|
67
|
+
result['short_host'],
|
68
|
+
result['short_host_url'],
|
69
|
+
result['rss'],
|
70
|
+
result['main_slashtag_boosted']
|
71
|
+
)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def sleep_for_rate_limit
|
78
|
+
# If we have a last request, the minimum time between requests has not
|
79
|
+
# passed, and the time to sleep is positive (in case the check got blocked),
|
80
|
+
# then sleep for the needed time.
|
81
|
+
# In any case, reset the last request time to now.
|
82
|
+
if @last_request and\
|
83
|
+
(Time.now) - @last_request < MIN_SECS_BTWN_REQS and\
|
84
|
+
(time_to_sleep = MIN_SECS_BTWN_REQS - (Time.now - @last_request)) > 0
|
85
|
+
sleep time_to_sleep
|
86
|
+
end
|
87
|
+
@last_request = Time.now
|
88
|
+
end
|
89
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: blekko
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Peter Lubell-Doughtie
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-28 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: API for Blekko
|
15
|
+
email: peter@helioid.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/blekko.rb
|
21
|
+
homepage: http://www.helioid.com/
|
22
|
+
licenses: []
|
23
|
+
post_install_message:
|
24
|
+
rdoc_options: []
|
25
|
+
require_paths:
|
26
|
+
- lib
|
27
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 1.8.24
|
42
|
+
signing_key:
|
43
|
+
specification_version: 3
|
44
|
+
summary: API for Blekko
|
45
|
+
test_files: []
|