urlscan 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 06ecedfa33d35b87c46e2230de22f8871d9e8d933dc232e11fd671d9b66de21a
4
- data.tar.gz: 6712e92c91f06afb1122414e50ad484add46ca964880c87de40091a9e2a57489
3
+ metadata.gz: 042c7671173ca5f51491179a399986f61c075a4d410851017d43260e37c870f1
4
+ data.tar.gz: 5c090165f7c5d711dddae216934bb35efdf35c26a6864f6f9890841ad69ef7ca
5
5
  SHA512:
6
- metadata.gz: 3119770d1ba5385836a736b89e2b4029fae5696202ec1c669302193c4b0db6c1b0838f39f644f83bb3c941ed44da5a99876aa744e6d0106e1fac56797037ace0
7
- data.tar.gz: 25620724cf36ab95377f67886da10347b717474fdc708799cc00196ad7ad36e97691a9ea1618db83c7f7f92c6c8dad889b9fcf0b88f5163fbb4aef739061ecc4
6
+ metadata.gz: 65782649fe5229b9bed2090a57de4eed5ed85aa257b35b3cde8d3b732275ce3a39fcef2fcdb75fb54d9402682e0528d8e5b6ea7dbb5bb5ee24c93151be3ad64c
7
+ data.tar.gz: 106287f92bbea337c90d2f8af16fe1df6d856b1fb3c827388b051eaf0eae9503e76e8da23fea236bc9634c636137e96e51194fa01273a8e46efc01913b2193de
@@ -1,6 +1,13 @@
1
1
  # Relaxed.Ruby.Style
2
2
  ## Version 2.2
3
3
 
4
+ require:
5
+ - rubocop-performance
6
+ - rubocop-rspec
7
+
8
+ AllCops:
9
+ TargetRubyVersion: 2.6
10
+
4
11
  Style/Alias:
5
12
  Enabled: false
6
13
  StyleGuide: https://relaxed.ruby.style/#stylealias
@@ -1,8 +1,9 @@
1
+ sudo: false
1
2
  language: ruby
2
3
  cache: bundler
3
4
  rvm:
4
- - 2.4
5
5
  - 2.5
6
- script: bundle exec rake spec
7
- gemfile:
8
- - Gemfile
6
+ - 2.6
7
+ before_install:
8
+ - gem update --system
9
+ - gem install bundler
data/README.md CHANGED
@@ -6,54 +6,58 @@
6
6
 
7
7
  ## Description
8
8
 
