0712-2888027 189-8648-0214
微信公众号

孝感风信网络科技有限公司微信公众号

当前位置: 主页 > 技术支持 > PHP > 用php实现域名whois信息查询

用php实现域名whois信息查询

时间:2016-01-28来源:风信网 点击:
网上有很多种 whois查询 的php实现,大致实现的思路无不例外以下几种:

1.通过http调用 xinnet或者是万网的 whois查询接口查询,而后将结果输出到页面,这种最简单的,通过间接调用新网 whois查询接口的实现方法

php whois查询API制作

网站们经常需要查询网站whois信息,这里介绍一个使用php制作的whois api接口,方法也很简单,下面详细介绍一下。

这里我们从万网或新网的数据接口取得数据,透过php的简单文本处理再输出。

<?php  
$domain = $_GET['q'];
 
preg_match("/<div class=\"lyTableInfoWrap\">(.*)<\/div>\r\n      <\/div><!-- #BeginLibraryItem/is", @file_get_contents('http://www.xinnet.cn/Modules/agent/serv/pages/domain_whois.jsp?domainNameWhois='.$domain.'&noCode=noCode'), $whois);
 
echo trim($whois[1]);
?>
做到这里,可能有的朋友要问了,这不就是简单的php脚本么?!哪是api接口阿;接着我们来加工一下,让查询方式更专业一些:
我们需要的查询格式如下:

http://api/whois/baidu.com

其中baidu.com是需要查询的域名

可以修改nginx的配置来实现这一点:

location ~* /whois/(.+)$ {  
    proxy_pass http://127.0.0.1:8080/whois/index.php?q=baidu.com
}

2.直接通过读取 whois服务器,实现域名的查询。

PHP版域名whois信息(过期时间)查询工具

很多whois服务器已经停止工作了;

很多whois协议格式是不一样的;

因为要写域名过期自动提醒工具,重新更新了代码在附件里,含提取过期时间的正则。目前支持22种后缀的域名。

=============================

修改自网上流传的版本,并作了修正:

增加了两百多种域名的支持;

修正了过期时间解析错误的BUG,改进了效率;

预期推出域名过期自动提醒服务。不过也要看心情和动力的。

