Class: Mihari::Clients::Shodan

Inherits:
Base
  • Object
show all
Defined in:
lib/mihari/clients/shodan.rb

Overview

Shodan API client

Constant Summary collapse

PAGE_SIZE =
100

Instance Attribute Summary collapse

Attributes inherited from Base

#base_url, #headers, #pagination_interval, #timeout

Instance Method Summary collapse

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.

Parameters:

  • base_url (String) (defaults to: "https://api.shodan.io")
  • api_key (String, nil)
  • headers (Hash) (defaults to: {})
  • pagination_interval (Integer) (defaults to: Mihari.config.pagination_interval)
  • timeout (Integer, nil) (defaults to: nil)

Raises:

  • (ArgumentError)


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_keyString (readonly)

Returns:

  • (String)


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

Parameters:

  • query (String)
  • page (Integer) (defaults to: 1)
  • minify (Boolean) (defaults to: true)

Returns:

  • (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>

Parameters:

  • query (String)
  • minify (Boolean) (defaults to: true)
  • pagination_limit (Integer) (defaults to: Mihari.config.pagination_limit)

Returns:



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