Advertisement
jraavis

WHOIS Search

Jun 24th, 2019
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.72 KB | None | 0 0
  1. <?php
  2. $domain = isset($_GET['q'])?$_GET['q']:(isset($argv[1])?$argv[1]:'');
  3. $whoisservers = json_decode(file_get_contents('WhoIsServers.json'),true);
  4.  
  5. $domain = strtolower(trim($domain));
  6. $domain = strip_tags($domain);
  7. $domain = str_replace("http://", "", $domain);
  8. $domain = str_replace("https://", "", $domain);
  9. $domain = str_replace("www.", "", $domain);
  10. $domain = explode("/", $domain, 2)[0];
  11. $domain = strtolower($domain);
  12. $domain = htmlspecialchars($domain);
  13. $explodedDomain = explode(".", $domain);
  14. $explodedCount = count($explodedDomain);
  15. if(empty($explodedDomain[$explodedCount-1]) || empty($domain)){
  16.     echo json_encode(array('error'=>'Invalid Domain'));
  17.     die();
  18. } else {
  19.     $domainArr = array_slice($explodedDomain, -2);
  20.     $domain = implode(".", $domainArr);
  21.     //$domain = $explodedDomain[$explodedCount-2].".".$explodedDomain[$explodedCount-1];
  22.     if($explodedCount >= 3){
  23.         if(array_key_exists($explodedDomain[$explodedCount-1], $whoisservers)){
  24.             if(array_key_exists($explodedDomain[$explodedCount-2], $whoisservers)){
  25.                 //$domain = $explodedDomain[$explodedCount-3].".".$explodedDomain[$explodedCount-2].".".$explodedDomain[$explodedCount-1];
  26.                 $domainArr = array_slice($explodedDomain, -3);
  27.                 $domain = implode(".", $domainArr);
  28.             }
  29.         } else {
  30.             echo json_encode(array('error'=>'No matching nic server found!'));
  31.             die();
  32.         }
  33.     }
  34.     $tld = substr($domain, strrpos($domain, '.') + 1);
  35.     $serverUrl = $whoisservers[$tld];
  36.    
  37.     // connect to whois server:
  38.     $loop = true;
  39.     $count = 0;
  40.     while($loop) {
  41.         $f = fsockopen($serverUrl, 43);
  42.         $needToBeAddEqual = ["whois.verisign-grs.com", "whois.verisign-grs.net"];
  43.         if (in_array($serverUrl, $needToBeAddEqual)) {
  44.             fputs($f, "=" . $domain . "\r\n");
  45.         } else {
  46.             fputs($f, $domain . "\r\n");
  47.         }
  48.         $data = [];
  49.         while (!feof($f)){
  50.             $data[] = rtrim(fgets($f), "\n");
  51.         }
  52.         $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"];
  53.         $stringsExistToMeanErrorInput = ["Incorrect input, please try again.", "Error for \""];
  54.         $stringsExistToMeanWaitSomeTime = ["Please maintain at least " => "Please maintain at least %d-second time before starting another enquiry."];
  55.         foreach($data as $eachLine) {
  56.             foreach($stringsExistToMeanAvailable as $stringExistToMeanAvailable){
  57.                 if(strpos($eachLine, $stringExistToMeanAvailable) !== false){
  58.                     echo json_encode(['error'=>'No domain found']);
  59.                     die;
  60.                 }
  61.             }
  62.             foreach($stringsExistToMeanErrorInput as $stringExistToMeanErrorInput){
  63.                 if(strpos($eachLine, $stringExistToMeanErrorInput) !== false){
  64.                     echo json_encode(['error'=>'Invalid domain']);
  65.                     die;
  66.                 }
  67.             }
  68.             foreach($stringsExistToMeanWaitSomeTime as $stringExistToMeanWaitSomeTime => $sscanfFullString){
  69.                 if(strpos($eachLine, $stringExistToMeanWaitSomeTime) !== false){
  70.                     if($sscanfFullString == "N/A"){
  71.                         echo json_encode(['error'=>'Please wait sometime']);
  72.                     }else{
  73.                         sscanf($eachLine, $sscanfFullString, $second);
  74.                         if(!empty($second)){
  75.                             echo json_encode(['error'=>'Please wait '.$second.' seconds']);
  76.                         }else{
  77.                             echo json_encode(['error'=>'Please wait sometime']);
  78.                         }
  79.                     }
  80.                 }
  81.             }
  82.         } /* Data loop end */
  83.         //print_r($data);
  84.         $whoisServerFromWhois = parse($data, $domain, 'Domain Name:', ['Whois Server' => 'whois_server','Registrar WHOIS Server'=>'whois_server','WHOIS Server'=>'whois_server'], true);
  85.         if(!empty($whoisServerFromWhois['whois_server'][0])){
  86.             $serverUrl = $whoisServerFromWhois['whois_server'][0];
  87.         }
  88.         if($count>=1){
  89.             $loop = false;
  90.         }
  91.         $count++;
  92.     } /* While loop end */
  93.     $parsedResult = parse_domain($data, $domain, $tld);
  94.     if(!empty($parsedResult[0])){
  95.         if(array_key_exists('error',$parsedResult)) {
  96.            echo json_encode($parsedResult);
  97.            die();
  98.         }
  99.     } else {
  100.         $new_data = [];
  101.         foreach($data as $row) {
  102.             $pieces = explode(':',$row);
  103.             if(count($pieces)>=2) {
  104.                 if(trim($pieces[0])=='DNSSEC') {
  105.                     break;
  106.                 } else if(trim($pieces[1])!='') {
  107.                     $key = array_shift($pieces);
  108.                     $new_data[trim($key)] = trim(implode(':',$pieces));
  109.                 }
  110.             }
  111.            
  112.         }
  113.         echo json_encode($new_data);
  114.     }
  115. }
  116.     function parse($data, $domain, $domainWord, $keywords, $breakOnEnter)
  117.     {
  118.         $found = false;
  119.         $domainWordLen = strlen($domainWord);
  120.        
  121.         $res = [];
  122.         foreach ($data AS $d)
  123.         {
  124.             $d = trim($d);
  125.            
  126.             if ($d == '')
  127.             {
  128.                 if ($breakOnEnter)
  129.                 {
  130.                     $found = false;
  131.                 }
  132.                 continue;
  133.             }
  134.            
  135.             $pos = strpos($d, $domainWord);
  136.             if ($pos !== false)
  137.             {
  138.                 $dom = strtolower(trim(substr($d, $pos + $domainWordLen)));
  139.                 if ($dom == $domain)
  140.                 {
  141.                     $found = true;
  142.                 }
  143.             }
  144.            
  145.             if ($found)
  146.             {
  147.                 $pos = strpos($d, ':');
  148.                 if ($pos !== false)
  149.                 {
  150.                     $keyword = substr($d, 0, $pos);
  151.                    
  152.                     if (isset($keywords[$keyword]))
  153.                     {
  154.                         $t = trim(substr($d, $pos+1));
  155.                         if ($t != '')
  156.                         {
  157.                             $res[$keywords[$keyword]][] = $t;
  158.                         }
  159.                     }
  160.                     else
  161.                     {
  162.                         $keyword = '';
  163.                     }
  164.                 }
  165.                 else if ($keyword)
  166.                 {
  167.                     $res[$keywords[$keyword]][] = $d;
  168.                 }
  169.             }
  170.         }
  171.         return $res;
  172.     }
  173.     function parse_domain($data, $domain, $tld)
  174.     {
  175.         $domainWords = [
  176.         'def' => 'Domain Name:',
  177.         'com' => 'Domain Name:',
  178.         'org' => 'Domain Name:',
  179.         'net' => 'Domain Name:',
  180.         'biz' => 'Domain Name:',
  181.         'info' => 'Domain Name:',
  182.         'name' => 'Domain Name:',
  183.         'asia' => 'Domain Name:',
  184.         'pl' => 'DOMAIN NAME:',
  185.         'de' => 'Domain:',
  186.         'fr' => 'domain:',
  187.         'eu' => 'Domain:',
  188.         'us' => 'Domain Name:',
  189.         'cn' => 'Domain Name:',
  190.         'hk' => 'Domain Name:',
  191.         'tw' => 'Domain Name:'
  192.         ];
  193.         $domainsKeywords = [
  194.         [ 'id'            => ['Domain ID', 'Domain Name ID', 'Registry Domain ID', 'ROID'] ],
  195.         [ 'domain'        => ['Domain name', 'Domain Name', 'DOMAIN NAME', 'Domain', 'domain'] ],
  196.         [ 'bundled_domain'        => ['Bundled Domain Name'] ],
  197.         [ 'dns'            => ['Name Server', 'Nameservers', 'Name servers', 'Name Servers Information', 'Domain servers in listed order', 'nserver', 'nameservers'] ],
  198.         [ 'registrar'    => ['Registrar', 'registrar', 'Registrant', 'Registrar Name', 'Created by Registrar'] ],
  199.         [ 'registrar_url'    => ['Registrar URL', 'Registrar URL (registration services)'] ],
  200.         [ 'sponsoring_registrar'    => [ 'Sponsoring Registrar'] ],
  201.         [ 'whois_server'    => ['Whois Server', 'WHOIS SERVER', 'Registrar WHOIS Server'] ],
  202.         [ 'created'        => ['Creation Date', 'Created On', 'Registration Time', 'Domain Create Date', 'Domain Registration Date', 'Domain Name Commencement Date', 'created'] ],
  203.         [ 'updated'        => ['last-update', 'Updated Date', 'Domain Last Updated Date', 'last modified'] ],
  204.         [ 'expires'        => ['Expiry Date', 'Expiration Date', 'Expiration Time', 'Domain Expiration Date', 'Registrar Registration Expiration Date', 'Record expires on', 'Registry Expiry Date', 'renewal date'] ],
  205.         [ 'status'        => ['Status', 'status', 'Domain Status'] ],
  206.         ];
  207.         $toBeParseKeywords = [];
  208.         foreach ($domainsKeywords as $domainKeywords){
  209.             foreach ($domainKeywords as $var => $keywords){
  210.                 foreach($keywords as $keyword){
  211.                     $toBeParseKeywords[$keyword] = $var;
  212.                 }
  213.             }
  214.         }
  215.         $contactInfoCategories = [
  216.         [ 'id'            => ['ID'] ],
  217.         [ 'name'        => ['Name'] ],
  218.         [ 'organization'    => ['Organization'] ],
  219.         [ 'city'        => ['City'] ],
  220.         [ 'country'        => ['Country', 'Country/Economy'] ],
  221.         [ 'address'        => ['Street', 'Address', 'Address1', 'Address2', 'Address3', 'Address4','Postal Code'] ],
  222.         [ 'state_province'    => ['State/Province','State'] ],
  223.         [ 'postal_code'        => ['Postal Code'] ],
  224.         [ 'email'        => ['Email'] ],
  225.         [ 'phone'        => ['Phone', 'Phone Number','Mobile'] ],
  226.         [ 'phone_ext'        => ['Phone Ext', 'Phone Ext.'] ],
  227.         [ 'fax'            => ['Fax', 'FAX', 'Facsimile Number'] ],
  228.         [ 'fax_ext'        => ['Fax Ext', 'FAX Ext.'] ]
  229.         ];
  230.         $contactInfoKeywords = [
  231.         [ 'admin'        => ['Admin', 'Administrative', 'Administrative Contact'] ],
  232.         [ 'registrant'    => ['Registrant'] ],
  233.         [ 'tech'        => ['Tech', 'Technical', 'Technical Contact'] ],
  234.         [ 'billing'        => ['Bill', 'Billing', 'Billing Contact'] ]
  235.         ];
  236.         foreach ($contactInfoKeywords as $contactInfoKeyword){
  237.             foreach($contactInfoKeyword as $contactKey => $contactKeywords){
  238.                 foreach($contactKeywords as $contactKeyword){
  239.                     foreach ($contactInfoCategories as $contactInfoCategory){
  240.                         foreach ($contactInfoCategory as $var => $keywords){
  241.                             foreach($keywords as $keyword){
  242.                                 $toBeParseKeywords[$contactKeyword." ".$keyword] = $contactKey."_".$var;
  243.                             }
  244.                         }
  245.                     }
  246.                 }
  247.             }
  248.         }
  249.         if(array_key_exists($tld, $domainWords)){
  250.             $domainWord = $domainWords[$tld];
  251.         }else{
  252.             $domainWord = $domainWords['def'];
  253.         }
  254.        
  255.         $data = array_filter(array_map("ifWhiteSpace", $data));
  256.         $parseResult = parse($data, $domain, $domainWord, $toBeParseKeywords, true);
  257.         $needToBeSingles = ["domain", "id"];
  258.         foreach($needToBeSingles as $needToBeSingle){
  259.             if(!empty($parseResult[$needToBeSingle])){
  260.                 $parseResult[$needToBeSingle] = $parseResult[$needToBeSingle][0];
  261.             }
  262.         }
  263.         if(!empty($parseResult['domain'])){
  264.             $parseResult['domain'] = strtolower($parseResult['domain']);
  265.         }
  266.         $needToBeParsedTimeKeys = ['created', 'expires', 'updated'];
  267.         foreach($needToBeParsedTimeKeys as $needToBeParsedTimeKey){
  268.             if(!empty($parseResult[$needToBeParsedTimeKey])){
  269.                 $domainTime = $parseResult[$needToBeParsedTimeKey][0];
  270.                 //if ( (date_parse($domainTime)['warning_count'] == 0) && (date_parse($domainTime)['error_count'] == 0) ) {
  271.                 if (date_parse($domainTime)['error_count'] == 0) {
  272.                     $parsed_date = date_parse($domainTime);
  273.                     $parseResult[$needToBeParsedTimeKey."_parsed"] = $parsed_date;
  274.                     $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']));
  275.                     $parseResult[$needToBeParsedTimeKey."_parsed_string"] = $date_string;
  276.                 }else{
  277.                     $formatedTime = $domainTime;
  278.                     $formatedTime = str_replace("T", " ", $formatedTime);
  279.                     $formatedTime = str_replace("Z", " ", $formatedTime);
  280.                     $formatedTime = trim($formatedTime);
  281.                     $parsed_date = date_parse_from_format("Y-m-d H:i:s.u", $formatedTime);
  282.                     $parseResult[$needToBeParsedTimeKey."_parsed"] = $parsed_date;
  283.                     $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']));
  284.                     $parseResult[$needToBeParsedTimeKey."_parsed_string"] = $date_string;
  285.                 }
  286.             }
  287.         }
  288.         foreach($parseResult as $eachParseResultKey => $eachParseResult){
  289.             if (substr($eachParseResultKey, 0, 6) == "admin_") {
  290.                 unset($parseResult[$eachParseResultKey]);
  291.                 $key = substr($eachParseResultKey, 6);
  292.                 if($key != "address"){
  293.                     $eachParseResult = $eachParseResult[0];
  294.                 }
  295.                 $parseResult['admin'][$key] = $eachParseResult;
  296.             }
  297.             if (substr($eachParseResultKey, 0, 11) == "registrant_") {
  298.                 unset($parseResult[$eachParseResultKey]);
  299.                 $key = substr($eachParseResultKey, 11);
  300.                 if($key != "address"){
  301.                     $eachParseResult = $eachParseResult[0];
  302.                 }
  303.                 $parseResult['registrant'][$key] = $eachParseResult;
  304.             }
  305.             if (substr($eachParseResultKey, 0, 5) == "tech_") {
  306.                 unset($parseResult[$eachParseResultKey]);
  307.                 $key = substr($eachParseResultKey, 5);
  308.                 if($key != "address"){
  309.                     $eachParseResult = $eachParseResult[0];
  310.                 }
  311.                 $parseResult['tech'][$key] = $eachParseResult;
  312.             }
  313.             if (substr($eachParseResultKey, 0, 8) == "billing_") {
  314.                 unset($parseResult[$eachParseResultKey]);
  315.                 $key = substr($eachParseResultKey, 8);
  316.                 if($key != "address"){
  317.                     $eachParseResult = $eachParseResult[0];
  318.                 }
  319.                 $parseResult['bill'][$key] = $eachParseResult;
  320.             }
  321.         }
  322.         $needToBeLowerCasedValueFathers = ['registrant', 'admin', 'tech', 'billing'];
  323.         foreach($needToBeLowerCasedValueFathers as $needToBeLowerCasedValueFather){
  324.             if(!empty($parseResult[$needToBeLowerCasedValueFather])){
  325.                 $needToBeLowerCasedValue = $parseResult[$needToBeLowerCasedValueFather]['email'];
  326.                 if(!empty($needToBeLowerCasedValue)){
  327.                     $parseResult[$needToBeLowerCasedValueFather]['email'] = strtolower($parseResult[$needToBeLowerCasedValueFather]['email']);
  328.                 }
  329.             }
  330.         }
  331.         $needToAddCompletelyAddressArrays = ['registrant', 'admin', 'tech', 'billing'];
  332.         foreach($needToAddCompletelyAddressArrays as $needToAddCompletelyAddressArray){
  333.             if(!empty($parseResult[$needToAddCompletelyAddressArray])){
  334.                 if(!empty($parseResult[$needToAddCompletelyAddressArray]["address"])){
  335.                     $parseResult[$needToAddCompletelyAddressArray]["completely_address"] = implode(", ", $parseResult[$needToAddCompletelyAddressArray]["address"]);
  336.                     /* WILL CITY & COUNTRY WILL BE INCLUDE IN FULL ADDRESS? */
  337.                     $allExtraInfomations = ["city", "country"];
  338.                      foreach($allExtraInfomations as $extraInfomation){
  339.                      if(!empty($parseResult[$needToAddCompletelyAddressArray][$extraInfomation])){
  340.                      $parseResult[$needToAddCompletelyAddressArray]["completely_address"] .= ", ".$parseResult[$needToAddCompletelyAddressArray][$extraInfomation];
  341.                      }
  342.                      }
  343.                     $parseResult[$needToAddCompletelyAddressArray]["completely_address"] = ucwords(strtolower($parseResult[$needToAddCompletelyAddressArray]["completely_address"]));
  344.                 }
  345.             }
  346.         }
  347.         if(empty($parseResult)){
  348.             return ['error'=>'No data'];
  349.         }
  350.         return $parseResult;
  351.     }
  352.     function ifWhiteSpace($el){
  353.         return trim($el, " ");
  354.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement