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.
Files changed (2) hide show
  1. data/lib/blekko.rb +89 -0
  2. 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: []