1.通過http調(diào)用 xinnet或者是萬網(wǎng)的 whois查詢接口查詢,而后將結(jié)果輸出到頁面,這種最簡單的,通過間接調(diào)用新網(wǎng) whois查詢接口的實現(xiàn)方法
php whois查詢API制作
網(wǎng)站們經(jīng)常需要查詢網(wǎng)站whois信息,這里介紹一個使用php制作的whois api接口,方法也很簡單,下面詳細介紹一下。
這里我們從萬網(wǎng)或新網(wǎng)的數(shù)據(jù)接口取得數(shù)據(jù),透過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接口阿;接著我們來加工一下,讓查詢方式更專業(yè)一些:
我們需要的查詢格式如下:
http://api/whois/baidu.com
其中baidu.com是需要查詢的域名
可以修改nginx的配置來實現(xiàn)這一點:
location ~* /whois/(.+)$ {
proxy_pass http://127.0.0.1:8080/whois/index.php?q=baidu.com
}
2.直接通過讀取 whois服務(wù)器,實現(xiàn)域名的查詢。
PHP版域名whois信息(過期時間)查詢工具
很多whois服務(wù)器已經(jīng)停止工作了;
很多whois協(xié)議格式是不一樣的;
因為要寫域名過期自動提醒工具,重新更新了代碼在附件里,含提取過期時間的正則。目前支持22種后綴的域名。
=============================
修改自網(wǎng)上流傳的版本,并作了修正:
增加了兩百多種域名的支持;
修正了過期時間解析錯誤的BUG,改進了效率;
預(yù)期推出域名過期自動提醒服務(wù)。不過也要看心情和動力的。
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; } // //輸出當(dāng)前域名的狀態(tài)信息 // function PrintSta() { $rs = $this->GetInfo(); if($rs=="ok") echo $this->domain." 未注冊!<br/>"; else if($rs=="") echo "無法查詢 ".$this->domain." 狀態(tài)!<br/>"; else echo $this->domain." 已注冊,到期時間:$rs<br/>"; } // //獲得 whois 查詢服務(wù)器 // function GetServer() { $udomain=strtolower(substr(strrchr($this->domain,'.'),1)); return array_key_exists($udomain,$this->arr_whois_servers) ? $this->arr_whois_servers[$udomain] : ''; } // //英語的月份轉(zhuǎn)為數(shù)字 // 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." 狀態(tài)!<br/>"; else echo $sd->domain." 已注冊,到期時間:$rs<br/>"; //獲得域名的詳細whois信息 //echo $sd->GetWhois(); ?>請注意:經(jīng)進一步使用發(fā)現(xiàn)上面的whois server返回的并不是統(tǒng)一格式的信息,并且部分whois server無響應(yīng)。部分小后綴域名是無法查詢的,還需要進一步處理。(舉例,.kr返回韓文數(shù)據(jù),.fr,.de返回某種協(xié)議的格式,而.ru返回了另一種格式的協(xié)議,說明頁面是俄文的。)
對應(yīng)的 域名后綴 -> whois 服務(wù)器 的映射關(guān)系大致如下:
-
- 'com'=>'whois.internic.net',
- 'net'=>'whois.internic.net',
- 'org'=>'whois.pir.org',
- 'asia'=>'whois.crsnic.net',
- 'cn'=>'whois.cnnic.net.cn',
- 'cc'=>'whois.nic.cc',
對于這種方法,雖然實現(xiàn)起來很簡單,但是對于在Godaddy.com平臺或者是國內(nèi)的廈門易名網(wǎng)注冊的 域名來說,只能查到一個大概,而無法查到具體真正的 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:北京網(wǎng)尊科技有限公司NameServer: ns1.vtopchina.cn NameServer: ns2.vtopchina.cn RegistrationDate:2013-01-1404:02:16ExpirationDate:2014-01-1404:02:16 DNSSEC:unsigned在廈門易名網(wǎng)注冊的域名的whois信息
所以,無論上面兩種方法,都不能比較完善的實現(xiàn) whois 的查詢功能。
這時候 Jay感覺到,僅僅是 whois 這件小事,也需要用牛刀,我們需要一個完善 whois查詢組件。
此時的 Jay立刻打開 google.com,搜索 php whois,果不其然!
在 百度中,搜了半天,出來的都是一些外門奇方,google一搜,就立馬出現(xiàn)一套完整的 whois client 的 php 實現(xiàn),項目名稱就叫《phpWhois》,項目主頁:http://www.phpwhois.org/ ,于是立馬 download 下來,根據(jù)文檔中的 demo,很快就把 whois 的查詢功能實現(xiàn)了。
下面是調(diào)用 phpWhois 組件,實現(xiàn) whois信息查詢的核心代碼部分:
<?php include('whois_inc/whois.main.php'); $whois =new Whois(); $result = $whois->Lookup($domain); $output = implode("\n", $result['rawdata']); echo $output; ?>
在這里<pre></pre>標(biāo)簽的作用是定義預(yù)格式化的文本,就是將 whois 查詢到的 raw text 按原來的文本排版格式直接輸出。
DomainName: lxfq.cn ROID:20130114s10001s62921725-cn DomainStatus: ok Registrant ID:000046dbRegistrant:黎軍RegistrantContactEmail:2673732891@qq.com SponsoringRegistrar:北京網(wǎng)尊科技有限公司NameServer: ns1.vtopchina.cn NameServer: ns2.vtopchina.cn RegistrationDate:2013-01-1404:02:16ExpirationDate:2014-01-1404:02:16 DNSSEC:unsigned
總結(jié):
whois雖然僅僅只是一種最簡單的基于 tcp 的查詢協(xié)議,但是很多工作,即便我們實現(xiàn)起來也非常簡單,如果有現(xiàn)成的 php組件可以用的話,就應(yīng)該盡量避免自己重復(fù)發(fā)明一個輪子。倒不是說不可以,只是重新實現(xiàn)一種協(xié)議,即便是最簡單的那種,也會遇到很多的例外。
就像 phpWhois 組件,爭對godaddy類似這種的例外情況,就處理的非常好。
所以,專業(yè)的事情,還是讓專業(yè)的開源組件去實現(xiàn)吧!