C#/Java プログラムからドメイン名の whois 情報を取得したいと考えています。これを行う簡単な方法はありますか?
6 に答える
I think, the easiest way is a socket connection to a whois server on port 43. Send the domainname followed by a newline and read the response.
トーマスの答えは、接続する「whois」サーバーがわかっている場合にのみ機能します。
それを見つけるにはさまざまな方法がありますが、すべてのドメインレジストリで一様に機能する方法はありません (AFAIK)。
一部のドメイン名は DNS 内SRV
のサービスのレコードをサポートしていますが、公式レジストリのレコードを上書きするレコードを_nicname._tcp
サブドメインが提供するのを防ぐ方法については、まだ承認された標準がないため、問題があります ( https://datatracker. ietf.org/doc/html/draft-sanz-whois-srv-00 )。SRV
多くの TLD では、クエリを に送信できます<tld>.whois-servers.net
。これは実際には非常にうまく機能しますが、公式に委任された第 2 レベル ドメインがあるすべての場合に機能するとは限らないことに注意してください。
たとえば、.uk
公式のサブドメインがいくつかありますが、そのうちの一部のみが.uk
レジストリによって実行されており、他のサブドメインには独自の WHOIS サービスがあり、whois-servers.net
データベースにはありません。
紛らわしいことに、データベース.uk.com
にはなどの「非公式」レジストリもありwhois-servers.net
ます。
ps は、ほとんどの IETF プロトコルと同様に、WHOIS の公式の行末区切り文字でありCRLF
、単なる ではありませんLF
。
この情報を提供するWebサービスをいくつか見つけました。これは無料で、私にとっては素晴らしい働きをしました。 http://www.webservicex.net/whois.asmx?op=GetWhoIS
ここで完璧な 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());
}
}
}
}
}
Here's the Java solution, which just opens up a shell and runs 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();
}
}