PHP代码如下:
<?php   
if(!isset($_GET['domain'])){   
    echo "1.您未指定要查询的域名!<br />";   
    echo "2.接口使用方法:/whois.php?domain=<FONT color=#ff0000>域名</FONT><br />";   
    echo "3.<FONT color=#ff0000>域名</FONT>请勿加<FONT color=#ff0000>www.</FONT><br />";   
    exit;   
}   
$domain  = $_GET['domain'];   
class SearchDomain   
{   
    private $arr_whois_servers = array(   
        'com'=>'whois.internic.net',   
        'net'=>'whois.internic.net',   
        'org'=>'whois.pir.org',   
        'asia'=>'whois.crsnic.net',   
        'ac'=>'whois.nic.uk',   
        'ad'=>'whois.nic.ad',   
        'ae'=>'whois.uaenic.ae',   
        'ag'=>'whois.nic.ag',   
        'ai'=>'whois.offshore.com.ai',   
        'al'=>'whois.inima.al',   
        'an'=>'whois.una.net',   
        'ao'=>'whois.fccn.pt',   
        'aq'=>'whois.nsrc.org',   
        'ar'=>'whois.nic.ar',   
        'as'=>'whois.nic.as',   
        'am'=>'whois.amnic.net',   
        'au'=>'whois.amnic.net',   
        'at'=>'whois.amnic.net',   
        'az'=>'whois.domain.az',   
        'ba'=>'whois.utic.net.ba',   
        'bb'=>'whois.domains.org.bb',   
        'be'=>'whois.dns.be',   
        'bf'=>'whois.onatel.bf',   
        'bg'=>'whois.digsys.bg',   
        'bh'=>'whois.batelco.com.bh',   
        'bi'=>'whois.nic.bi',   
        'biz'=>'whois.nic.biz',   
        'bm'=>'whois.bermudanic.bm',   
        'bn'=>'whois.brunet.bn',   
        'bo'=>'whois.digsys.bo',   
        'by'=>'whois.unibel.by',   
        'bz'=>'whois.belizenic.bz',   
        'br'=>'whois.registro.fapesp.br',   
        'bt'=>'whois.nic.bt',   
        'bv'=>'whois.norid.no',   
        'ca'=>'whois.cira.ca',   
        'cc'=>'whois.nic.cc',   
        'cd'=>'whois.nic.cd',   
        'cf'=>'whois.socatel.intnet.cf',   
        'cg'=>'whois.nic.cg',   
        'ch'=>'whois.nic.ch',   
        'ci'=>'whois.aipdi.ci',   
        'ck'=>'whois.oyster.net.ck',   
        'cl'=>'whois.nic.cl',   
        'cm'=>'whois.info.intelcam.cm',   
        'cn'=>'whois.cnnic.net.cn',   
        'co'=>'whois.nic.uniandes.edu.co',   
        'coop'=>'whois.nic.coop',   
        'cu'=>'whois.nic.cu',   
        'cx'=>'whois.nic.cx',   
        'cy'=>'whois.nic.cy',   
        'cz'=>'whois.nic.cz',   
        'de'=>'whois.denic.de',   
        'dk'=>'whois.dk-hostmaster.dk',   
        'dj'=>'whois.intnet.dj',   
        'do'=>'whois.nic.do',   
        'dz'=>'whois.nic.dz',   
        'ec'=>'whois.nic.ec',   
        'edu'=>'whois.educause.net',   
        'ee'=>'whois.eenet.ee',   
        'eg'=>'whois.frcu.eun.eg',   
        'es'=>'whois.nic.es',   
        'et'=>'whois.telecom.net.et',   
        'fi'=>'whois.ripe.net',   
        'fj'=>'whois.usp.ac.fj',   
        'fk'=>'whois.fidc.org.fk',   
        'fm'=>'whois.dot.fm',   
        'fo'=>'whois.nic.fo',   
        'fr'=>'whois.nic.fr',   
        'gb'=>'whois.nic.uk',   
        'ge'=>'whois.nic.net.ge',   
        'gf'=>'whois.nplus.gf',   
        'gg'=>'whois.nic.gg',   
        'gh'=>'whois.ghana.com',   
        'gi'=>'whois.gibnet.gi',   
        'gl'=>'whois.nic.gl',   
        'gm'=>'whois.nic.gm',   
        'gn'=>'whois.psg.com',   
        'gov'=>'whois.nic.gov',   
        'gp'=>'whois.nic.gp',   
        'gq'=>'whois.getesa.gq',   
        'gr'=>'whois.hostmaster.gr',   
        'gs'=>'whois.adamsnames.tc',   
        'gt'=>'whois.uvg.edu.gt',   
        'gu'=>'whois.gadao.gov.gu',   
        'hk'=>'whois.hkdnr.net.hk',   
        'hm'=>'whois.registry.hm',   
        'hn'=>'whois.nic.hn',   
        'hr'=>'whois.carnet.hr',   
        'hu'=>'whois.nic.hu',   
        'id'=>'whois.idnet.net.id',   
        'ie'=>'whois.domainregistry.ie',   
        'il'=>'whois.isoc.org.il',   
        'im'=>'whois.nic.im',   
        'in'=>'whois.domain.ncst.ernet.in',   
        'info'=>'whois.afilias.com',   
        'int'=>'whois.iana.org',   
        'io'=>'whois.nic.io',   
        'ir'=>'whois.nic.ir',   
        'is'=>'whois.isnic.is',   
        'it'=>'whois.nic.it',   
        'je'=>'whois.isles.net',   
        'jo'=>'whois.nic.net.jo',   
        'jp'=>'whois.nic.ad.jp',   
        'ke'=>'whois.nbnet.co.ke',   
        'kg'=>'whois.domain.kg',   
        'kh'=>'whois.mptc.gov.kh',   
        'kn'=>'whois.clu.edu',   
        'kr'=>'whois.nic.or.kr',   
        'kw'=>'whois.domainname.net.kw',   
        'kz'=>'whois.domain.kz',   
        'lb'=>'whois.aub.edu.lb',   
        'lc'=>'whois.isisworld.lc',   
        'li'=>'whois.nic.li',   
        'lk'=>'whois.nic.lk',   
        'lr'=>'whois.psg.com',   
        'ls'=>'whois.co.ls',   
        'lt'=>'whois.domreg.lt',   
        'lu'=>'whois.dns.lu',   
        'lv'=>'whois.nic.lv',   
        'ly'=>'whois.nic.ly',   
        'ma'=>'whois.iam.ma',   
        'mc'=>'whois.nic.mc',   
        'md'=>'whois.ripe.net',   
        'mil'=>'whois.nic.mil',   
        'mg'=>'whois.orstom.mg',   
        'mh'=>'whois.nic.net.mh',   
        'mk'=>'whois.mpt.com.mk',   
        'mm'=>'whois.nic.mm',   
        'mn'=>'whois.nic.mn',   
        'mo'=>'whois.umac.mo',   
        'mp'=>'whois.marketplace.mp',   
        'mq'=>'whois.nic.mq',   
        'mr'=>'whois.univ-mkc.mr',   
        'ms'=>'whois.adamsnames.tc',   
        'mt'=>'whois.um.edu.mt',   
        'mu'=>'whois.posix.co.za',   
        'mw'=>'whois.tarsus.net',   
        'mx'=>'whois.nic.mx',   
        'my'=>'whois.mynic.net.my',   
        'mz'=>'whois.nambu.uem.mz',   
        'na'=>'na-nic.com.na',   
        'name'=>'whois.nic.name',   
        'nc'=>'whois.norstom.nc',   
        'nf'=>'whois.names.nf',   
        'ni'=>'whois.nic.ni',   
        'nl'=>'whois.domain-registry.nl',   
        'no'=>'whois.norid.no',   
        'np'=>'whois.mos.com.np',   
        'nu'=>'whois.nic.nu',   
        'nz'=>'whois.domainz.net.nz',   
        'om'=>'whois.gto.net.om',   
        'pa'=>'whois.nic.pa',   
        'pe'=>'whois.ekeko.rcp.net.pe',   
        'ph'=>'whois.domreg.org.ph',   
        'pg'=>'whois.unitech.ac.pg',   
        'pk'=>'whois.pknic.net.pk',   
        'pl'=>'whois.nask.pl',   
        'pm'=>'whois.nic.pm',   
        'pn'=>'whois.nic.pn',   
        'pr'=>'whois.uprr.pr',   
        'ps'=>'whois.nic.ps',   
        'pt'=>'whois.fccn.pt',   
        'py'=>'whois.nic.py',   
        'qa'=>'whois.qatar.net.qa',   
        're'=>'whois.nic.fr',   
        'ro'=>'whois.rnc.ro',   
        'ru'=>'whois.ripn.net',   
        'rw'=>'whois.nic.rw',   
        'sa'=>'whois.saudinic.net.sa',   
        'sb'=>'whois.sbnic.net.sb',   
        'sd'=>'whois.sudatel.sd',   
        'se'=>'whois.nic-se.se',   
        'sg'=>'whois.nic.net.sg',   
        'sh'=>'whois.nic.sh',   
        'si'=>'whois.arnes.si',   
        'sj'=>'whois.norid.no',   
        'sk'=>'whois.sk-nic.sk',   
        'sm'=>'whois.intelcom.sm',   
        'sn'=>'whois.nic.sn',   
        'so'=>'whois.nic.so',   
        'st'=>'whois.st-registry.tecnisys.net',   
        'su'=>'whois.ripn.net',   
        'sv'=>'whois.svnet.org.sv',   
        'sz'=>'whois.iafrica.sz',   
        'tc'=>'whois.adamsnames.tc',   
        'td'=>'whois.tit.td',   
        'tf'=>'whois.adamsnames.tc',   
        'tg'=>'whois.nic.tg',   
        'th'=>'whois.thnic.net',   
        'tj'=>'whois.nic.tj',   
        'tm'=>'whois.nic.tm',   
        'tn'=>'whois.ati.tn',   
        'to'=>'whois.tonic.to',   
        'tp'=>'whois.nic.tp',   
        'tr'=>'whois.metu.edu.tr',   
        'tt'=>'whois.nic.tt',   
        'tw'=>'whois.twnic.net',   
        'tz'=>'whois.psg.com',   
        'tv'=>'whois.networksolutions.com',   
        'ua'=>'nic.net.ua',   
        'ug'=>'whois.nic.ug',   
        'uk'=>'whois.nic.uk',   
        'uk'=>'whois.ripe.net',   
        'um'=>'whois.isi.edu',   
        'us'=>'whois.nic.us',   
        'uy'=>'whois.rau.edu.uy',   
        'uz'=>'whois.freenet.uz',   
        've'=>'whois.nic.ve',   
        'wf'=>'whois.nic.fr',   
        'vg'=>'whois.adamsnames.tc',   
        'vi'=>'whois.nic.vi',   
        'vn'=>'whois.batin.com.vn',   
        'vu'=>'whois.vunic.vu',   
        'ws'=>'samoanic.ws',   
        'yt'=>'whois.nic.fr',   
        'yu'=>'whois.nic.yu',   
        'za'=>'whois.co.za',   
        'zm'=>'whois.zamnet.zm',   
 
    );   
    public $domain="";   
    function SetDomain($udomain)   
    {   
        $this->domain = $udomain;   
    }   
 
