using System; using xNet.Net; using System.IO; using System.Web; using System.Text; using System.Net.Sockets; using System.Globalization; using System.Collections.Generic; using System.Text.RegularExpressions; namespace Library.Network { public class WhoisNAUNET { public class result { public result() { ActivNS = new List { }; whoisData = string.Empty; } /// /// Список активных ns серверов /// public List ActivNS { get; internal set; } /// /// Ответ whois в обычном текстовом формате /// public string whoisData { get; internal set; } /// /// Сообщает был ли запрос на whois сервис успешным /// public bool ReplyStatus { get; internal set; } /// /// Если домен делегирован у регистратора /// public bool Delegate { get; internal set; } /// /// Если whois вернул сообщение об исчерпание лимита /// public bool Limited { get; internal set; } } public result host(string url, bool UsingTor = false) { //Регулярка для доменов url = Regex.Replace(url.ToLower(), "(https?://|/$)", ""); if (Regex.IsMatch(url, "(.ru$|.su$|.рф$|.xn--p1ai$|.com$|.net$|.biz$|.info$|.mobi$|.org$|.pro$|.tel$|.xxx$|.cc$|.mn$|.ws$|.tv$|.me$|.in$|.bz$|.us$|.co$|.de$|.se$)")) { //Переводим домен .рф в нужную кирилицу if (Regex.IsMatch(url, ".рф$")) { IdnMapping idn = new IdnMapping(); url = idn.GetAscii(url).ToString(); idn = null; } //Отправляем запрос в naunet.ru и достаем whois данные var request = new BrowserTOR().get(("http://client.naunet.ru/c/whoisinfo?domain=" + url), Encoding.Default, "client.naunet.ru", UsingTor); //Проверяем успешность запроса (если он не удался то возврашаем null) if (request == null || !request.ReplyStatus || request.html == null || request.html.Trim() == "") { url = null; request = null; return new result() { Limited = true }; } //Создаем класс возврата и записываем в него только whois данные result host = new result(); host.ReplyStatus = true; host.whoisData = (new Regex("
([^<]+)<").Match(Regex.Replace(request.html.ToLower(), "  +", " ")).Groups[1].Value).Replace(":", ": ");

                //Проверяем WhoisData на содержание текста
                if (host.whoisData == null || host.whoisData.Replace(" ", "").Trim() == "")
                {
                    url = null; request = null; host = null;
                    return new result() { Limited = true };
                }

                //Получаем список ns серверов
                foreach (Match match in new Regex(@"(nserver|name +server|nameservers): +([\wа-я0-9-\.]+)").Matches(host.whoisData))
                {
                    host.ActivNS.Add(Regex.Replace(match.Groups[2].Value.Trim(), @"\.$", ""));
                }

                //Смотрим делегирован ли домен
                host.Delegate = Regex.IsMatch(host.whoisData, "(state|status): +(registered, +delegated|(client|server)transferprohibited|client +transfer +prohibited|ok|connect|active)");

                //Проверка на исчерпание лимита и исключение не делегированных доменов
                if ((host.ActivNS.Count == 0 || host.ActivNS[0] == "not") && !Regex.IsMatch(host.whoisData, "state: +registered, +not +delegated"))
                {
                    host.Limited = true;
                }

                //Чистим ресурсы 
                url = null; request = null;

                //Возврашаем результат
                return host;
            }
            else
            {
                return new result();
            }
        }
    }
}