Oh!Coder

Coding Life

Whois Gem简介

| Comments

今天介绍的gem名字叫whois

简介

Whois是一个智能的,纯Ruby写成的WHOIS客户端和解析器。此gem是从RoboWhoisRoboDomain中提取出来的,于2009年七月份开始应用于生产环境。

特点

安装

1
gem install whois

开始

这里只是对whois的使用做了最基本的介绍。具体的文档中提供了更多详细的解释,包括教程和更多的实例以及关于client/server/record/parser架构的技术细节。

查询WHOIS

Whois为TLD,域名,IPv4和IPv6地址进行查询WHOIS信息的能力。根据输入的查询信息,client可以非常聪明的猜出最匹配的WHOIS服务信息,发送相应的请求并返回响应。

例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Domain WHOIS
w = Whois::Client.new
w.lookup("google.com")
# => #<Whois::Record>

# TLD WHOIS
w = Whois::Client.new
w.lookup(".com")
# => #<Whois::Record>

# IPv4 WHOIS
w = Whois::Client.new
w.lookup("74.125.67.100")
# => #<Whois::Record>

# IPv6 WHOIS
w = Whois::Client.new
w.lookup("2001:db8::1428:57ab")
# => #<Whois::Record>

查询方法是无状态的。因此可以放心的对同一个client实例做多次查询。

1
2
3
4
5
6
w = Whois::Client.new
w.lookup("google.com")
w.lookup(".com")
w.lookup("74.125.67.100")
w.lookup("2001:db8::1428:57ab")
w.lookup("google.it")

如果你不是非常在乎具体的查询结果,只是想一股脑的获取所有响应,Whois模块提供了一个统一的方法Whois.whois。最简单的方法是发送一个WHOIS请求。

1
2
Whois.whois("google.com")
# => #<Whois::Record>

除此之外,你还可以通过block的方式进行查询。

1
2
3
4
5
6
7
Whois::Client.new do |w|
  w.lookup("google.com")
  w.lookup(".com")
  w.lookup("74.125.67.100")
  w.lookup("2001:db8::1428:57ab")
  w.lookup("google.it")
end
利用查询结果

任何WHOIS查询都会返回一个Whois::Record对象。这个对象类似一个String,但不止于此。

Whois::Record封装了一个WHOIS记录,并提供能够通过对象的syntax,以类似编程的方式解析WHOIS的能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
r = Whois.whois("google.it")
# => #<Whois::Record>

r.available?
# => false
r.registered?
# => true

r.created_on
# => Fri Dec 10 00:00:00 +0100 1999

t = r.technical_contact
# => #<Whois::Record::Contact>
t.id
# => "TS7016-ITNIC"
t.name
# => "Technical Services"

r.nameservers.each do |nameserver|
  puts nameserver
end

此特性是通过Whois记录解析器来实现的。不幸的是,由于缺少一个全球性的标准,每一个WHOIS服务都需要一个特定的解析器。由于这个原因的存在,当前对所有已存在的WHOIS服务都不支持。

如果你创建了一个新解析器,希望能够考虑开放出来,或许会在下一个版本发布的时候包含进去。

超时

默认情况下,每一次查询的超时定为5秒。如果查询执行的时间超过了此限制,client将会触发Timeout::Error异常。

当然了,你可以自定义一个默认的超时时间。如果超时时间设定为nil,那么client将会一直等待server的响应或者直到你杀死此进程。除非你真的想这么做,否则不要关闭timeout!

1
2
3
4
5
6
w = Whois::Client.new(:timeout => 10)
w.timeout # => 10
w.timeout = 5
w.timeout # => 5

w.lookup("google.com")

更多

基本的使用介绍就是这些,更多更新的相关信息可以参见文档或者Github上的介绍内容

Comments