    function GetInfo()   
    {   
        $wl = "";   
        $w_server = $this->GetServer();   
        if($w_server=="") return "";   
            $fp = fsockopen($w_server, 43, $errno, $errstr, 30);   
        if(!$fp) {   
            echo $errstr;   
            return "";   
        }   
        $out = $this->domain."";   
        fputs($fp, $out);   
        while (!feof($fp))   
        {   
            $wl = fgets($fp, 255);   
            if(preg_match("/no match/",$wl))   
            {   
                fclose($fp);   
                return "ok";   
            }   
            if(preg_match("/Expiration Date/",$wl))   
            {   
                $lines = explode(":",$wl);   
                $t = trim($lines[1]);   
                $ts = explode(" ",$t);   
                $t = $ts[0];   
                if(preg_match("/[^0-9-]/",$t))   
                {   
            return date("Y-m-d",strtotime($t));   
                }   
                fclose($fp);   
        return '';   
            }   
        }   
        fclose($fp);   
        return "";   
    }   
    //   
    //获得域名的整个whois信息   
    //   
    function GetWhois()   
    {   
        $wh = "";   
        $w_server = $this->GetServer();   
        if($w_server=="") return "";   
        $fp = fsockopen($w_server, 43, $errno, $errstr, 30);   
        if(!$fp)   
        {   
            echo $errstr;   
            return "";   
        }   
        $out = $this->domain."";   
        $out .= "Connection: Close";   
        fputs($fp, $out);   
        while (!feof($fp))   
        {   
            $wh .= nl2br(fgets($fp, 255));   
        }   
        fclose($fp);   
        return $wh;   
    }   
    //   
    //输出当前域名的状态信息   
    //   
    function PrintSta()   
    {   
        $rs = $this->GetInfo();   
        if($rs=="ok") echo $this->domain." 未注册!<br/>";   
        else if($rs=="") echo "无法查询 ".$this->domain." 状态!<br/>";   
        else echo $this->domain." 已注册,到期时间:$rs<br/>";   
    }   
    //   
    //获得 whois 查询服务器   
    //   
    function GetServer()   
    {   
        $udomain=strtolower(substr(strrchr($this->domain,'.'),1));   
        return array_key_exists($udomain,$this->arr_whois_servers) ? $this->arr_whois_servers[$udomain] : '';   
    }   
    //   
    //英语的月份转为数字   
    //   
    function MonthToNum($m)   
    {   
        echo $m;   
        $m = strtolower($m);   
        for($i=1;$i<=12;$i++)   
        {   
            $tt = mktime(0,0,0,$i+1,0,2005);   
            if($m==strtolower(strftime("%b",$tt)))   
            {   
                if($i>9) return $i-1;   
                else return "0".$i-1;   
            }   
        }   
    }   
}   
 
