Class: Mihari::Clients::Shodan
- Defined in:
- lib/mihari/clients/shodan.rb
Overview
Shodan API client
Constant Summary collapse
- PAGE_SIZE =
100
Instance Attribute Summary collapse
- #api_key ⇒ String readonly
Attributes inherited from Base
#base_url, #headers, #pagination_interval, #timeout
Instance Method Summary collapse
-
#initialize(base_url = "https://api.shodan.io", api_key:, headers: {}, pagination_interval: Mihari.config.pagination_interval, timeout: nil) ⇒ Shodan
constructor
A new instance of Shodan.
- #search(query, page: 1, minify: true) ⇒ Mihari::Structs::Shodan::Result
- #search_with_pagination(query, minify: true, pagination_limit: Mihari.config.pagination_limit) ⇒ Enumerable<Mihari::Structs::Shodan::Response>
Constructor Details
#initialize(base_url = "https://api.shodan.io", api_key:, headers: {}, pagination_interval: Mihari.config.pagination_interval, timeout: nil) ⇒ Shodan
Returns a new instance of Shodan.
21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/mihari/clients/shodan.rb', line 21 def initialize( base_url = "https://api.shodan.io", api_key:, headers: {}, pagination_interval: Mihari.config.pagination_interval, timeout: nil ) raise(ArgumentError, "api_key is required") unless api_key super(base_url, headers:, pagination_interval:, timeout:) @api_key = api_key end |
Instance Attribute Details
#api_key ⇒ String (readonly)
12 13 14 |
# File 'lib/mihari/clients/shodan.rb', line 12 def api_key @api_key end |
Instance Method Details
#search(query, page: 1, minify: true) ⇒ Mihari::Structs::Shodan::Result
42 43 44 45 46 47 48 49 50 |
# File 'lib/mihari/clients/shodan.rb', line 42 def search(query, page: 1, minify: true) params = { query:, page:, minify:, key: api_key } Structs::Shodan::Response.from_dynamic! get_json("/shodan/host/search", params:) end |
#search_with_pagination(query, minify: true, pagination_limit: Mihari.config.pagination_limit) ⇒ Enumerable<Mihari::Structs::Shodan::Response>
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/mihari/clients/shodan.rb', line 59 def search_with_pagination(query, minify: true, pagination_limit: Mihari.config.pagination_limit) Enumerator.new do |y| (1..pagination_limit).each do |page| res = search(query, page:, minify:) y.yield res break if res.total <= page * PAGE_SIZE sleep_pagination_interval rescue JSON::ParserError # ignore JSON::ParserError # ref. https://github.com/ninoseki/mihari/issues/197 next end end end |