純規の暇人趣味ブログ

首を突っ込んで足を洗う

Windows用のWhoisクライアント作った

      HimaJyun

車輪の再発名にも程があるのでしょうが、Windows用にwhoisクライアントを作りました。

コマンドから使う奴ね。GUIは甘え。

Windowsでもwhoisしたい

そもそもコマンドからwhoisしたいって状況自体があまりなさそうだし、しかもGUIが基本のWindowsでコマンドからwhoisしたがる人はあまり居ないでしょう。

という訳だからなのか、Microsoftが配布しているWindows用のwhois、めっちゃクソいんですよ。

ココが辛いよMS公式whois & jwhois

何がクソいかというと

  1. 「Registrar WHOIS Server」を見て再帰問い合わせするクセに無限ループのチェックはしていない
  2. 流石に機能がしょぼすぎる(最低限の問い合わせしか出来ない、ちょっと自動化されたtelnet並)

機能がしょぼいのは許容範囲だったんですけど、無限ループしちゃうのが辛いので……

ちなみに、jwhoisってのもあるんですけど、これはこれでnew gTLDにほぼ非対応、かと言って対応するために設定ファイルを書きまくるのは辛すぎる。

MS公式Whoisは「(tld).whois-servers.net」に見に行ってるみたいで、新しいドメインでも割と結果は得られます。

どちらにせよ、イマイチしっくりこなかったので。ないなら作る!

Whowins

という訳で作りました。Whois+WindowsでWhowins(フーウィンズ)です。

コマンド用です、GUIなんて豪華な物はありません。

ダウンロード

GitHubからzipをダウンロードしてPathを通してください。(レジストリとか使ってないので要らなくなったらゴミ箱シュートでOK)

余談ですけど、「%USERPROFILE%\bin」にPathを通しておくと便利です。*nixでいう「$HOME/bin」みたいな奴

私はここにwhowins(名前はwhoisにしてる)を入れています。

使い方

「whowins (オプション) example.com」です。

特徴はこんな感じ。

  1. 実験的機能ですがIPアドレス(v4/v6)の所有者情報も閲覧できます。
    ただしこれはRDAPというWhoisの後継プロトコルで得られたjsonを出力しているだけなので期待しないでください。(誰かRDAPのjsonパーサー書いて)
  2. ブラウザからドメインをコピーするとお節介機能で「http://」とか勝手に付けられることがあるので、URIなのを検出したら("://"を見つけたら)パースしてドメインを取り出します。
  3. 再帰問い合わせに対応しているので、応答から「Registrar WHOIS Server:」を見つけるとそのwhoisサーバーに対して再帰的に問い合わせをします。(com/net辺りでverbose付けて試すと良く分かると思う)
  4. 日本語ドメイン対応してます。(Punycode変換が.NET標準機能で出来て良かったZE!)

whoisの規格には文字コードなどが決められていない(そのくせ平気でマルチバイト文字を応答する)という問題があります。

とりあえずはStreamReaderに判別させていますが精度は低いと思います、一応jpドメインの日本語情報がOKなのは確認しましたが、tw/cn辺りの中国語では時折"?"が混ざりますし、韓国語とかはてんでダメでした。何かいい方法があればプルリクエストでも下さい。

ICUとかnkfでやってみようと思ったんだけどイマイチ使い勝手が良くなかったので、とりあえずStreamReaderの自動判別に任せています。(そのうち直すかも<-多分やらないフラグ)

オプション

指定出来るオプションです、基本的にあまり使う事はないかな。

Windowsはオプションを「\(バックスラッシュ)」で指定しますけど、個人的に*nix系の「-(ハイフン)」指定の方が慣れているのでそうしました。

オプション 説明
-h/--help 問い合わせサーバーを指定します -h host, -h host:port
-f/--file 設定ファイルを指定します -f ./whowins.conf
-c/--create 設定ファイルを作成します -c ./whowins.conf
-v/--verbose 「お喋りな女の子」モードを有効にします N/A
--help/--version 使い方とバージョンを表示します

設定ファイルですが、TLDとwhoisサーバーの紐づけを自分で設定出来ます。

-cで作成した物を-fで読み込みます。ファイル形式は見れば分かります。

デフォルト設定は少ししかありません、ドメインってめっちゃ種類が多くて調べるのが「しんどい」ので必要な分しか書いてません。(これも誰かがプルリクしてくれたら取り込む)

動作環境

.NET Framework 4.6.1以上が必要です。大抵の場合はWindows Updateとかで自動的に入ってます。

もし、それっぽいエラーが出て起動しない場合は、Microsoftより「.NET Framework 4.6.1」をダウンロードしてインストールしてください。

その気になればC++で書けない事もないんですけど、ソケット周りが辛いのでC#で書きました。

(Goが読み書きできるならGoで書いてたと思う、まぁそのうちやる)

ライセンス

zlibだから好きにしろ

技術的な

技術的って言うほど技術的な事をしていない。強いて言うならワンバイナリにする必要があるからちょっと苦戦した程度。

ソースコードはGitHub(HimaJyun/Whowins)で公開しています。

Whoisプロトコル

簡単です、telnetで出来るよ。

whoisサーバーのPort 43に接続して問い合わせしたいドメインを送るだけ。(改行は\r\n)

他に細かい決まりはないみたい、問い合わせには何を返しても構わないし、文字コードも決まってない。

小ネタ: clipコマンド

clipとかいうクリップボードにコピーするだけの便利なコマンドがあります。

whowinsの出力をそのままパイプでclipに食わせると少し捗ると思います。(例: whowins example.com | clip)

ただ、clipもマルチバイト文字の取り扱いが苦手みたいで……

ちなみに「--verbose」の出力にはstderrを使っているのでパイプとかした時に要らない情報が省けて便利だと思います。

 - サーバー ,