PERL. Поиск коротких доменов – 2 решения

Бывают ситуации, когда нужно найти свободный и короткий домен, к примеру, трёх-символьный.
Для себя я выбрал доменную зону .net

Способ первый:
В интернете можно найти не актуальные на сегодняшний день базы, к примеру:
https://www.domainresearchtool.com/lists/net.zone.gz
Но проблема в том, что эта база за 2014 год и она уже устарела. Но на случай, если у вас есть бюджет около 30 $, вы можете купить этот файл, актуальный на сегодняшний день.
Скрипты, которые помогут получить из файла все трёх-символьные домены, были написаны на PERL’е.

open(my $fh, "<", "zone.txt") or die "Can't open file: $!";
open(my $wh, '>', "custom.txt") or die "Can't open file: $!";
$cou=0;
while (<$fh>) {
  my @array = split /\s+/, $_;
  if ((@array[1] eq "NS")&&(@array[0] ne $tmp)&&(length @array[0] == 3)){
    print $wh @array[0]."\n";
  }
  $tmp=@array[0];
  $cou++;
  if ($cou%100000==0){
    print "$cou\n";
  }
}
close $fh;
close $wh;
open(my $fh, "<", "custom.txt")
or die "Can't open file: $!";
chomp(my @lines = <$fh>);
close $fh;
@list=sort @lines;
open(my $fh, ">", "sorted.txt")
or die "Can't open file: $!";
foreach (@list) {
  print $fh "$_\n";
}
close $fh;

 
Этот скрипт, берёт из файла zone.txt все трёх-буквенные домены и сохраняет их в файл custom.txt, после чего сортирует найденные домены по алфавиту и сохраняет сортированный список в файл sorted.txt.

Второй скрипт:

open(my $fh, "<", "sorted.txt")
or die "Can't open file: $!";
chomp(@lines = <$fh>);
close $fh;
open(my $wh, '>', "free.txt") or die "Can't open file: $!";
my $cou=0;
@letters=('-','0'..'9','A'..'Z');
for(my $i=1; $i < scalar @letters; $i++){
  for(my $j=0; $j < scalar @letters; $j++){
    for(my $k=1; $k < scalar @letters; $k++){
      $dmn=@letters[$i].@letters[$j].@letters[$k];
      if(isPresent($dmn)<1){
        $cou++;
        print $wh $dmn."\n";
        if($cou %100 == 0){
          print $cou.", ";
        }
      }
    }
  }
}
close $wh;
print "ok";
sub isPresent(){
  my ($dmn)=@_;
  foreach(@lines){
    if ($_ eq $dmn){
      return 1;
    }
  }
  return 0;
}

 
Загружает файл sorted.txt и генерирует все возможные комбинации трех-символьных доменов от 0-0 до ZZZ, далее проверяет существуют ли эти домены в файле sorted.txt и если их нет, то создаётся файл free.txt.
Как раз эти имена вы сможете использовать для выбора и регистрации уже своего домена.

Второй способ:
Если у вас нет доступа к актуальным файлам доменных зон, можно написать бота, который переберёт все возможные комбинации имени домена, и воспользовавшись командой nslookup найдёт все незарегистрированные. Проблема в том, что, если домен приобретен, но в него не внесены записи, то он тоже будет считаться свободным – “Non-existent domain”, в итоге, мы получаем около 1000 ложных срабатываний.

Листинг бота:

print "Generating all domains names... \n";
my @domains;
@letters=('-','0'..'9','A'..'Z');
for(my $i=1; $i < scalar @letters; $i++){
  for(my $j=0; $j < scalar @letters; $j++){
    for(my $k=1; $k < scalar @letters; $k++){
      push @domains, @letters[$i].@letters[$j].@letters[$k].'.net';
    }
  } 
}
print "Scaning... \n"; unless(open FILE, '>free-domains.txt') {
  die "\nUnable to create $file\n";
}
close FILE;
my $cou=0;
foreach my $domain (@domains)
{
  chomp($domain);
  my $output = qx(nslookup -type=ns $domain 2>&1);
  my $r_c=$?;
  print "|";
  if((index $output, "Non-existent domain") > -1){
    print "\n".$domain."\n";
    open(my $wh, '>>', "free-domains.txt");
    print $wh $domain."\n";
    close($wh);
  }
  if($cou%1000==0){
  print "\nLast checked($cou): ".$domain."\n";
  }
  $cou++;
}

 
Бот сохраняет все, как он считает, свободные домены в файл free-domains.txt
Полученный список можно прогнать через любой сервис массовой проверки доменов, я использовал https://www.reg.ru/domain/new/bulk
Посылая на проверку по 200-300 доменов, через этот сервис, можно достаточно быстро, перебрать весь список, а свободные домены поместятся в корзину.
Вот результат поиска на сегодняшний день: