Reputation: 161
I'm looping through rows in my database to get information from whois results.
Here's what I have right now:
function GetEmailFromWhois($domain){
$whois = new Whois();
$query = $domain;
$whois->deep_whois=TRUE;
$result = $whois->Lookup($query, false);
$raw_data = $result["rawdata"];
$email = "";
foreach($raw_data as $item){
$items = explode(":",$item);
if($items[0] == "Registrant Email"){
$email = $items[1];
}
}
return $email;
}
The code above gets the Registrant Email
from the whois results.
I reference it later on in my code like this: $email = GetEmailFromWhois($domain);
However, at the same time as getting the registrant email, I'd also like to get the Registrant Name
, Registrant Phone
, and Registrant Country
.
I could just copy the code above 3 more times for each of those additional fields, but that would cause there to be 4 whois queries for each domain - instead of just one.
Anyone know how I can get the info I need in a single query and then use it later on in my code?
Upvotes: 2
Views: 3344
Reputation: 11
Try this
<?php
/*************************************************************************
php easy :: whois lookup script
==========================================================================
Author: php easy code, www.phpeasycode.com
Web Site: http://www.phpeasycode.com
Contact: [email protected]
*************************************************************************/
$domain = $_GET['domain'];
// For the full list of TLDs/Whois servers see http://www.iana.org/domains/root/db/ and http://www.whois365.com/en/listtld/
$whoisservers = array(
"ac" => "whois.nic.ac", // Ascension Island
// ad - Andorra - no whois server assigned
"ae" => "whois.nic.ae", // United Arab Emirates
"aero"=>"whois.aero",
"af" => "whois.nic.af", // Afghanistan
"ag" => "whois.nic.ag", // Antigua And Barbuda
"ai" => "whois.ai", // Anguilla
"al" => "whois.ripe.net", // Albania
"am" => "whois.amnic.net", // Armenia
// an - Netherlands Antilles - no whois server assigned
// ao - Angola - no whois server assigned
// aq - Antarctica (New Zealand) - no whois server assigned
// ar - Argentina - no whois server assigned
"arpa" => "whois.iana.org",
"as" => "whois.nic.as", // American Samoa
"asia" => "whois.nic.asia",
"at" => "whois.nic.at", // Austria
"au" => "whois.aunic.net", // Australia
// aw - Aruba - no whois server assigned
"ax" => "whois.ax", // Aland Islands
"az" => "whois.ripe.net", // Azerbaijan
// ba - Bosnia And Herzegovina - no whois server assigned
// bb - Barbados - no whois server assigned
// bd - Bangladesh - no whois server assigned
"be" => "whois.dns.be", // Belgium
"bg" => "whois.register.bg", // Bulgaria
"bi" => "whois.nic.bi", // Burundi
"biz" => "whois.biz",
"bj" => "whois.nic.bj", // Benin
// bm - Bermuda - no whois server assigned
"bn" => "whois.bn", // Brunei Darussalam
"bo" => "whois.nic.bo", // Bolivia
"br" => "whois.registro.br", // Brazil
"bt" => "whois.netnames.net", // Bhutan
// bv - Bouvet Island (Norway) - no whois server assigned
// bw - Botswana - no whois server assigned
"by" => "whois.cctld.by", // Belarus
"bz" => "whois.belizenic.bz", // Belize
"ca" => "whois.cira.ca", // Canada
"cat" => "whois.cat", // Spain
"cc" => "whois.nic.cc", // Cocos (Keeling) Islands
"cd" => "whois.nic.cd", // Congo, The Democratic Republic Of The
// cf - Central African Republic - no whois server assigned
"ch" => "whois.nic.ch", // Switzerland
"ci" => "whois.nic.ci", // Cote d'Ivoire
"ck" => "whois.nic.ck", // Cook Islands
"cl" => "whois.nic.cl", // Chile
// cm - Cameroon - no whois server assigned
"cn" => "whois.cnnic.net.cn", // China
"co" => "whois.nic.co", // Colombia
"com" => "whois.verisign-grs.com",
"coop" => "whois.nic.coop",
// cr - Costa Rica - no whois server assigned
// cu - Cuba - no whois server assigned
// cv - Cape Verde - no whois server assigned
// cw - Curacao - no whois server assigned
"cx" => "whois.nic.cx", // Christmas Island
// cy - Cyprus - no whois server assigned
"cz" => "whois.nic.cz", // Czech Republic
"de" => "whois.denic.de", // Germany
// dj - Djibouti - no whois server assigned
"dk" => "whois.dk-hostmaster.dk", // Denmark
"dm" => "whois.nic.dm", // Dominica
// do - Dominican Republic - no whois server assigned
"dz" => "whois.nic.dz", // Algeria
"ec" => "whois.nic.ec", // Ecuador
"edu" => "whois.educause.edu",
"ee" => "whois.eenet.ee", // Estonia
"eg" => "whois.ripe.net", // Egypt
// er - Eritrea - no whois server assigned
"es" => "whois.nic.es", // Spain
// et - Ethiopia - no whois server assigned
"eu" => "whois.eu",
"fi" => "whois.ficora.fi", // Finland
// fj - Fiji - no whois server assigned
// fk - Falkland Islands - no whois server assigned
// fm - Micronesia, Federated States Of - no whois server assigned
"fo" => "whois.nic.fo", // Faroe Islands
"fr" => "whois.nic.fr", // France
// ga - Gabon - no whois server assigned
"gd" => "whois.nic.gd", // Grenada
// ge - Georgia - no whois server assigned
// gf - French Guiana - no whois server assigned
"gg" => "whois.gg", // Guernsey
// gh - Ghana - no whois server assigned
"gi" => "whois2.afilias-grs.net", // Gibraltar
"gl" => "whois.nic.gl", // Greenland (Denmark)
// gm - Gambia - no whois server assigned
// gn - Guinea - no whois server assigned
"gov" => "whois.nic.gov",
// gr - Greece - no whois server assigned
// gt - Guatemala - no whois server assigned
"gs" => "whois.nic.gs", // South Georgia And The South Sandwich Islands
// gu - Guam - no whois server assigned
// gw - Guinea-bissau - no whois server assigned
"gy" => "whois.registry.gy", // Guyana
"hk" => "whois.hkirc.hk", // Hong Kong
// hm - Heard and McDonald Islands (Australia) - no whois server assigned
"hn" => "whois.nic.hn", // Honduras
"hr" => "whois.dns.hr", // Croatia
"ht" => "whois.nic.ht", // Haiti
"hu" => "whois.nic.hu", // Hungary
// id - Indonesia - no whois server assigned
"ie" => "whois.domainregistry.ie", // Ireland
"il" => "whois.isoc.org.il", // Israel
"im" => "whois.nic.im", // Isle of Man
"in" => "whois.inregistry.net", // India
"info" => "whois.afilias.net",
"int" => "whois.iana.org",
"io" => "whois.nic.io", // British Indian Ocean Territory
"iq" => "whois.cmc.iq", // Iraq
"ir" => "whois.nic.ir", // Iran, Islamic Republic Of
"is" => "whois.isnic.is", // Iceland
"it" => "whois.nic.it", // Italy
"je" => "whois.je", // Jersey
// jm - Jamaica - no whois server assigned
// jo - Jordan - no whois server assigned
"jobs" => "jobswhois.verisign-grs.com",
"jp" => "whois.jprs.jp", // Japan
"ke" => "whois.kenic.or.ke", // Kenya
"kg" => "www.domain.kg", // Kyrgyzstan
// kh - Cambodia - no whois server assigned
"ki" => "whois.nic.ki", // Kiribati
// km - Comoros - no whois server assigned
// kn - Saint Kitts And Nevis - no whois server assigned
// kp - Korea, Democratic People's Republic Of - no whois server assigned
"kr" => "whois.kr", // Korea, Republic Of
// kw - Kuwait - no whois server assigned
// ky - Cayman Islands - no whois server assigned
"kz" => "whois.nic.kz", // Kazakhstan
"la" => "whois.nic.la", // Lao People's Democratic Republic
// lb - Lebanon - no whois server assigned
// lc - Saint Lucia - no whois server assigned
"li" => "whois.nic.li", // Liechtenstein
// lk - Sri Lanka - no whois server assigned
"lt" => "whois.domreg.lt", // Lithuania
"lu" => "whois.dns.lu", // Luxembourg
"lv" => "whois.nic.lv", // Latvia
"ly" => "whois.nic.ly", // Libya
"ma" => "whois.iam.net.ma", // Morocco
// mc - Monaco - no whois server assigned
"md" => "whois.nic.md", // Moldova
"me" => "whois.nic.me", // Montenegro
"mg" => "whois.nic.mg", // Madagascar
// mh - Marshall Islands - no whois server assigned
"mil" => "whois.nic.mil",
// mk - Macedonia, The Former Yugoslav Republic Of - no whois server assigned
"ml" => "whois.dot.ml", // Mali
// mm - Myanmar - no whois server assigned
"mn" => "whois.nic.mn", // Mongolia
"mo" => "whois.monic.mo", // Macao
"mobi" => "whois.dotmobiregistry.net",
"mp" => "whois.nic.mp", // Northern Mariana Islands
// mq - Martinique (France) - no whois server assigned
// mr - Mauritania - no whois server assigned
"ms" => "whois.nic.ms", // Montserrat
// mt - Malta - no whois server assigned
"mu" => "whois.nic.mu", // Mauritius
"museum" => "whois.museum",
// mv - Maldives - no whois server assigned
// mw - Malawi - no whois server assigned
"mx" => "whois.mx", // Mexico
"my" => "whois.domainregistry.my", // Malaysia
// mz - Mozambique - no whois server assigned
"na" => "whois.na-nic.com.na", // Namibia
"name" => "whois.nic.name",
"nc" => "whois.nc", // New Caledonia
// ne - Niger - no whois server assigned
"net" => "whois.verisign-grs.net",
"nf" => "whois.nic.nf", // Norfolk Island
"ng" => "whois.nic.net.ng", // Nigeria
// ni - Nicaragua - no whois server assigned
"nl" => "whois.domain-registry.nl", // Netherlands
"no" => "whois.norid.no", // Norway
// np - Nepal - no whois server assigned
// nr - Nauru - no whois server assigned
"nu" => "whois.nic.nu", // Niue
"nz" => "whois.srs.net.nz", // New Zealand
"om" => "whois.registry.om", // Oman
"org" => "whois.pir.org",
// pa - Panama - no whois server assigned
"pe" => "kero.yachay.pe", // Peru
"pf" => "whois.registry.pf", // French Polynesia
// pg - Papua New Guinea - no whois server assigned
// ph - Philippines - no whois server assigned
// pk - Pakistan - no whois server assigned
"pl" => "whois.dns.pl", // Poland
"pm" => "whois.nic.pm", // Saint Pierre and Miquelon (France)
// pn - Pitcairn (New Zealand) - no whois server assigned
"post" => "whois.dotpostregistry.net",
"pr" => "whois.nic.pr", // Puerto Rico
"pro" => "whois.dotproregistry.net",
// ps - Palestine, State of - no whois server assigned
"pt" => "whois.dns.pt", // Portugal
"pw" => "whois.nic.pw", // Palau
// py - Paraguay - no whois server assigned
"qa" => "whois.registry.qa", // Qatar
"re" => "whois.nic.re", // Reunion (France)
"ro" => "whois.rotld.ro", // Romania
"rs" => "whois.rnids.rs", // Serbia
"ru" => "whois.tcinet.ru", // Russian Federation
// rw - Rwanda - no whois server assigned
"sa" => "whois.nic.net.sa", // Saudi Arabia
"sb" => "whois.nic.net.sb", // Solomon Islands
"sc" => "whois2.afilias-grs.net", // Seychelles
// sd - Sudan - no whois server assigned
"se" => "whois.iis.se", // Sweden
"sg" => "whois.sgnic.sg", // Singapore
"sh" => "whois.nic.sh", // Saint Helena
"si" => "whois.arnes.si", // Slovenia
"sk" => "whois.sk-nic.sk", // Slovakia
// sl - Sierra Leone - no whois server assigned
"sm" => "whois.nic.sm", // San Marino
"sn" => "whois.nic.sn", // Senegal
"so" => "whois.nic.so", // Somalia
// sr - Suriname - no whois server assigned
"st" => "whois.nic.st", // Sao Tome And Principe
"su" => "whois.tcinet.ru", // Russian Federation
// sv - El Salvador - no whois server assigned
"sx" => "whois.sx", // Sint Maarten (dutch Part)
"sy" => "whois.tld.sy", // Syrian Arab Republic
// sz - Swaziland - no whois server assigned
"tc" => "whois.meridiantld.net", // Turks And Caicos Islands
// td - Chad - no whois server assigned
"tel" => "whois.nic.tel",
"tf" => "whois.nic.tf", // French Southern Territories
// tg - Togo - no whois server assigned
"th" => "whois.thnic.co.th", // Thailand
"tj" => "whois.nic.tj", // Tajikistan
"tk" => "whois.dot.tk", // Tokelau
"tl" => "whois.nic.tl", // Timor-leste
"tm" => "whois.nic.tm", // Turkmenistan
"tn" => "whois.ati.tn", // Tunisia
"to" => "whois.tonic.to", // Tonga
"tp" => "whois.nic.tl", // Timor-leste
"tr" => "whois.nic.tr", // Turkey
"travel" => "whois.nic.travel",
// tt - Trinidad And Tobago - no whois server assigned
"tv" => "tvwhois.verisign-grs.com", // Tuvalu
"tw" => "whois.twnic.net.tw", // Taiwan
"tz" => "whois.tznic.or.tz", // Tanzania, United Republic Of
"ua" => "whois.ua", // Ukraine
"ug" => "whois.co.ug", // Uganda
"uk" => "whois.nic.uk", // United Kingdom
"us" => "whois.nic.us", // United States
"uy" => "whois.nic.org.uy", // Uruguay
"uz" => "whois.cctld.uz", // Uzbekistan
// va - Holy See (vatican City State) - no whois server assigned
"vc" => "whois2.afilias-grs.net", // Saint Vincent And The Grenadines
"ve" => "whois.nic.ve", // Venezuela
"vg" => "whois.adamsnames.tc", // Virgin Islands, British
// vi - Virgin Islands, US - no whois server assigned
// vn - Viet Nam - no whois server assigned
// vu - Vanuatu - no whois server assigned
"wf" => "whois.nic.wf", // Wallis and Futuna
"ws" => "whois.website.ws", // Samoa
"xxx" => "whois.nic.xxx",
// ye - Yemen - no whois server assigned
"yt" => "whois.nic.yt", // Mayotte
"yu" => "whois.ripe.net");
function LookupDomain($domain){
global $whoisservers;
$domain_parts = explode(".", $domain);
$tld = strtolower(array_pop($domain_parts));
$whoisserver = $whoisservers[$tld];
if(!$whoisserver) {
return "Error: No appropriate Whois server found for $domain domain!";
}
$result = QueryWhoisServer($whoisserver, $domain);
if(!$result) {
return "Error: No results retrieved from $whoisserver server for $domain domain!";
}
else {
while(strpos($result, "Whois Server:") !== FALSE){
preg_match("/Whois Server: (.*)/", $result, $matches);
$secondary = $matches[1];
if($secondary) {
$result = QueryWhoisServer($secondary, $domain);
$whoisserver = $secondary;
}
}
}
return "$domain domain lookup results from $whoisserver server:\n\n" . $result;
}
function LookupIP($ip) {
$whoisservers = array(
//"whois.afrinic.net", // Africa - returns timeout error :-(
"whois.lacnic.net", // Latin America and Caribbean - returns data for ALL locations worldwide :-)
"whois.apnic.net", // Asia/Pacific only
"whois.arin.net", // North America only
"whois.ripe.net" // Europe, Middle East and Central Asia only
);
$results = array();
foreach($whoisservers as $whoisserver) {
$result = QueryWhoisServer($whoisserver, $ip);
if($result && !in_array($result, $results)) {
$results[$whoisserver]= $result;
}
}
$res = "RESULTS FOUND: " . count($results);
foreach($results as $whoisserver=>$result) {
$res .= "\n\n-------------\nLookup results for " . $ip . " from " . $whoisserver . " server:\n\n" . $result;
}
return $res;
}
function ValidateIP($ip) {
$ipnums = explode(".", $ip);
if(count($ipnums) != 4) {
return false;
}
foreach($ipnums as $ipnum) {
if(!is_numeric($ipnum) || ($ipnum > 255)) {
return false;
}
}
return $ip;
}
function ValidateDomain($domain) {
if(!preg_match("/^([-a-z0-9]{2,100})\.([a-z\.]{2,8})$/i", $domain)) {
return false;
}
return $domain;
}
function QueryWhoisServer($whoisserver, $domain) {
$port = 43;
$timeout = 10;
$fp = @fsockopen($whoisserver, $port, $errno, $errstr, $timeout) or die("Socket Error " . $errno . " - " . $errstr);
//if($whoisserver == "whois.verisign-grs.com") $domain = "=".$domain; // whois.verisign-grs.com requires the equals sign ("=") or it returns any result containing the searched string.
fputs($fp, $domain . "\r\n");
$out = "";
while(!feof($fp)){
$out .= fgets($fp);
}
fclose($fp);
$res = "";
if((strpos(strtolower($out), "error") === FALSE) && (strpos(strtolower($out), "not allocated") === FALSE)) {
$rows = explode("\n", $out);
foreach($rows as $row) {
$row = trim($row);
if(($row != '') && ($row[0] != '#') && ($row[0] != '%')) {
$res .= $row."\n";
}
}
}
return $res;
}
?>
<html>
<head>
<title>Whois Lookup Script</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form action="<?=$_SERVER['PHP_SELF'];?>">
<p><b><label for="domain">Domain/IP Address:</label></b> <input type="text" name="domain" id="domain" value="<?=$domain;?>"> <input type="submit" value="Lookup"></p>
</form>
<?php
if($domain) {
$domain = trim($domain);
if(substr(strtolower($domain), 0, 8) == "https://") $domain = substr($domain, 8);
if(substr(strtolower($domain), 0, 7) == "http://") $domain = substr($domain, 7);
if(substr(strtolower($domain), 0, 4) == "www.") $domain = substr($domain, 4);
if(ValidateIP($domain)) {
echo "hello before check";
$result = LookupIP($domain);
}
elseif(ValidateDomain($domain)) {
$result = LookupDomain($domain);
}
else die("Invalid Input!");
echo "<pre>\n" . $result . "\n</pre>\n";
}
?>
</body>
</html>
Upvotes: 1
Reputation:
As I recently noted in another answer, parsing WHOIS data is a complex, messy affair. The exact format of WHOIS responses is not specified by any standard, and not all registries/registrars will use the format you're attempting to parse here. (Some use different labels to mark the fields you're searching for, some use labels that are ambiguous without context, some don't label certain fields at all, and some won't even include the information you're searching for here.) Worse, some registries/registrars will heavily rate limit you if it becomes apparent that you're trying to extract more than a few responses from them. In short, I'd recommend that you avoid attempting to parse WHOIS responses if at all possible.
To solve your immediate problem, though, you can create an associative array to represent the WHOIS response like so:
$arr = [];
foreach($raw_data as $item) {
list($k, $v) = explode(":", $item);
$arr[$k] = $v;
}
This will give you an associative array of the results, so you can pull out individual values using e.g.
$email = $arr["Registrant Email"];
Upvotes: 4