RubyでWHOIS情報を参照する
Rubyを使ったスクリプトの中で、WHOIS情報を参照したいことがあったので調べてみたところ、Whoisというgemがあるらしい。すばらしい。
gem install whois
でOK。
リファレンス等はhttp://www.ruby-whois.org/api/を参考に。
単純に問い合わせたい
$ irb > require 'rubygems' > require 'whois' > require 'pp' > ans = Whois.whois("example.com") > ans.domain => "example.com" > ans.status => :registered > ans.created_on => Wed Jan 01 00:00:00 +0900 1992 > ans.created_on.class => Time
タイムアウトを指定
Whoisクライアントインスタンスを生成してからqueryすればOK。
client = Whois::Client.new(:timeout => 10) ans = client.query("example.com")
ドメインの作成、更新、失効年月日を表示するサンプルスクリプト
こんな感じで。
#!/bin/env ruby require 'date' require 'rubygems' require 'whois' # monkey patch for Time class class Time def to_diff_from_today today = Time.now days = ((self - today) / (24*60*60)).to_i return days end def to_remaining_str days = self.to_diff_from_today if days >= 0 str = "#{days} days after" else str = "#{-days} days ago" end return str end end file = ARGV[0] || "domain_list.txt" client = Whois::Client.new(:timeout => 5) File.read(file).each_line do |domain| domain.chop! next if domain.empty? ans = client.query(domain) puts "*** #{domain}" if ans.created_on.nil? puts "***** not registered or cannot get the created_on field." else created_on = "#{ans.created_on} (#{ans.created_on.to_remaining_str})" updated_on = (ans.updated_on.nil?) ? "N/A" : "#{ans.updated_on} (#{ans.updated_on.to_remaining_str})" expires_on = (ans.expires_on.nil?) ? "N/A" : "#{ans.expires_on} (#{ans.expires_on.to_remaining_str})" registrar = (ans.registrar.nil?) ? "N/A" : ans.registrar.name puts "created_on: #{created_on}" puts "updated_on: #{updated_on}" puts "expires_on: #{expires_on}" puts "registrar: #{registrar}" end puts end
次のようなリストを作って実行してみると:
example.com example.jp yahoo.com yahoo.co.jp google.com google.co.jp hatena.ne.jp jprs.jp kantei.go.jp tsukuba.ac.jp u-tokyo.ac.jp no-such-domain.example.com no-such-domain.example.jp
結果はこんな感じ。どうもJPドメインのcreated_onやらexpires_onがうまくパースできていないようだ。バグ?
$ ruby ./domain_expire_check.rb domain_list.txt *** example.com created_on: Wed Jan 01 00:00:00 +0900 1992 (6896 days ago) updated_on: N/A expires_on: Sat Aug 13 00:00:00 +0900 2011 (267 days after) registrar: RESERVED-INTERNET ASSIGNED NUMBERS AUTHORITY *** example.jp created_on: Thu Nov 18 16:25:54 +0900 2010 (0 days after) updated_on: Wed Feb 21 00:00:00 +0900 2001 (3557 days ago) expires_on: Thu Nov 18 16:25:54 +0900 2010 (0 days after) registrar: N/A *** yahoo.com created_on: Wed Jan 18 00:00:00 +0900 1995 (5783 days ago) updated_on: Wed Sep 15 00:00:00 +0900 2010 (64 days ago) expires_on: Thu Jan 19 00:00:00 +0900 2012 (426 days after) registrar: MARKMONITOR INC. *** yahoo.co.jp created_on: Fri Nov 17 00:00:00 +0900 2000 (3653 days ago) updated_on: Fri Aug 27 10:30:25 +0900 2010 (83 days ago) expires_on: N/A registrar: N/A *** google.com created_on: Mon Sep 15 00:00:00 +0900 1997 (4812 days ago) updated_on: Wed Sep 15 00:00:00 +0900 2010 (64 days ago) expires_on: Wed Sep 14 00:00:00 +0900 2011 (299 days after) registrar: MARKMONITOR INC. *** google.co.jp created_on: Thu Mar 22 00:00:00 +0900 2001 (3528 days ago) updated_on: Thu Apr 01 01:21:27 +0900 2010 (231 days ago) expires_on: N/A registrar: N/A *** hatena.ne.jp created_on: Thu Feb 22 00:00:00 +0900 2001 (3556 days ago) updated_on: Mon Mar 01 01:24:24 +0900 2010 (262 days ago) expires_on: N/A registrar: N/A *** jprs.jp created_on: Fri Feb 02 00:00:00 +0900 2001 (3576 days ago) updated_on: Wed Aug 18 17:55:23 +0900 2010 (91 days ago) expires_on: Mon Feb 28 00:00:00 +0900 2011 (101 days after) registrar: N/A *** kantei.go.jp created_on: Fri Jun 24 00:00:00 +0900 1994 (5991 days ago) updated_on: Thu Jul 01 01:19:51 +0900 2010 (140 days ago) expires_on: N/A registrar: N/A *** tsukuba.ac.jp created_on: Thu Nov 18 16:25:56 +0900 2010 (0 days after) updated_on: Thu Apr 01 01:26:37 +0900 2010 (231 days ago) expires_on: N/A registrar: N/A *** u-tokyo.ac.jp created_on: Thu Nov 18 16:25:56 +0900 2010 (0 days after) updated_on: Wed Apr 07 19:11:05 +0900 2010 (224 days ago) expires_on: N/A registrar: N/A *** no-such-domain.example.com ***** not registered or cannot get the created_on field. *** no-such-domain.example.jp ***** not registered or cannot get the created_on field.
追記
JPドメインのcreated_onなどが「その瞬間」になっていたのはやはりバグだったのでパッチを書いて投稿しました。今は直っています。