Как стать автором
Обновить

Комментарии 21

Проблема не в том, чтобы получить эти данные, а распарсить :)
Парсинг — это не проблема, просто немного муторно. Распарсить текст сможет программист любого уровня и для этого не нужно ничего искать в сети.
Здесь не стал уж вставлять простыни кода парсинга… Каждому нужно что-то получить своё в данных whois
Мне лично были интересны ns-сервера.
Для парсинга их написал
такую функцию ->
public static List<string> ParseNameServers(string whoisData){
    if (string.IsNullOrEmpty(whoisData)) return null;
    List<string> result = new List<string>();
    whoisData = whoisData.ToLower().Replace("\r\n", "\n").Replace("\r", "\n");
    foreach (string line in whoisData.Split('\n'))
        if (line.Length > 0){
            int sep = line.IndexOf(":");
            if (sep > 0){
                string param = line.Substring(0, sep).ToLower();
                if (param.Contains("n") && param.Contains("server")){
                    string nameServer = line.Substring(sep + 1, line.Length - sep - 1).Trim().ToLower();
                    while (nameServer.Length > 0 && nameServer.Substring(nameServer.Length - 1, 1) == ".")
                        nameServer = nameServer.Substring(0, nameServer.Length - 1);
                    if (nameServer.Length > 0 && nameServer.Contains(".") && !result.Contains(nameServer))
                        result.Add(nameServer);
                }
            }
        }
    if (result.Count == 0 && whoisData.Contains("ns server")) {
        bool startFound = false;
        foreach (string line in whoisData.Split('\n'))
            if (line.Contains("ns server")) startFound = true;
            else if (startFound){
                string nameServer = FormatDomainName(line);
                if (!ValidateDomainName(nameServer, false)) break;
                if (nameServer.Length > 0 && nameServer.Contains(".") && !result.Contains(nameServer))
                    result.Add(nameServer);
            }
    }
    return result;
}

public static string FormatDomainName(string value){
    if (string.IsNullOrEmpty(value)) return value;
    value = value.Trim().ToLower().Replace(",", ".");
    while (value.Contains("..")) value = value.Replace("..", ".");
    while (value.Length > 0 && value.Substring(0, 1) == ".") value = value.Substring(1, value.Length - 1).Trim();
    while (value.Length > 0 && value.Substring(value.Length - 1,1) == ".") value = value.Substring(0, value.Length - 1).Trim();
    return value;
}

private static string _symbols = "abcdefghijklmnopqrstuvwxyz0123456789-.";
public static bool ValidateDomainName(string value, bool onlySecondLevelDomains){
    if (string.IsNullOrEmpty(value)) return false;
    value = value.Trim().ToLower();
    int dotCount = 0;
    for (var a = 0; a < value.Length; a++){
        if (value.Substring(a, 1) == ".")
            dotCount++;
        if (!_symbols.Contains(value.Substring(a, 1)))
            return false;
    }
    return onlySecondLevelDomains ? dotCount == 1 : dotCount > 0;
}

Распарсить-то не проблема. Проблема в том, что у почти у каждого whois-сервера — свой формат :)

Чуть подробнее по теме: https://whoisrb.org/manual/parser/
nslookup -q=ns…? И не имеет ограничений на число запросов.
Это же другое совершенно…
NS сервера в ответе от whois сервера и через запрос DNS — одно и то же. Нужно не использовать общедоступные рекурсивные, например самый известный 8.8.8.8, а спрашивать сначала корневые (*.root-servers.net), а они ответят списком DNS серверов конкретной зоны.
Просто, когда подбираете свободные имена, то лучше сначала воспользоваться именно опросом DNS, т.к. его легко распараллелить, фильтруя, что в некоторых зонах на любое доменное имя будет корректный ответ (например, раньше так в .tk было, набрав любой свободный домен попадали на страницу регистрации, если правильно помню).
Поэтому, как вы пишите, что если вам интересны только ns-сервера, то это — из пушки по воробьям; из whois куда интереснее дата, когда домен теоретически освободится.
К сожалнию, не нашёт такой информации.
Но, боюсь предположить, что она не нахидтся в открытом доступе на серверах WHOIS, т.к. такие как reg.ru эту историю продают и даеко не для всех зон (или вообще только ru, su, рф).

Очевидно, что у них есть бот, который все время проверяет WHOIS по списку доменов.

Что скажете по поводу этого средства?
Не слышал о таком
Настраивал я как-то мониторинг регистрации доменов по информации из whois на баше. Дак вот, самая главная проблема в том, что для некоторых зон информацию просто так не предоставляют, например для ES, либо при частых запросах начинают банить по IP. Да и формат ответа хоть и имеет определённую структуру, но далёк от удобоваримого.
Не все так просто с whois как хотелось бы. Если в данной программе запросить данные по google.com, вываливается довольно большой список «левых» доменов. Некоторые whois-сервера позволяют писать уточняющий запрос "=google.com"
Использовать кем то собраный xml, тоже наверно не лучший вариант. Почему не взять данные как положено из www.iana.org/whois?
За информацию спасибо!
Все что вы описали — это даже не самая большая проблемы :)

Когда вы начинаете использовать ваш whois на production'e и более-менее средних нагрузках, то сразу вылазит проблема «как проверить 20 доменов за секунду».

Разные whois сервера позволяют параллельно принимать только 1-N запросов. Например, ua только 3 в один момент времени (свыше — баниться на несколько минут), и т.д.
Какое решение кроме использования пула различных IP-адресов на сетевом адаптере видите? )
Можно использовать прокси-сервера.
Регистраторы используют протокол EPP для проверки занятости/срока делегирования и обновления данных домена а так же регистрации. Иногда регистраторы предоставляют свой whois сервис, который внутри использует тот же EPP, потому как у команды whois в разных дистрибутивах и whois серверов разных доменных зон форматы вывода и названия полей могут сильно отличаться, и парсить одновременно несколько сотен запросов к whois сайту любого регистратора с разными форматами вывода данных я бы сказал — идея плохая от слова совсем.
Не соглашусь с этим моментом. По EPP можно получить всю информацию только по своим доменам. Информации по доменам другого регистратора регистратор не видит, только статус «свободен/занят». Регистраторы так же используют Whois, только доступ к нему не ограничивается (до разумных объемов).

Поэтому единственный способ получать информацию по любым доменам — Whois. Но автор статьи действительно даже не проверил google.com и не увидел, что многие серверы требуют разный формат запроса: google.com, «google.com», =google.com, domain google.com и тд
Для тех кто юзает Unix-like.
Я делаю так, что-бы получить краткий вывод.

function _whois_this(){
whois "$1" | grep «Organization:\|Address:\|Country:\|StateProv:»
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации