Added Crystal
This commit is contained in:
parent
972af03a56
commit
0613fb7fc4
1 changed files with 94 additions and 0 deletions
94
Crystal/index.cr
Normal file
94
Crystal/index.cr
Normal file
|
@ -0,0 +1,94 @@
|
|||
require "option_parser"
|
||||
require "http"
|
||||
require "uri"
|
||||
require "json"
|
||||
|
||||
def main_loop(times, domains, mode, log, mini, maxi, second, report_file)
|
||||
json_text = JSON.build do |json|
|
||||
json.array do
|
||||
i = 0
|
||||
while i < times
|
||||
url = url_generator(domains, mode, mini.as(UInt8), maxi.as(UInt8), second)
|
||||
puts "#{url} (#{i + 1}/#{times})" if log
|
||||
client = HTTP::Client.new(URI.parse url)
|
||||
client.connect_timeout = 40.seconds
|
||||
begin
|
||||
response = client.get("/")
|
||||
puts "#{url} exists!"
|
||||
json.object do
|
||||
json.field "website_url", url
|
||||
json.field "response_type", "SUCCESS"
|
||||
json.field "response_code", response.status_code
|
||||
json.field "response_details", HTTP::Status.new(response.status_code)
|
||||
end
|
||||
rescue e : Socket::Addrinfo::Error
|
||||
# Website essentially does not exist
|
||||
rescue err : Socket::Error | IO::TimeoutError
|
||||
# Website essentially does exist
|
||||
puts "#{url} exists!"
|
||||
json.object do
|
||||
json.field "website_url", url
|
||||
json.field "response_type", "ERROR"
|
||||
json.field "response_code", "UNKNOWN" # afaik no way to get a status code out of an exception
|
||||
json.field "response_details", err.message
|
||||
end
|
||||
ensure
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
File.write(report_file, json_text)
|
||||
end_date = Time.local
|
||||
puts "\nFinished at #{end_date.hour}h#{end_date.minute}m"
|
||||
end
|
||||
|
||||
def url_generator(domains, mode, mini, maxi, second)
|
||||
result = String.build do |str|
|
||||
str << mode[Random.rand(mode.size)] + "://"
|
||||
url_length = Random.rand(mini..maxi)
|
||||
characters = "abcdefghijklmnopqrstuvwxyz0123456789"
|
||||
i = 0
|
||||
while i < url_length
|
||||
str << characters[Random.rand(characters.size - 1)]
|
||||
i += 1
|
||||
end
|
||||
str << domains[Random.rand(domains.size)] if Random.rand(1..100) <= second
|
||||
str << domains[Random.rand(domains.size)]
|
||||
end
|
||||
puts result
|
||||
result
|
||||
end
|
||||
|
||||
times = UInt32.new "3000"
|
||||
domains = [".co", ".com", ".net", ".edu", ".gov", ".cn", ".org", ".cc", ".us", ".mil", ".ac", ".it", ".de"]
|
||||
mode = ["http"]
|
||||
log = false
|
||||
mini = UInt8.new "3"
|
||||
maxi = UInt8.new "50"
|
||||
second = UInt8.new "1"
|
||||
|
||||
OptionParser.parse do |parser|
|
||||
parser.banner = "Website-Finder"
|
||||
parser.on "-h", "--help", "Show help" do
|
||||
puts parser
|
||||
exit
|
||||
end
|
||||
parser.on("-t TIMES", "--times=TIMES", "Number of requests / DEFAULT: #{times}") {|p_times| times = p_times.to_u32}
|
||||
parser.on("-d DOMAINS", "--domains=DOMAINS", "Domains used in URLS, like: .com,.net,.gov / DEFAULT: #{domains}") {|p_domains| domains = p_domains.split(",")}
|
||||
parser.on("-m MODE", "--modes=MODES", "You may choose between: http | https | http,https / DEFAULT: #{mode}") {|p_modes| mode = p_modes.split(",")}
|
||||
parser.on("-l", "--log", "Log all requests / DEFAULT: #{log}") {log = true}
|
||||
parser.on("", "--MIN=LENGTH", "Minimum length of URLs / DEFAULT: #{mini}") {|p_length| mini = p_length.to_u8}
|
||||
parser.on("", "--MAX=LENGTH", "Maximum length of URLs / DEFAULT: #{maxi}") {|p_length| maxi = p_length.to_u8}
|
||||
parser.on("-s SECOND", "--second=SECOND", "Likelihood of a URL featuring a second-level domain / DEFAULT: #{second}") {|p_second| second = p_second.to_u8}
|
||||
end
|
||||
|
||||
date = Time.local
|
||||
puts "\nI am going to look for websites through #{times} random URLs (min length #{mini} and max length #{maxi} with the following domains: #{domains}"
|
||||
puts "These URLs will use the protocols #{mode}"
|
||||
puts "and each of them have #{second} in a 100 chance to have a second level domain."
|
||||
puts "Started at #{date.hour}h#{date.minute}m\n"
|
||||
|
||||
report_file = "CR_report_#{date.day}#{date.hour}#{date.minute}.json"
|
||||
main_loop(times, domains, mode, log, mini, maxi, second, report_file)
|
Loading…
Add table
Add a link
Reference in a new issue