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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
12 398
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

Colin Pickard 17.06.2014 17:05

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

brewmanz 11.04.2017 06:31

Вот решение 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();
    }
}

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

Patrick Mevzek 08.01.2018 20:22

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

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

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

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

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

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

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

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

Выглядело многообещающе, но я получаю: System.Net.Sockets.SocketException: запрошенное имя действительно, но данные запрошенного типа не были найдены в whois.whois.GetWhoIS (String HostName) (даже при вводе IP-адреса в поле на сама информационная страница)

Jimmy 25.03.2014 18:13

Я нашел идеальный пример 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();
}

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

KingsInnerSoul 07.07.2016 05:43

Я нашел здесь идеальный пример 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());
            }
         }
      }
   }
}

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

Brian 24.04.2013 01:48

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

Silent Sojourner 20.01.2016 00:17

Другие вопросы по теме