Ruby Whois解析工具无法获取.dev/.co域名部分信息的解决方案咨询
解决方案
一、先搞清楚.co域名的问题出在哪
- 先跑这段代码手动获取.co域名的whois原始响应,确认过期日期字段到底有没有:
看输出里有没有client = Whois::Client.new response = client.lookup("example.co") puts response.to_sRegistry Expiry Date、Expiration Date这类字段。如果原始响应里有,但解析器没提取到,就是解析器规则没覆盖;如果原始响应里也没有,要么是whois服务器返回的信息不全,要么得换个whois服务器试试(比如.co的官方whois服务器是whois.nic.co)。 - 查一下whois-parser的源码,看看有没有.co的解析器。去gem的
lib/whois/parser/parsers目录下,找有没有whois_nic_co.rb这类文件。没有的话就得自己写;有的话可能是规则过时了,得更新正则或者字段映射。
二、自己写/更新解析器的步骤
1. 新建解析器文件
在你的项目里建个自定义解析器文件(或者fork whois-parser gem改),比如lib/whois/parser/parsers/whois_nic_co.rb,基础结构大概是这样:
module Whois class Parser class WhoisNicCo < Base property_supported :expires_on do if content_for_scanner =~ /Registry Expiry Date:\s+([\d\-T:Z]+)/ Time.parse(Regexp.last_match(1)) end end # 其他需要的属性,比如创建时间、更新时间,照着这个格式加 property_supported :created_on do if content_for_scanner =~ /Creation Date:\s+([\d\-T:Z]+)/ Time.parse(Regexp.last_match(1)) end end end end end
2. 注册解析器
得让whois-parser知道这个解析器对应哪个whois服务器,在初始化代码里加一行:
Whois::Parser.register_parser(:whois_nic_co, Whois::Parser::WhoisNicCo)
或者直接在whois-parser gem的lib/whois/parser.rb里的服务器映射里加对应关系。
3. 测试解析器
写段代码验证一下:
client = Whois::Client.new response = client.lookup("example.co") parser = Whois::Parser.new(response) puts parser.expires_on # 正常应该输出日期,不是nil
三、解决.dev域名的AttributeNotImplemented错误
这个错误就是因为whois-parser没给.dev域名做解析器,所以识别不了属性。你可以照着.co的步骤来:
- 先获取.dev域名的whois原始响应,搞清楚字段格式;
- 新建对应的解析器文件,实现你需要的属性(比如过期时间、域名状态);
- 把解析器注册到.dev的whois服务器(
whois.nic.dev)。
四、新手写解析器的小提示
- 先参考已有的解析器代码,比如
whois_com.rb、whois_net.rb的结构,照猫画虎就行; - 正则表达式要匹配whois响应里的实际格式,注意空格、大小写、日期格式(比如ISO8601那种带T和Z的);
- 如果是fork了whois-parser改的,测试没问题可以给官方提PR,帮到其他用户;
- 不想改gem源码的话,就在自己项目里加载自定义解析器,覆盖默认逻辑就行。
内容的提问来源于stack exchange,提问作者Wasswa Samuel
相关产品推荐
相关产品推荐

