jraavis icon

WHOIS Search

jraavis | PRO | 06/24/19 10:39:43 AM UTC | 0 ⭐ | 460 👁️ | Never ⏰ | []
PHP |

16.72 KB

|

None

|

0 👍

/

0 👎

<?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