2021-06-25 01:05:28 +02:00
using System ;
using System.IO ;
using System.Net ;
using System.Text ;
using System.Text.Json ;
using System.Text.Json.Serialization ;
using System.Collections.Generic ;
using System.Linq ;
class WebRequests
{
2021-06-29 15:16:53 +02:00
public static void Main ( string [ ] args )
2021-06-25 01:05:28 +02:00
{
2021-06-29 15:16:53 +02:00
int times = Array . IndexOf ( args , "-t" ) > - 1 ? int . Parse ( args [ Array . IndexOf ( args , "-t" ) + 1 ] ) : 3000 ;
2022-12-11 20:00:36 +01:00
string [ ] protocols = Array . IndexOf ( args , "-p" ) > - 1 ? args [ Array . IndexOf ( args , "-p" ) + 1 ] . Split ( "," ) : new string [ ] { "http" } ;
2021-06-29 15:16:53 +02:00
string [ ] domains = Array . IndexOf ( args , "-d" ) > - 1 ? args [ Array . IndexOf ( args , "-d" ) + 1 ] . Split ( "," ) : new string [ ] { ".co" , ".com" , ".net" , ".edu" , ".gov" , ".cn" , ".org" , ".cc" , ".us" , ".mil" , ".ac" , ".it" , ".de" } ;
int second = Array . IndexOf ( args , "-s" ) > - 1 ? int . Parse ( args [ Array . IndexOf ( args , "-s" ) + 1 ] ) : 1 ;
2022-12-11 20:00:36 +01:00
bool log = Array . IndexOf ( args , "-l" ) > - 1 ;
int min = Array . IndexOf ( args , "-MIN" ) > - 1 ? int . Parse ( args [ Array . IndexOf ( args , "-MIN" ) + 1 ] ) : 2 ;
int max = Array . IndexOf ( args , "-MAX" ) > - 1 ? int . Parse ( args [ Array . IndexOf ( args , "-MAX" ) + 1 ] ) : 50 ;
2021-06-29 15:16:53 +02:00
DateTime time = DateTime . Now ;
2022-12-11 20:00:36 +01:00
Console . WriteLine ( $"\nI am going to look for websites through {times} random URLs (min length {min} and max length {max}) with the following domains: {String.Join(" , ", domains)}" ) ;
Console . WriteLine ( $"These URLs will use the protocols {String.Join(" , ", protocols)} and each of those URLs have {second} in a 100 chance to have a second level domain." ) ;
2021-06-29 15:16:53 +02:00
Console . WriteLine ( $"Started at {time.Hour}h{time.Minute}m\n" ) ;
2021-06-25 01:05:28 +02:00
List < data > _data = new List < data > ( ) ;
for ( int i = 0 ; i < times ; i + + )
{
2022-12-11 20:00:36 +01:00
string url = RandomURL ( domains , protocols , min , max , second ) ;
2021-06-25 01:05:28 +02:00
if ( log ) Console . WriteLine ( $"{url} ({i+1}/{times})" ) ;
try
{
WebRequest request = WebRequest . Create ( url ) ;
request . Credentials = CredentialCache . DefaultCredentials ;
HttpWebResponse response = ( HttpWebResponse ) request . GetResponse ( ) ;
// exists, save url and response
Console . WriteLine ( $"{url} exists! {response.StatusDescription}" ) ;
_data . Add ( new data ( )
{
website_url = url ,
response_type = "SUCCESS" ,
response_code = $"{(int)response.StatusCode}" ,
response_details = response . StatusDescription
} ) ;
response . Close ( ) ;
}
catch ( System . Net . WebException e )
{
if ( e . InnerException ! = null )
{
if ( e . InnerException . InnerException ! = null )
{
if ( e . InnerException . InnerException . GetType ( ) ! = typeof ( System . Net . Sockets . SocketException ) )
{ // exists, save url and exception
Console . WriteLine ( $"{url} exists! {e.InnerException.InnerException.GetType()}" ) ;
_data . Add ( new data ( )
{
website_url = url ,
response_type = "ERROR" ,
response_code = "UNKNOWN" , // Haven't found out if there is a way to get the response code from host
response_details = $"{e.InnerException.InnerException.GetType()} | {e.Message}"
} ) ;
}
}
}
}
}
2021-06-29 15:16:53 +02:00
string json_file_name = $"C#_report_{time.Day}{time.Hour}{time.Minute}.json" ;
2021-06-25 01:05:28 +02:00
string json = JsonSerializer . Serialize ( _data ) ;
2021-06-29 15:16:53 +02:00
File . WriteAllText ( json_file_name , json ) ;
2021-06-25 01:05:28 +02:00
}
public class data
{
public string website_url { get ; set ; }
public string response_type { get ; set ; }
public string response_code { get ; set ; }
public string response_details { get ; set ; }
}
private static Random random = new Random ( ) ;
2022-12-11 20:00:36 +01:00
public static string RandomURL ( string [ ] d , string [ ] p , int min , int max , int second )
2021-06-25 01:05:28 +02:00
{
const string chars = "abcdefghijklmnopqrstuvwyxz0123456789" ;
2022-12-11 20:00:36 +01:00
string full_url = p [ random . Next ( m . Length ) ] + "://" ; // protocols (http/https)
full_url + = new string ( Enumerable . Repeat ( chars , random . Next ( min , max ) )
2021-06-25 01:05:28 +02:00
. Select ( s = > s [ random . Next ( s . Length ) ] ) . ToArray ( ) ) ; // Domain name (abc69)
full_url + = d [ random . Next ( d . Length ) ] ; // Top-level domain (.fr)
if ( random . Next ( 100 ) < = second ) full_url + = d [ random . Next ( d . Length ) ] ; // Second-level domain (.co)
return full_url ;
}
}