Whois API接口及实现原理
1. 简介
定义了一个非常简单的信息查询协议——WHOIS协议,它的基本内容是首先与服务器的TCP 43端口建立连接,以回车换行的方式发送查询关键字,然后接收服务器返回的查询结果。
秉承公开、公平、共享的原则,全球各级管理机构均建立了可查询IP地址及域名所有者注册信息的WHOIS服务器,方便所有用户排查和打击网络违法行为。全球共有四个国际区域性IP地址管理机构:ARIN、RIPE、APNIC,其负责的IP地址地理区域如下图所示。
四大国际区域IP地址管理机构管辖区域
(此图取自RIPE 2002年年度报告)
重要管理机构及常用WHOIS服务器
组织缩写
WHOIS 服务器地址
机构全名和所在地
提供查询内容
中国教育科研计算机网络信息中心
(清华大学,北京,中国)
中国教育网IP地址及域名信息
中国互联网络信息中心
中国互联网络信息中心
(中国科学院计算机网络信息中心,北京)
.cn 域名(.除外)信息
互联网信息中心
(美国洛杉矶德雷镇)
.com、.net、.org、.biz、.info、.name
域名注册信息(仅提供注册代理公司)
艾林
美国号码注册处
(美国弗吉尼亚州)
早期全球互联网以及当前美国、加拿大和撒哈拉以南非洲的 IP 地址信息
亚太互联网络信息中心
亚洲及太平洋网络信息中心
(澳大利亚昆士兰州米尔顿)
东亚(含中国大陆及台湾)、南亚、大洋洲IP地址注册信息
成熟
欧洲 IP 地址注册中心(荷兰阿姆斯特丹)
欧洲、北非和西亚的 IP 地址信息
台湾网路信息中心
台湾互联网资讯中心(中国台湾台北)
.tw 域名及台湾部分IP地址信息
日本网络信息中心
匿名用户
日本互联网信息中心(日本东京)
日本的 .jp 域名和 IP 地址信息
韩国核信息中心
韩国互联网信息中心(韩国首尔)
韩国.kr域名及IP地址信息
拉丁美洲和加勒比互联网信息中心(巴西圣保罗)
拉丁美洲和加勒比地区 IP 地址信息
本机上的自动WHOIS服务遵循下图所示的流程,依次向多个WHOIS服务器进行查询,从而获得某个IP地址的WHOIS信息。
当我们要建网站的时候,必须向域名注册机构申请域名,因此我们通常想知道自己要用的域名是否已经被注册过。这时候我们只要访问ICANN网站,在“Whois”输入框中输入要查询的域名,就可以得到我们需要的结果。本文就介绍如何
使用Java编程来实现这个过程。
2. 原理
原理很简单,域名的查询主要基于RFC 954提供的WHOIS协议,在上述过程中,我们实际上是访问站点的WHOIS服务器,由该服务器从WHOIS数据库中查询我们所需要的内容。
WHOIS服务器是一个基于“查询/响应”的TCP事务服务器,运行在SRI-NIC机器上(),为用户提供范围内的目录服务。本地主机上的用户程序可以通过以下三个步骤访问该服务器:
(1)通过TCP服务端口43(十进制)连接SRI-NIC服务主机;
(2)发送命令,以回车换行结束;
(3)接受相应命令的返回信息。一旦输出完成后,服务器就会关闭连接。
命令格式很简单,直接输入域名即可,例如用“ ”可以查询“搜狐”网站的域名信息;也可以用“help”获取详细的帮助信息。
简单 whois 查询的示例代码如下:
- #coding=utf-8
-
- import socket
-
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
- s.connect(('whois.internic.net', 43))
-
- s.send('sina.com.cn \r\n')
-
- while 1:
-
- v = s.recv(1024)
-
- if v == '' or v == None:
-
- break
-
- print v
-
- s.close()
-
但是上面代码中查询的内容非常糟糕,一点也不全面,因为要连接whois服务器。知道whois查询的原理就够了,在进行whois查询的时候没必要再去重新发明轮子,有相应的whois查询模块可以使用,下面简单介绍两个模块,我推荐使用第二个whois查询模块,因为第一个调用的是linux whois命令,需要在linux中安装whois工具才可以使用,而且结果不全面。
3.编程
1. Whois 模块
模块介绍地址:.其官方介绍:
对于 Linux 的“whois”
针对给定的 WHOIS 数据
能够获取所有 TLD 的数据(com、org、net、pl 等)
像许多人一样查询网站的 WHOIS
不
适用于 2.4+ 和 3.x
所有日期为
缓存
可以看出-whois模块只是Linux下whois命令的一个包装器,要使用该模块,必须先安装whois工具。
-
安装whois之后,可以方便地使用whois命令查看域名的whois信息,例如whois
可以看到,安装完 whois 工具之后,就可以很方便地使用 whois 命令来查询 whois 信息了。因此,我们查询 whois 信息的另一个死胡同就是调用 whois 命令进行查询,然后对结果进行分析处理。-whois 模块的思路就是这样,但是不知道出于什么原因,-whois 得到的 whois 信息不如 whois 命令得到的信息那么全,这也是我最终放弃 -whois 模块的原因。
-whois模块使用示例:
- >>> import whois
-
- >>> domain = whois.query('google.com')
-
- >>> print(domain.__dict__)
-
- {'expiration_date': datetime.datetime(2020, 9, 14, 0, 0), 'last_updated': datetime.datetime(2011, 7, 20, 0, 0), 'registrar': 'MARKMONITOR INC.', 'name': 'google.com', 'creation_date': datetime.datetime(1997, 9, 15, 0, 0)}
-
-
- >>> print(domain.name)
-
- google.com
-
- >>> print(domain.expiration_date)
-
- 2020-09-14 00:00:00
模块
该模块的详细介绍可以参见:该模块使用起来非常方便,而且获取的信息也很齐全,所以建议在实际使用中使用该模块。
模块介绍:
将为给定的 提供 WHOIS 数据。
能够获取所有 TLD(com、org、net 等)的数据
像许多人一样查询网站的 WHOIS。
适用于 2.4+ 版本,无需
安装命令:
-谁是
也就是通过pip就可以轻松安装,至于如何在Linux下安装pip工具,可以参考上一篇文章模块示例代码:
- >>> import whois
-
- >>> w = whois.whois('webscraping.com')
-
- >>> w.expiration_date # dates converted to datetime object
-
- datetime.datetime(2013, 6, 26, 0, 0)
-
- >>> w.text # the content downloaded from whois server
-
- u'\nWhois Server Version 2.0\n\nDomain names in the .com and .net
- ...'
-
- >>> print w # print values of all found attributes
-
- creation_date: 2004-06-26 00:00:00
-
- domain_name: [u'WEBSCRAPING.COM', u'WEBSCRAPING.COM']
-
- emails: [u'WEBSCRAPING.COM@domainsbyproxy.com', u'WEBSCRAPING.COM@domainsbyproxy.com']
-
- expiration_date: 2013-06-26 00:00:00
可以看出该模块使用起来非常方便,获取的信息也很全。不过由于它和上一个模块一样也是 whois,所以两者可能会发生冲突。在安装该模块的时候,如果之前安装过第一部分介绍的 -whois,最好先卸载,卸载命令为:sudo -m whois。
在实际使用中,可以使用 whois.whois() 函数获取某个域名的 whois 信息,获取到的比较重要的属性有,,,属性,若要获取全部内容,可以使用 text 属性
ps:不仅仅可以查询域名whois,有些网站还提供whois域名反向查询的功能(whois反向查询功能可以通过注册人或者注册人的邮箱反向查询whois信息,得到相同信息的其他域名列表。通过whois反向查询可以查到域名拥有者拥有哪些域名)。目前提供whois反向查询的网站有:
(1)查询域名交易平台:域名交易 | 固定价格域名 | 过期域名注册 | 域名出售 | 域名变更
(2)站长工具(域名反向查询工具)邮箱反向查询_邮箱Whois反向查询 - 站长工具
3.实施:
- package main
-
- import (
- "fyne.io/fyne"
- "fyne.io/fyne/app"
- "fyne.io/fyne/widget"
- "net"
- "os"
- )
-
- const server = "whois.internic.net"
-
- /**
- whois 查询
- */
- func query(domain string) (string, error) {
- conn, err := net.Dial("tcp", server+":43")
- if err != nil {
- return "", err
- }
- defer conn.Close()
-
- conn.Write([]byte(domain + "\r\n"))
-
- var buffer = make([]byte, 2048)
-
- n, err := conn.Read(buffer)
-
- if err != nil {
- return "", err
- }
-
- return string(buffer[:n]), nil
- }
-
- /**
- golang实现的whois查询小工具
- */
- func main() {
- os.Setenv("FYNE_THEME", "light")
- a := app.New()
- w := a.NewWindow("whois tools v1.0")
-
- w.Resize(fyne.NewSize(600, 350))
- w.CenterOnScreen()
- domainEntry := widget.NewEntry()
- resultEntry := widget.NewMultiLineEntry()
- queryButton := widget.NewButton("query", func() {
- result, err := query(domainEntry.Text)
- if err != nil {
- resultEntry.SetText("ERROR: " + err.Error())
- } else {
- resultEntry.SetText("")
- resultEntry.SetText(result)
- }
- })
-
- w.SetFixedSize(false)
- w.SetContent(widget.NewVBox(
- domainEntry,
- queryButton,
- resultEntry,
- ))
-
- w.ShowAndRun()
- }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。