Комментарии 21
Проблема не в том, чтобы получить эти данные, а распарсить :)
+3
Парсинг — это не проблема, просто немного муторно. Распарсить текст сможет программист любого уровня и для этого не нужно ничего искать в сети.
Здесь не стал уж вставлять простыни кода парсинга… Каждому нужно что-то получить своё в данных whois
Мне лично были интересны ns-сервера.
Для парсинга их написал
Здесь не стал уж вставлять простыни кода парсинга… Каждому нужно что-то получить своё в данных 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;
}
+1
Распарсить-то не проблема. Проблема в том, что у почти у каждого whois-сервера — свой формат :)
Чуть подробнее по теме: https://whoisrb.org/manual/parser/
Чуть подробнее по теме: https://whoisrb.org/manual/parser/
+3
nslookup -q=ns…? И не имеет ограничений на число запросов.
0
Это же другое совершенно…
0
NS сервера в ответе от whois сервера и через запрос DNS — одно и то же. Нужно не использовать общедоступные рекурсивные, например самый известный 8.8.8.8, а спрашивать сначала корневые (*.root-servers.net), а они ответят списком DNS серверов конкретной зоны.
Просто, когда подбираете свободные имена, то лучше сначала воспользоваться именно опросом DNS, т.к. его легко распараллелить, фильтруя, что в некоторых зонах на любое доменное имя будет корректный ответ (например, раньше так в .tk было, набрав любой свободный домен попадали на страницу регистрации, если правильно помню).
Поэтому, как вы пишите, что если вам интересны только ns-сервера, то это — из пушки по воробьям; из whois куда интереснее дата, когда домен теоретически освободится.
Просто, когда подбираете свободные имена, то лучше сначала воспользоваться именно опросом DNS, т.к. его легко распараллелить, фильтруя, что в некоторых зонах на любое доменное имя будет корректный ответ (например, раньше так в .tk было, набрав любой свободный домен попадали на страницу регистрации, если правильно помню).
Поэтому, как вы пишите, что если вам интересны только ns-сервера, то это — из пушки по воробьям; из whois куда интереснее дата, когда домен теоретически освободится.
0
А как получить другой вид информации?
Например историю по домену?
Вот такую: http://who.ru/simplesearch-rc?domainsimple=habrahabr.ru
Например историю по домену?
Вот такую: http://who.ru/simplesearch-rc?domainsimple=habrahabr.ru
0
К сожалнию, не нашёт такой информации.
Но, боюсь предположить, что она не нахидтся в открытом доступе на серверах WHOIS, т.к. такие как reg.ru эту историю продают и даеко не для всех зон (или вообще только ru, su, рф).
Но, боюсь предположить, что она не нахидтся в открытом доступе на серверах WHOIS, т.к. такие как reg.ru эту историю продают и даеко не для всех зон (или вообще только ru, su, рф).
0
Очевидно, что у них есть бот, который все время проверяет WHOIS по списку доменов.
0
Настраивал я как-то мониторинг регистрации доменов по информации из whois на баше. Дак вот, самая главная проблема в том, что для некоторых зон информацию просто так не предоставляют, например для ES, либо при частых запросах начинают банить по IP. Да и формат ответа хоть и имеет определённую структуру, но далёк от удобоваримого.
+1
Не все так просто с whois как хотелось бы. Если в данной программе запросить данные по google.com, вываливается довольно большой список «левых» доменов. Некоторые whois-сервера позволяют писать уточняющий запрос "=google.com"
Использовать кем то собраный xml, тоже наверно не лучший вариант. Почему не взять данные как положено из www.iana.org/whois?
Использовать кем то собраный xml, тоже наверно не лучший вариант. Почему не взять данные как положено из www.iana.org/whois?
+1
За информацию спасибо!
0
www.iana.org/whois, так же доступен как whois-сервис: whois.iana.org на 43 порту.
0
Все что вы описали — это даже не самая большая проблемы :)
Когда вы начинаете использовать ваш whois на production'e и более-менее средних нагрузках, то сразу вылазит проблема «как проверить 20 доменов за секунду».
Разные whois сервера позволяют параллельно принимать только 1-N запросов. Например, ua только 3 в один момент времени (свыше — баниться на несколько минут), и т.д.
Когда вы начинаете использовать ваш whois на production'e и более-менее средних нагрузках, то сразу вылазит проблема «как проверить 20 доменов за секунду».
Разные whois сервера позволяют параллельно принимать только 1-N запросов. Например, ua только 3 в один момент времени (свыше — баниться на несколько минут), и т.д.
+1
Какое решение кроме использования пула различных IP-адресов на сетевом адаптере видите? )
0
Можно использовать прокси-сервера.
0
Регистраторы используют протокол EPP для проверки занятости/срока делегирования и обновления данных домена а так же регистрации. Иногда регистраторы предоставляют свой whois сервис, который внутри использует тот же EPP, потому как у команды whois в разных дистрибутивах и whois серверов разных доменных зон форматы вывода и названия полей могут сильно отличаться, и парсить одновременно несколько сотен запросов к whois сайту любого регистратора с разными форматами вывода данных я бы сказал — идея плохая от слова совсем.
0
Не соглашусь с этим моментом. По EPP можно получить всю информацию только по своим доменам. Информации по доменам другого регистратора регистратор не видит, только статус «свободен/занят». Регистраторы так же используют Whois, только доступ к нему не ограничивается (до разумных объемов).
Поэтому единственный способ получать информацию по любым доменам — Whois. Но автор статьи действительно даже не проверил google.com и не увидел, что многие серверы требуют разный формат запроса: google.com, «google.com», =google.com, domain google.com и тд
Поэтому единственный способ получать информацию по любым доменам — Whois. Но автор статьи действительно даже не проверил google.com и не увидел, что многие серверы требуют разный формат запроса: google.com, «google.com», =google.com, domain google.com и тд
0
Для тех кто юзает Unix-like.
Я делаю так, что-бы получить краткий вывод.
function _whois_this(){
whois "$1" | grep «Organization:\|Address:\|Country:\|StateProv:»
}
Я делаю так, что-бы получить краткий вывод.
function _whois_this(){
whois "$1" | grep «Organization:\|Address:\|Country:\|StateProv:»
}
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Делаем собственный сервис по определению WHOIS любого домена