$sd = new SearchDomain();   
$sd->SetDomain("$domain");   
//查询域名是否被注册,等价于 $sd->PrintSta();   
$rs = $sd->GetInfo();   
if($rs=="ok") echo $sd->domain." 未注册!<br/>";   
else if($rs=="") echo "无法查询 ".$sd->domain." 状态!<br/>";   
else echo $sd->domain." 已注册,到期时间:$rs<br/>";   
//获得域名的详细whois信息   
//echo $sd->GetWhois();   
 
?>
请注意:经进一步使用发现上面的whois server返回的并不是统一格式的信息,并且部分whois server无响应。部分小后缀域名是无法查询的,还需要进一步处理。(举例,.kr返回韩文数据,.fr,.de返回某种协议的格式,而.ru返回了另一种格式的协议,说明页面是俄文的。)

对应的 域名后缀 -> whois 服务器 的映射关系大致如下:
    1. 'com'=>'whois.internic.net',   
    2. 'net'=>'whois.internic.net',   
    3. 'org'=>'whois.pir.org',   
    4. 'asia'=>'whois.crsnic.net'
    5. 'cn'=>'whois.cnnic.net.cn',   
    6. 'cc'=>'whois.nic.cc',   

        对于这种方法,虽然实现起来很简单,但是对于在Godaddy.com平台或者是国内的厦门易名网注册的 域名来说,只能查到一个大概,而无法查到具体真正的 domain 的信息,如下:

