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





Я думаю, что самый простой способ - это соединение сокета с сервером whois через порт 43. Отправьте имя домена с переводом строки и прочтите ответ.
«Все запросы завершаются ASCII CR, а затем ASCII LF». tools.ietf.org/html/rfc3912 2. Спецификация протокола
Вот решение 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.
Ответ Томаса будет работать только в том случае, если вы знаете сервер который "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-адреса в поле на сама информационная страница)
Я нашел идеальный пример 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; для завершения кода ...
Я нашел здесь идеальный пример 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());
}
}
}
}
}
Спасибо, что разместили этот ответ. Я отредактировал ваше сообщение, чтобы исправить некоторые проблемы с форматированием кода.
Вы действительно запускали код? Я получил исключение «Невозможно получить доступ к закрытому потоку» при запуске этого кода. Если бы я не использовал перед StreamReader streamReaderReceive = new StreamReader (bufferedStreamWhois), у меня не было бы исключения.
Вам необходимо сначала определить whois-сервер который. Вот пример этого: вот хороший пример: flipbit.co.uk/2009/06/querying-whois-server-data-with-c.html