9
- Ruby API client for [urlscan.io](https://urlscan.io/)
9
+ Ruby API client for [urlscan.io](https://urlscan.io/).
10
10
 
11
11
  ## Installation
12
12
 
13
13
  ```bash
14
- $ gem install urlscan
14
+ gem install urlscan
15
15
  ```
16
16
 
17
17
  ## API usage
18
18
 
19
- Initialize the API:
20
-
21
19
  ```ruby
22
20
  require 'urlscan'
23
- # initialize the API by passing the API key.
24
- api = UrlScan::API.new(api_key)
25
- # or initialize the API by using `$URLSCAN_API_KEY` environment variable
26
- api = UrlScan::API.new
27
- ```
28
21
 
29
- Submit:
22
+ # when given nothing, it tries to load your API key from ENV["SHODAN_API_KEY"]
23
+ api = UrlScan::API.new
24
+ # or you can set it manually
25
+ api = UrlScan::API.new(api_key)
30
26
 
31
- ```ruby
27
+ # Submit a URL to scan
32
28
  res = api.submit("https://wikipedia.org")
33
29
  puts res["result"] # => "https://urlscan.io/result/ac04bc14-4efe-439d-b356-8384843daf75/"
34
- ```
35
30
 
36
- Result:
37
-
38
- ```ruby
31
+ # Get a scan result
39
32
  res = api.result("ac04bc14-4efe-439d-b356-8384843daf75")
40
33
  p res # => See the following URL as an example of the response.
41
34
  # https://gist.github.com/ninoseki/a974d7e95629813615b380c30e737825#file-result-json
42
- ```
43
35
 
44
- Search:
36
+ # Get a DOM
37
+ res = api.dom("ac04bc14-4efe-439d-b356-8384843daf75")
38
+ p res
45
39
 
46
- ```ruby
40
+ # Search
47
41
  res = api.search("wikipedia.org")
48
42
  p res # => See the following URL as an example of the reponse.
49
43
  # https://gist.github.com/ninoseki/a974d7e95629813615b380c30e737825#file-search-json
50
44
  ```
51
45
 
46
+ ### Supported API endpoints
47
+
48
+ | HTTP Method | URI | API method |
49
+ |-------------|----------------|-------------------------------------------------------------------|
50
+ | POST | /scan | `UrlScan::API#submit(url, is_public = true)` |
51
+ | GET | /result/$uuid/ | `UrlScan::API#result(uuid)` |
52
+ | GET | /dom/$uuid/ | `UrlScan::API#dom(uuid)` |
53
+ | GET | /search | `UrlScan::API#search(q, size = 100, offset = 0, sort = "_score")` |
54
+
52
55
  ## CLI usage
53
56
 
54
57
  ```bash
55
58
  $ urlscan
56
59
  Commands:
60
+ urlscan dom [UUID] # get the DOM of a scan using the [UUID]
57
61
  urlscan help [COMMAND] # Describe available commands or one specific command
58
62
  urlscan result [UUID] # get the result of a scan using the [UUID]
59
63
  urlscan search [QUERY] # search for scans by [QUERY]
@@ -61,4 +65,5 @@ Commands:
61
65
 
62
66
  Options:
63
67
  [--API-KEY=API_KEY]
68
+
64
69
  ```
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "urlscan/api"
2
4
  require "urlscan/cli"
3
5
  require "urlscan/version"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/https'
2
4
  require 'json'
3
5
 
@@ -6,25 +8,34 @@ require 'urlscan/exceptions'
6
8
  module UrlScan
7
9
  class API
8
10
  VERSION = 1
9
- HOST = "urlscan.io".freeze
10
- URL = "https://#{HOST}/api/v#{VERSION}".freeze
11
+ HOST = "urlscan.io"
12
+ URL = "https://#{HOST}/api/v#{VERSION}"
11
13
 
12
14
  attr_reader :key
13
15
 
14
16
  def initialize(key = ENV["URLSCAN_API_KEY"])
15
17
  raise ArgumentError, "`key` argument required" if key.nil?
18
+
16
19
  @key = key
17
20
  end
18
21
 
22
+ # @return [Hash]
19
23
  def submit(url, is_public = true)
20
24
  params = { url: url, public: is_public ? "on" : "off" }
21
25
  post("/scan/", params) { |json| json }
22
26
  end
23
27
 
28
+ # @return [Hash]
24
29
  def result(uuid)
25
30
  get("/result/#{uuid}") { |json| json }
26
31
  end
27
32
 
33
+ # @return [String]
34
+ def dom(uuid)
35
+ get("/dom/#{uuid}/") { |dom| dom }
36
+ end
37
+
38
+ # @return [Hash]
28
39
  def search(q, size = 100, offset = 0, sort = "_score")
29
40
  params = { q: q, size: size, offset: offset, sort: sort }
30
41
  query = URI.encode_www_form(params)
@@ -39,8 +50,8 @@ module UrlScan
39
50
  if proxy = ENV["HTTPS_PROXY"]
40
51
  uri = URI(proxy)
41
52
  {
42
- proxy_address: uri.hostname,
43
- proxy_port: uri.port,
53
+ proxy_address: uri.hostname,
54
+ proxy_port: uri.port,
44
55
  proxy_from_env: false,
45
56
  use_ssl: true
46
57
  }
@@ -54,7 +65,12 @@ module UrlScan
54
65
  response = http.request(req)
55
66
 
56
67
  case response.code
57
- when '200' then yield JSON.parse(response.body)
68
+ when '200'
69
+ if response["Content-Type"].to_s.include? "application/json"
70
+ yield JSON.parse(response.body)
71
+ else
72
+ yield response.body
73
+ end
58
74
  when '400' then raise ProcessingError, response.body
59
75
  when '401' then raise AuthenticationError, response.body
60
76
  when '404' then raise NotFound, response.body
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'thor'
3
5
 
@@ -33,6 +35,14 @@ module UrlScan
33
35
  end
34
36
  end
35
37
 
38
+ desc "dom [UUID]", "get the DOM of a scan using the [UUID]"
39
+ def dom(uuid)
40
+ with_error_handling do
41
+ res = api.dom(uuid)
42
+ puts res
43
+ end
44
+ end
45
+
36
46
  no_commands do
37
47
  def api
38
48
  options[:API_KEY] ? API.new(options[:API_KEY]) : API.new
@@ -40,10 +50,10 @@ module UrlScan
40
50
 
41
51
  def with_error_handling
42
52
  yield
43
- rescue ArgumentError => _
53
+ rescue ArgumentError => _e
44
54
  puts "Warning: please specify your urlscan.io API key via ENV['URLSCAN_API_KEY] or --API-KEY"
45
- rescue ResponseError => e
46
- puts "Warning: #{e}"
55
+ rescue ResponseError => _e
56
+ puts "Warning: #{_e}"
47
57
  end
48
58
  end
49
59
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module UrlScan
2
4
  class ResponseError < StandardError; end
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module UrlScan
2
- VERSION = "0.1.1".freeze
4
+ VERSION = "0.2.0"
3
5
  end
@@ -1,4 +1,4 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "urlscan/version"
4
4
 
@@ -19,13 +19,13 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.16"
22
+ spec.add_development_dependency "bundler", "~> 2.0"
23
23
  spec.add_development_dependency "coveralls", "~> 0.8"
24
24
  spec.add_development_dependency "dotenv", "~> 2.5"
25
25
  spec.add_development_dependency "rake", "~> 12.3"
26
26
  spec.add_development_dependency "rspec", "~> 3.8"
27
27
  spec.add_development_dependency "vcr", "~> 4.0"
28
- spec.add_development_dependency "webmock", "~> 3.4"
28
+ spec.add_development_dependency "webmock", "~> 3.5"
29
29
 
30
30
  spec.add_runtime_dependency "thor", "~> 0.19"
31
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urlscan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-12 00:00:00.000000000 Z
11
+ date: 2019-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.16'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: coveralls
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.4'
103
+ version: '3.5'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.4'
110
+ version: '3.5'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: thor
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -165,8 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  requirements: []
168
- rubyforge_project:
169
- rubygems_version: 2.7.6
168
+ rubygems_version: 3.0.2
170
169
  signing_key:
171
170
  specification_version: 4
172
171
  summary: Ruby API client for urlscan.io