<?php
include('whois_inc/whois.main.php');
$whois =newWhois();
$result = $whois->Lookup($domain);
$output = implode("\n", $result['rawdata']);
echo $output;?>

在godday注册的域名的whois信息

DomainName: lxfq.cn
ROID:20130114s10001s62921725-cn
DomainStatus: ok
Registrant ID:000046dbRegistrant:黎军RegistrantContactEmail:2673732891@qq.com
SponsoringRegistrar:北京网尊科技有限公司NameServer: ns1.vtopchina.cn
NameServer: ns2.vtopchina.cn
RegistrationDate:2013-01-1404:02:16ExpirationDate:2014-01-1404:02:16
DNSSEC:unsigned

在厦门易名网注册的域名的whois信息

        所以,无论上面两种方法,都不能比较完善的实现 whois 的查询功能。

        这时候 Jay感觉到,仅仅是 whois 这件小事,也需要用牛刀,我们需要一个完善 whois查询组件。

        此时的 Jay立刻打开 google.com,搜索 php whois,果不其然!

        在 百度中,搜了半天,出来的都是一些外门奇方,google一搜,就立马出现一套完整的 whois client 的 php 实现,项目名称就叫《phpWhois》,项目主页:http://www.phpwhois.org/ ,于是立马 download 下来,根据文档中的 demo,很快就把 whois 的查询功能实现了。

        下面是调用 phpWhois 组件,实现 whois信息查询的核心代码部分:

<?php
include('whois_inc/whois.main.php');
$whois =new Whois();
$result = $whois->Lookup($domain);
$output = implode("\n", $result['rawdata']);
echo $output;
?>

        在这里<pre></pre>标签的作用是定义预格式化的文本,就是将 whois 查询到的 raw text 按原来的文本排版格式直接输出。

DomainName: lxfq.cn
ROID:20130114s10001s62921725-cn
DomainStatus: ok
Registrant ID:000046dbRegistrant:黎军RegistrantContactEmail:2673732891@qq.com
SponsoringRegistrar:北京网尊科技有限公司NameServer: ns1.vtopchina.cn
NameServer: ns2.vtopchina.cn
RegistrationDate:2013-01-1404:02:16ExpirationDate:2014-01-1404:02:16
DNSSEC:unsigned

总结:

        whois虽然仅仅只是一种最简单的基于 tcp 的查询协议,但是很多工作,即便我们实现起来也非常简单,如果有现成的 php组件可以用的话,就应该尽量避免自己重复发明一个轮子。倒不是说不可以,只是重新实现一种协议,即便是最简单的那种,也会遇到很多的例外。

        就像 phpWhois 组件,争对godaddy类似这种的例外情况,就处理的非常好。

        所以,专业的事情,还是让专业的开源组件去实现吧!

热门关键词:PHP域名whois信息查询
栏目列表
推荐内容
热点内容
展开