Как получить whois-информацию о доменном имени в моей программе?

#c# #java #whois #domain-name

Вопрос:

Я хочу получить whois-информацию о доменном имени из моих программ на c#/java. Есть ли простой способ сделать это?

Ответ №1:

Я нашел идеальный пример C# на dotnet-snippets.com (которого больше не существует).

Это 11 строк кода, которые нужно скопировать и вставить прямо в ваше собственное приложение.

 /// <summary>
/// Gets the whois information.
/// </summary>
/// <param name="whoisServer">The whois server.</param>
/// <param name="url">The URL.</param>
/// <returns></returns>
private string GetWhoisInformation(string whoisServer, string url)
{
    StringBuilder stringBuilderResult = new StringBuilder();
    TcpClient tcpClinetWhois = new TcpClient(whoisServer, 43);
    NetworkStream networkStreamWhois = tcpClinetWhois.GetStream();
    BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois);
    StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois);

    streamWriter.WriteLine(url);
    streamWriter.Flush();

    StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois);

    while (!streamReaderReceive.EndOfStream)
        stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());

    return stringBuilderResult.ToString();
}
 

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

1. Добавляя, что мне пришлось добавить using System.Net.Sockets; using System.IO; , чтобы завершить код…

2. TcpClient, NetworkStream, BufferedStream, StreamWriter и StreamReader — все это необходимо утилизировать после использования.

Ответ №2:

Я думаю, что самый простой способ-это подключение сокета к whois-серверу на порту 43. Отправьте имя домена, за которым следует новая строка, и прочитайте ответ.

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

1. Вам необходимо определить, какой сервер whois использовать в первую очередь. Вот пример этого: вот хороший пример: flipbit.co.uk/2009/06/querying-whois-server-data-with-c.html

2. «Все запросы завершаются с помощью ASCII CR, а затем ASCII LF». tools.ietf.org/html/rfc3912 2. Спецификация протокола

Ответ №3:

Ответ Томаса будет работать только в том случае, если вы знаете, к какому серверу «whois» подключиться.

Существует множество различных способов выяснить это, но ни один (AFAIK) не работает одинаково для каждого реестра доменов.

Некоторые доменные имена поддерживают SRV запись для _nicname._tcp службы в DNS, но с этим возникают проблемы, поскольку пока не существует общепринятого стандарта о том, как запретить поддомену обслуживать SRV записи, которые переопределяют записи официального реестра (см. https://datatracker.ietf.org/doc/html/draft-sanz-whois-srv-00).

Для многих ДВУ можно отправить запрос по <tld>.whois-servers.net адресу . На самом деле это работает довольно хорошо, но имейте в виду, что это не будет работать во всех случаях, когда существуют официально делегированные домены второго уровня.

Например, .uk существует несколько официальных поддоменов, но только некоторые из них управляются .uk реестром, а другие имеют свои собственные службы WHOIS, и их нет в whois-servers.net базе данных.

К сожалению, существуют также «неофициальные» реестры, такие как .uk.com , которые находятся в whois-servers.net базе данных.

p.s. официальным разделителем конца строки в WHOIS, как и в большинстве протоколов IETF , является CRLF не только LF .

Ответ №4:

Я нашел несколько веб-сервисов, которые предоставляют эту информацию. Это бесплатно и отлично сработало для меня. http://www.webservicex.net/whois.asmx?op=GetWhoIS

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

1. Выглядело многообещающе, но я получаю: System.Net.Сокеты. Исключение SocketException: Запрошенное имя является допустимым, но в whois не было найдено данных запрошенного типа. кто. GetWhoIS(Строковое имя хоста) (даже при вводе ip-адреса в поле на самой информационной странице)

Ответ №5:

Я нашел здесь идеальный пример C#. Это 11 строк кода, которые нужно скопировать и вставить прямо в ваше собственное приложение. НО сначала вы должны добавить некоторые инструкции using, чтобы убедиться, что методы dispose правильно вызываются для предотвращения утечек памяти:

 StringBuilder stringBuilderResult = new StringBuilder();
using(TcpClient tcpClinetWhois = new TcpClient(whoIsServer, 43))
{
   using(NetworkStream networkStreamWhois = tcpClinetWhois.GetStream())
   {
      using(BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois))
      {
         using(StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois))
         {
            streamWriter.WriteLine(url);
            streamWriter.Flush();
            using (StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois))
            {
               while (!streamReaderReceive.EndOfStream) stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());
            }
         }
      }
   }
}
 

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

1. Спасибо, что опубликовали этот ответ. Я отредактировал ваш пост, чтобы исправить некоторые проблемы с форматированием кода.

2. Вы действительно запустили код? При запуске этого кода я получил исключение «Не удается получить доступ к закрытому потоку». Если я не поставил использование перед StreamReader streamReaderReceive = новый StreamReader(bufferedStreamWhois), я не получил исключения.

Ответ №6:

Вот решение Java, которое просто открывает оболочку и запускает whois :

 import java.io.*;
import java.util.*;

public class ExecTest2 {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("whois stackoverflow.com");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        StringBuffer outputSB = new StringBuffer(40000);
        String s = null;

        while ((s = output.readLine()) != null) {
            outputSB.append(s   "n");
            System.out.println(s);
        }

        String whoisStr = output.toString();
    }
}
 

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

1. Не тратьте деньги только на то, чтобы запустить команду whois, это создаст бесконечный поток проблем с безопасностью и производительностью. Вместо этого используйте библиотеки вашего языка программирования для выполнения запросов whois или, поскольку протокол настолько прост, просто откройте TCP-сокет на порт 43 и отправьте свой запрос. Подробнее читайте RFC3912.