
WHOISサービスは、ドメイン名を常に使用している人々のための主要なツールの1つです。 美しいドメイン名を自分で選択したい人と、他のサービスの中でもドメインを登録できる可能性を提供できるホスティングプロバイダーの両方が必要です。 それらも他も、彼らの仕事の自動化を探しています。
だから、それがどのように機能するかを理解しましょう。
各ドメインゾーンは、RU、COM、またはHOSTにかかわらず、そのゾーンにあるドメインに関する情報を持つ少なくとも1つのセンター(whoisサーバー)を持っています。 RUゾーンの場合、たとえば、whois.ripn.netおよびwhois.tcinet.ru
すべてのドメインゾーンのすべてのwhoisサーバーは、ポート43で接続と要求をリッスンする厳密に統合されたプロトコルに関する情報を提供します。
whoisサーバーへのまさにそのリクエストは、このポートに目的のドメイン名を送信するだけで、その後に答えを読むだけです。
ドメインのWHOIS情報を自動的に取得するシステムを開発するには、最初に既存のすべてのドメインゾーンのwhoisサーバーのリストを取得する必要があります。 正しいリクエストにより、最初の行のGoogleはGitHubのプロジェクトへのリンクを提供します。ここには、必要なすべての情報を含む本格的なXMLが投稿されます。
https://raw.githubusercontent.com/whois-server-list/whois-server-list/master/whois-server-list.xml
後でアプリケーションで開くために、このファイルを自分自身に保存します。
XMLファイルを絶えず更新して解析するのがあまり便利ではないと思われる場合は、より簡単な方法-サードパーティのオンラインサービスwhois-servers.netを使用できます。 ルートゾーンの名前に末尾の「.whois-servers.net」を貼り付け、WHOISデータのリクエストを送信するための既製のアドレスを取得します(たとえば、COMゾーンの場合はアドレス「com.whois-servers.net」を取得します)。 このサービスは、WHOISとは何の関係もなく、第3レベルのドメインを持つ稼働中のWHOISサーバーの正しいアドレスを参照するだけです。
例は、通常のWinFormsのC#で開発されています。2つのテキストフィールドと1つのボタンのみです。
ダウンロードしたXMLファイルからドメインゾーンのWHOISサーバーのリストを取得するために、次の関数が作成されました。
public static List<string> GetWhoisServers(string domainZone){ if (_serverList == null){ _serverList = new XmlDocument(); // XML _serverList.Load("whois-server-list.xml"); } List<string> result = new List<string>(); // XML Action<XmlNodeList> find = null; find = new Action<XmlNodeList>((nodes) =>{ foreach (XmlNode node in nodes) if (node.Name == "domain"){ // XML if (node.Attributes["name"] != null && node.Attributes["name"].Value.ToLower() == domainZone){ foreach (XmlNode n in node.ChildNodes) // , if (n.Name == "whoisServer"){ XmlAttribute host = n.Attributes["host"]; if (host != null && host.Value.Length > 0 && !result.Contains(host.Value)) result.Add(host.Value); } } find(node.ChildNodes); } }); find(_serverList["domainList"].ChildNodes); return result; }
既知のサーバーからWHOIS情報を取得するための関数は次のようになります。
public static string Lookup(string whoisServer, string domainName){ try{ if (string.IsNullOrEmpty(whoisServer) || string.IsNullOrEmpty(domainName)) return null; //Punycode- ( ) Func<string, string> formatDomainName = delegate(string name){ return name.ToLower() // , //, "." XN--H1ALFFA9F.XN--P1AI .Any(v => !"abcdefghijklmnopqrstuvdxyz0123456789.-".Contains(v)) ? new IdnMapping().GetAscii(name) :// Punycode name;// }; StringBuilder result = new StringBuilder(); result.AppendLine(" " + whoisServer + ": ------------------------------------------"); using (TcpClient tcpClient = new TcpClient()){ // WHOIS tcpClient.Connect(whoisServer.Trim(), 43); byte[] domainQueryBytes = Encoding.ASCII.GetBytes(formatDomainName(domainName) + "\r\n"); using (Stream stream = tcpClient.GetStream()){ // WHOIS stream.Write(domainQueryBytes, 0, domainQueryBytes.Length); // UTF8, using (StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8)){ string row; while ((row = sr.ReadLine()) != null) result.AppendLine(row); } } } result.AppendLine("---------------------------------------------------------------------\r\n"); return result.ToString(); }catch{} return " " + whoisServer; }
この関数は、キリル文字(または他の言語)のドメインを自動的に変換できるため、要求はラテン語のクラシックゾーンのドメインだけでなく、国内のドメインでも完全に機能します。 .NETでは、この変換がSystem.Globalization.IdnMappingクラスを使用する1行のコードによって実装されることは特に便利です。
これらの2つの作成された関数は、必要なものすべてを提供し、フォーム上の[データの取得]ボタンのクリックを処理するだけです。
WHOIS検証用の入り口にドメイン名があるため、最初にドメインが存在するゾーンを分離する必要があります。 ドメインが任意のレベルのゾーンに存在できるという事実を考慮して(常に2番目のレベルにある必要はありません!)、単純なサイクルを記述しました。各レベルで、最高レベルから開始して、WHOISサーバーの可用性をチェックします。
private void get_BTN_Click(object sender, EventArgs e){ List<string> whoisServers = null; // string[] domainLevels = domainName_TB.Text.Trim().Split('.'); // WHOIS- for (int a = 1; a < domainLevels.Length; a++){ /* * test.some-name.ru.com, * WHOIS- some-name.ru.com, * ru.com , com */ string zone = string.Join(".", domainLevels, a, domainLevels.Length - a); whoisServers = WhoisService.GetWhoisServers(zone); // WHOIS-, if (whoisServers.Count > 0) break; } if (whoisServers == null || whoisServers.Count == 0) result_TB.Text = domainName_TB.Text + "\r\n----------------\r\n "; else{ result_TB.Text = ""; foreach (string whoisServer in whoisServers) result_TB.Text += WhoisService.Lookup(whoisServer, domainName_TB.Text); } }
次に、見つかった各サーバーのドメイン情報を要求し、出力ウィンドウに書き込みます。

記事のコードから部分的に収集しないように、完成したプロジェクトはここにアップロードされました 。