しょんぼり技術メモ

まいにちがしょんぼり

RubyでWHOIS情報を参照する

Rubyを使ったスクリプトの中で、WHOIS情報を参照したいことがあったので調べてみたところ、Whoisというgemがあるらしい。すばらしい。

gem install whois

でOK。

リファレンス等はhttp://www.ruby-whois.org/api/を参考に。

単純に問い合わせたい

Whois.whoisを呼べば結果が帰ってくる。

$ 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などが「その瞬間」になっていたのはやはりバグだったのでパッチを書いて投稿しました。今は直っています。