システムの監視などで、WEBサービスの死活監視(外形監視)の際にSSL証明書なども一緒に監視する事はあるのだけど、ついででドメインの更新期日なども一緒に確認したいことがある。 だが、ドメイン情報を取得する際に使用するwhoisはドメインの種類によってフォーマットが全く違う(項目名すら違う)ため、汎用的に情報を取得することができない。 ドメイン期限とか、.jpだと項目すら無い。 whoisの次世代プロトコル「RDAP」というものも出てきてるようだけど、2017年11月時点ではまだ実用フェーズまではきてないようなので、この時点では利用できない。

で、なんかいい方法ないかなーと調べてみたところ、pywhoisというライブラリを見かけたので試してみることにする。 以下のようにpipでインストールができる。

pip install python-whois

インストール後は、以下のように記述することでwhoisの情報を取得できる。

import whois
print whois.whois('ドメイン名')

[root@BS-PUB-CENT7-02 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import whois
>>> print whois.whois('orebibou.com')
{
  "updated_date": [
    "2016-04-29 02:04:19",
    "2016-04-29 02:04:20"
  ],
  "status": [
    "clientTransferProhibited https://icann.org/epp#clientTransferProhibited",
    "clientTransferProhibited - https://www.icann.org/epp#clientTransferProhibited"
  ],
  "name": "Xserver XSERVER Inc.",
  "dnssec": [
    "unsigned",
    "Unsigned"
  ],
  "city": "Osaka",
  "expiration_date": "2019-04-27 07:05:10",
  "zipcode": "5300011",
  "domain_name": [
    "OREBIBOU.COM",
    "orebibou.com"
  ],
  "country": "JP",
  "whois_server": "whois.star-domain.jp",
  "state": "Osaka",
  "registrar": "Netowl, Inc.",
  "referral_url": null,
  "address": [
    "GRAND FRONT OSAKA TOWER A 13F",
    "4-20 Ofukacho, Kita-ku"
  ],
  "name_servers": [
    "NS1.XSERVER.JP",
    "NS2.XSERVER.JP",
    "NS3.XSERVER.JP",
    "NS4.XSERVER.JP",
    "NS5.XSERVER.JP",
    "ns1.xserver.jp",
    "ns2.xserver.jp",
    "ns3.xserver.jp",
    "ns4.xserver.jp",
    "ns5.xserver.jp"
  ],
  "org": "XSERVER Inc.",
  "creation_date": "2014-04-27 07:05:10",
  "emails": [
    "registrar-abuse@netowl.jp",
    "info@xserver.co.jp"
  ]
}

ロケールの問題からか、日本語の設定だと.jpドメインのwhoisは取得できないようだ。 「expiration_date」で期限切れの日も確認できるので、なんとか監視できるかもしれない。 ソースを見てどうやってパースしているのか見てみると、かなり苦労したのが見受けられる(´・ω・`)。

早いところRDAPが実用化されればこの苦労もなくなるのだろうけど、もうちょっと先なのかな。