<?php
$domain = isset($_GET['q'])?$_GET['q']:(isset($argv[1])?$argv[1]:'');
$whoisservers = json_decode(file_get_contents('WhoIsServers.json'),true);
$domain = strtolower(trim($domain));
$domain = strip_tags($domain);
$domain = str_replace("http://", "", $domain);
$domain = str_replace("https://", "", $domain);
$domain = str_replace("www.", "", $domain);
$domain = explode("/", $domain, 2)[0];
$domain = strtolower($domain);
$domain = htmlspecialchars($domain);
$explodedDomain = explode(".", $domain);
$explodedCount = count($explodedDomain);
if(empty($explodedDomain[$explodedCount-1]) || empty($domain)){
echo json_encode(array('error'=>'Invalid Domain'));
die();
} else {
$domainArr = array_slice($explodedDomain, -2);
$domain = implode(".", $domainArr);
//$domain = $explodedDomain[$explodedCount-2].".".$explodedDomain[$explodedCount-1];
if($explodedCount >= 3){
if(array_key_exists($explodedDomain[$explodedCount-1], $whoisservers)){
if(array_key_exists($explodedDomain[$explodedCount-2], $whoisservers)){
//$domain = $explodedDomain[$explodedCount-3].".".$explodedDomain[$explodedCount-2].".".$explodedDomain[$explodedCount-1];
$domainArr = array_slice($explodedDomain, -3);
$domain = implode(".", $domainArr);
}
} else {
echo json_encode(array('error'=>'No matching nic server found!'));
die();
}
}
$tld = substr($domain, strrpos($domain, '.') + 1);
$serverUrl = $whoisservers[$tld];
// connect to whois server:
$loop = true;
$count = 0;
while($loop) {
$f = fsockopen($serverUrl, 43);
$needToBeAddEqual = ["whois.verisign-grs.com", "whois.verisign-grs.net"];
if (in_array($serverUrl, $needToBeAddEqual)) {
fputs($f, "=" . $domain . "\r\n");
} else {
fputs($f, $domain . "\r\n");
}
$data = [];
while (!feof($f)){
$data[] = rtrim(fgets($f), "\n");
}
$stringsExistToMeanAvailable = ["No Match", "No match", "No match for", "Status: AVAILABLE", "NOT FOUND", "Not found", "No Found", "No information available about domain name", "No matching record.", "No entries found in the AFNIC Database.", "The domain has not been registered.", "Status: free"];
$stringsExistToMeanErrorInput = ["Incorrect input, please try again.", "Error for \""];
$stringsExistToMeanWaitSomeTime = ["Please maintain at least " => "Please maintain at least %d-second time before starting another enquiry."];
foreach($data as $eachLine) {
foreach($stringsExistToMeanAvailable as $stringExistToMeanAvailable){
if(strpos($eachLine, $stringExistToMeanAvailable) !== false){
echo json_encode(['error'=>'No domain found']);
die;
}
}
foreach($stringsExistToMeanErrorInput as $stringExistToMeanErrorInput){
if(strpos($eachLine, $stringExistToMeanErrorInput) !== false){
echo json_encode(['error'=>'Invalid domain']);
die;
}
}
foreach($stringsExistToMeanWaitSomeTime as $stringExistToMeanWaitSomeTime => $sscanfFullString){
if(strpos($eachLine, $stringExistToMeanWaitSomeTime) !== false){
if($sscanfFullString == "N/A"){
echo json_encode(['error'=>'Please wait sometime']);
}else{
sscanf($eachLine, $sscanfFullString, $second);
if(!empty($second)){
echo json_encode(['error'=>'Please wait '.$second.' seconds']);
}else{
echo json_encode(['error'=>'Please wait sometime']);
}
}
}
}
} /* Data loop end */
//print_r($data);
$whoisServerFromWhois = parse($data, $domain, 'Domain Name:', ['Whois Server' => 'whois_server','Registrar WHOIS Server'=>'whois_server','WHOIS Server'=>'whois_server'], true);
if(!empty($whoisServerFromWhois['whois_server'][0])){
$serverUrl = $whoisServerFromWhois['whois_server'][0];
}
if($count>=1){
$loop = false;
}
$count++;
} /* While loop end */
$parsedResult = parse_domain($data, $domain, $tld);
if(!empty($parsedResult[0])){
if(array_key_exists('error',$parsedResult)) {
echo json_encode($parsedResult);
die();
}
} else {
$new_data = [];
foreach($data as $row) {
$pieces = explode(':',$row);
if(count($pieces)>=2) {
if(trim($pieces[0])=='DNSSEC') {
break;
} else if(trim($pieces[1])!='') {
$key = array_shift($pieces);
$new_data[trim($key)] = trim(implode(':',$pieces));
}
}
}
echo json_encode($new_data);
}
}
function parse($data, $domain, $domainWord, $keywords, $breakOnEnter)
{
$found = false;
$domainWordLen = strlen($domainWord);
$res = [];
foreach ($data AS $d)
{
$d = trim($d);
if ($d == '')
{
if ($breakOnEnter)
{
$found = false;
}
continue;
}
$pos = strpos($d, $domainWord);
if ($pos !== false)
{
$dom = strtolower(trim(substr($d, $pos + $domainWordLen)));
if ($dom == $domain)
{
$found = true;
}
}
if ($found)
{
$pos = strpos($d, ':');
if ($pos !== false)
{
$keyword = substr($d, 0, $pos);
if (isset($keywords[$keyword]))
{
$t = trim(substr($d, $pos+1));
if ($t != '')
{
$res[$keywords[$keyword]][] = $t;
}
}
else
{
$keyword = '';
}
}
else if ($keyword)
{
$res[$keywords[$keyword]][] = $d;
}
}
}
return $res;
}
function parse_domain($data, $domain, $tld)
{
$domainWords = [
'def' => 'Domain Name:',
'com' => 'Domain Name:',
'org' => 'Domain Name:',
'net' => 'Domain Name:',
'biz' => 'Domain Name:',
'info' => 'Domain Name:',
'name' => 'Domain Name:',
'asia' => 'Domain Name:',
'pl' => 'DOMAIN NAME:',
'de' => 'Domain:',
'fr' => 'domain:',
'eu' => 'Domain:',
'us' => 'Domain Name:',
'cn' => 'Domain Name:',
'hk' => 'Domain Name:',
'tw' => 'Domain Name:'
];
$domainsKeywords = [
[ 'id' => ['Domain ID', 'Domain Name ID', 'Registry Domain ID', 'ROID'] ],
[ 'domain' => ['Domain name', 'Domain Name', 'DOMAIN NAME', 'Domain', 'domain'] ],
[ 'bundled_domain' => ['Bundled Domain Name'] ],
[ 'dns' => ['Name Server', 'Nameservers', 'Name servers', 'Name Servers Information', 'Domain servers in listed order', 'nserver', 'nameservers'] ],
[ 'registrar' => ['Registrar', 'registrar', 'Registrant', 'Registrar Name', 'Created by Registrar'] ],
[ 'registrar_url' => ['Registrar URL', 'Registrar URL (registration services)'] ],
[ 'sponsoring_registrar' => [ 'Sponsoring Registrar'] ],
[ 'whois_server' => ['Whois Server', 'WHOIS SERVER', 'Registrar WHOIS Server'] ],
[ 'created' => ['Creation Date', 'Created On', 'Registration Time', 'Domain Create Date', 'Domain Registration Date', 'Domain Name Commencement Date', 'created'] ],
[ 'updated' => ['last-update', 'Updated Date', 'Domain Last Updated Date', 'last modified'] ],
[ 'expires' => ['Expiry Date', 'Expiration Date', 'Expiration Time', 'Domain Expiration Date', 'Registrar Registration Expiration Date', 'Record expires on', 'Registry Expiry Date', 'renewal date'] ],
[ 'status' => ['Status', 'status', 'Domain Status'] ],
];
$toBeParseKeywords = [];
foreach ($domainsKeywords as $domainKeywords){
foreach ($domainKeywords as $var => $keywords){
foreach($keywords as $keyword){
$toBeParseKeywords[$keyword] = $var;
}
}
}
$contactInfoCategories = [
[ 'id' => ['ID'] ],
[ 'name' => ['Name'] ],
[ 'organization' => ['Organization'] ],
[ 'city' => ['City'] ],
[ 'country' => ['Country', 'Country/Economy'] ],
[ 'address' => ['Street', 'Address', 'Address1', 'Address2', 'Address3', 'Address4','Postal Code'] ],
[ 'state_province' => ['State/Province','State'] ],
[ 'postal_code' => ['Postal Code'] ],
[ 'email' => ['Email'] ],
[ 'phone' => ['Phone', 'Phone Number','Mobile'] ],
[ 'phone_ext' => ['Phone Ext', 'Phone Ext.'] ],
[ 'fax' => ['Fax', 'FAX', 'Facsimile Number'] ],
[ 'fax_ext' => ['Fax Ext', 'FAX Ext.'] ]
];
$contactInfoKeywords = [
[ 'admin' => ['Admin', 'Administrative', 'Administrative Contact'] ],
[ 'registrant' => ['Registrant'] ],
[ 'tech' => ['Tech', 'Technical', 'Technical Contact'] ],
[ 'billing' => ['Bill', 'Billing', 'Billing Contact'] ]
];
foreach ($contactInfoKeywords as $contactInfoKeyword){
foreach($contactInfoKeyword as $contactKey => $contactKeywords){
foreach($contactKeywords as $contactKeyword){
foreach ($contactInfoCategories as $contactInfoCategory){
foreach ($contactInfoCategory as $var => $keywords){
foreach($keywords as $keyword){
$toBeParseKeywords[$contactKeyword." ".$keyword] = $contactKey."_".$var;
}
}
}
}
}
}
if(array_key_exists($tld, $domainWords)){
$domainWord = $domainWords[$tld];
}else{
$domainWord = $domainWords['def'];
}
$data = array_filter(array_map("ifWhiteSpace", $data));
$parseResult = parse($data, $domain, $domainWord, $toBeParseKeywords, true);
$needToBeSingles = ["domain", "id"];
foreach($needToBeSingles as $needToBeSingle){
if(!empty($parseResult[$needToBeSingle])){
$parseResult[$needToBeSingle] = $parseResult[$needToBeSingle][0];
}
}
if(!empty($parseResult['domain'])){
$parseResult['domain'] = strtolower($parseResult['domain']);
}
$needToBeParsedTimeKeys = ['created', 'expires', 'updated'];
foreach($needToBeParsedTimeKeys as $needToBeParsedTimeKey){
if(!empty($parseResult[$needToBeParsedTimeKey])){
$domainTime = $parseResult[$needToBeParsedTimeKey][0];
//if ( (date_parse($domainTime)['warning_count'] == 0) && (date_parse($domainTime)['error_count'] == 0) ) {
if (date_parse($domainTime)['error_count'] == 0) {
$parsed_date = date_parse($domainTime);
$parseResult[$needToBeParsedTimeKey."_parsed"] = $parsed_date;
$date_string = date('Y-m-d H:i:s', mktime($parsed_date['hour'], $parsed_date['minute'], $parsed_date['second'], $parsed_date['month'], $parsed_date['day'], $parsed_date['year']));
$parseResult[$needToBeParsedTimeKey."_parsed_string"] = $date_string;
}else{
$formatedTime = $domainTime;
$formatedTime = str_replace("T", " ", $formatedTime);
$formatedTime = str_replace("Z", " ", $formatedTime);
$formatedTime = trim($formatedTime);
$parsed_date = date_parse_from_format("Y-m-d H:i:s.u", $formatedTime);
$parseResult[$needToBeParsedTimeKey."_parsed"] = $parsed_date;
$date_string = date('Y-m-d H:i:s', mktime($parsed_date['hour'], $parsed_date['minute'], $parsed_date['second'], $parsed_date['month'], $parsed_date['day'], $parsed_date['year']));
$parseResult[$needToBeParsedTimeKey."_parsed_string"] = $date_string;
}
}
}
foreach($parseResult as $eachParseResultKey => $eachParseResult){
if (substr($eachParseResultKey, 0, 6) == "admin_") {
unset($parseResult[$eachParseResultKey]);
$key = substr($eachParseResultKey, 6);
if($key != "address"){
$eachParseResult = $eachParseResult[0];
}
$parseResult['admin'][$key] = $eachParseResult;
}
if (substr($eachParseResultKey, 0, 11) == "registrant_") {
unset($parseResult[$eachParseResultKey]);
$key = substr($eachParseResultKey, 11);
if($key != "address"){
$eachParseResult = $eachParseResult[0];
}
$parseResult['registrant'][$key] = $eachParseResult;
}
if (substr($eachParseResultKey, 0, 5) == "tech_") {
unset($parseResult[$eachParseResultKey]);
$key = substr($eachParseResultKey, 5);
if($key != "address"){
$eachParseResult = $eachParseResult[0];
}
$parseResult['tech'][$key] = $eachParseResult;
}
if (substr($eachParseResultKey, 0, 8) == "billing_") {
unset($parseResult[$eachParseResultKey]);
$key = substr($eachParseResultKey, 8);
if($key != "address"){
$eachParseResult = $eachParseResult[0];
}
$parseResult['bill'][$key] = $eachParseResult;
}
}
$needToBeLowerCasedValueFathers = ['registrant', 'admin', 'tech', 'billing'];
foreach($needToBeLowerCasedValueFathers as $needToBeLowerCasedValueFather){
if(!empty($parseResult[$needToBeLowerCasedValueFather])){
$needToBeLowerCasedValue = $parseResult[$needToBeLowerCasedValueFather]['email'];
if(!empty($needToBeLowerCasedValue)){
$parseResult[$needToBeLowerCasedValueFather]['email'] = strtolower($parseResult[$needToBeLowerCasedValueFather]['email']);
}
}
}
$needToAddCompletelyAddressArrays = ['registrant', 'admin', 'tech', 'billing'];
foreach($needToAddCompletelyAddressArrays as $needToAddCompletelyAddressArray){
if(!empty($parseResult[$needToAddCompletelyAddressArray])){
if(!empty($parseResult[$needToAddCompletelyAddressArray]["address"])){
$parseResult[$needToAddCompletelyAddressArray]["completely_address"] = implode(", ", $parseResult[$needToAddCompletelyAddressArray]["address"]);
/* WILL CITY & COUNTRY WILL BE INCLUDE IN FULL ADDRESS? */
$allExtraInfomations = ["city", "country"];
foreach($allExtraInfomations as $extraInfomation){
if(!empty($parseResult[$needToAddCompletelyAddressArray][$extraInfomation])){
$parseResult[$needToAddCompletelyAddressArray]["completely_address"] .= ", ".$parseResult[$needToAddCompletelyAddressArray][$extraInfomation];
}
}
$parseResult[$needToAddCompletelyAddressArray]["completely_address"] = ucwords(strtolower($parseResult[$needToAddCompletelyAddressArray]["completely_address"]));
}
}
}
if(empty($parseResult)){
return ['error'=>'No data'];
}
return $parseResult;
}
function ifWhiteSpace($el){
return trim($el, " ");
}
Comments