код для проверки домена на занятость?

olegalimov

Новичок
Здравствуйте, помогите найти или собрать один полный код для проверки домена на
занятость? мне нужно такой вид http://joomla-master.org/proverit-domen.html
по зонам .ru .su .com .net .org .biz .info .name .asia .bz .cc .in .me .mn .mobi .tv
.us .ws .tel .kz .РФ
С уважением к вам Олег.
webvm.ru
 
Код там элементраный,
PHP:
ecex('whois -h [WHOIS_SERVER] [DOMAIN_NAME]');
Потом проверяешь, что вернул whois сервер.
Только нужно собрать базу whois серверов и какие ответы они отдают когда домен не зарегистрирован. (Они на разных серверах разные)
 
Код там элементраный,
PHP:
ecex('whois -h [WHOIS_SERVER] [DOMAIN_NAME]');
Потом проверяешь, что вернул whois сервер.
Только нужно собрать базу whois серверов и какие ответы они отдают когда домен не зарегистрирован. (Они на разных серверах разные)
Писал лет 7 назад:

PHP:
root@linux-debian-1:/var/www/dns.web.local/httpdocs# cat domains.expired.php
<?php
error_reporting(E_ALL);
ini_set("error_reporting", "on");
set_time_limit(60*60);

require_once("lib/whois.php");
require_once("lib/ispmanager.php");
require_once("lib/idna/idna_convert.class.php");

$idna = new idna_convert();
$whois = new whois();
$ispmanagerS001 = new ispmanager("serv001", "dnsreadonlyuser", "qwerty");
$ispmanagerS002 = new ispmanager("serv002", "dnsreadonlyuser", "qwerty");

$s001Domains = $ispmanagerS001->getDomains();
$s002Domains = $ispmanagerS002->getDomains();

$allDomains = array_merge($s001Domains, $s002Domains);

echo "<pre>";

//var_dump($whois->getExpiredDate("www.ru"));

//EXIT();

foreach ($allDomains as $domain) {
  
    if (preg_match("/in-addr.arpa$/i", $domain)) {
        continue;
      
    }
  
    flush();
  
  
    $fname = "tmp/{$domain}.txt";
  
    if (file_exists($fname) && filemtime($fname) > time()-60*60*24) {
        $expired = file_get_contents($fname);
        //echo "[Expired get's from file!]";
    } else {
        $expired = $whois->getExpiredDate($idna->encode($domain));
        if ($expired) {
            file_put_contents($fname, $expired);
        }
    }
  
  
    if ($expired === false) {
        echo "Domain: {$domain} expired: <font color=\"red\">failed</font> get data\n";
    } else {
        echo ((($expired-time())/60/60/24) <= 30 ? "<font color=\"red\"><b>" : "")."Domain: {$domain} expired: ".date("d/m/Y", $expired)." ".(int)(($expired-time())/60/60/24)." days left ".((($expired-time())/60/60/24) < 30 ? "NEED PROLONG</b></font>" : "")."\n";
    }
  
    flush();
    ob_flush();
}

?>
lib/whois.php
<?php
class whois {
    private $servers = array(
            "ru" => "whois.ripn.net",
            "su" => "whois.ripn.net",
            "xn--p1ai" => "whois.ripn.net",
            "mobi" => "whois.dotmobiregistry.net",
            "tv" => "tvwhois.verisign-grs.com",
            "com" => "whois.verisign-grs.com",
            "net" => "whois.verisign-grs.com",
            "org" => "whois.pir.org",
            "biz" => "whois.biz",
            "info" => "whois.afilias.net"
    );
      
      
    public function getExpiredDate($domainName) {

        if (!preg_match("/^(?:[a-z0-9\\.\\-]+\\.)?([a-z0-9\\-]+\\.([a-z]+|xn\\-\\-p1ai))$/i", trim($domainName), $match)) {
            return false;
        }


        $whoisInformation = $this->getWhoisInformartion(strtolower($match[1]), strtolower($match[2]));



        if ($whoisInformation === false || $whoisInformation === null) {
            return false;
        }

        return  $this->findDate($whoisInformation);



    }

    private function getWhoisInformartion($domain, $tld) {
        if (!isset($this->servers[$tld])) {
            return false;
        }

        sleep(3);

        try {
              
            $errno = $errstr = null;
              
            $fp = fsockopen($this->servers[$tld], 43, $errno, $errstr, 30);
              
            if (!$fp) {
                throw new Exception("Can't connect to socket [$errno] [$errstr]");
            }
              
            fwrite($fp, $domain."\n\r");
              
            $data = null;
              
            while (!feof($fp)) {
                $data .= fgets($fp, 512);
            }
              
            if ($data === null) {
                throw new Exception("Can't read data from server");
            }
              
            fclose($fp);
              
            return $data;
              
              
        } catch (Exception $e) {
            fclose($fp);
            //echo $e->getMessage();
            return false;
        }

    }

    private function findDate($data) {
        $date = false;

        //var_dump($data);

        if (preg_match("/Expiration\sDate:\s*(([0-9]+)\-([a-z]+)-([0-9]+))/i", $data, $match)) {
            $date = strtotime($match[1]);
        }

        if (preg_match("/Paid-till:\s*([0-9\.]+)/i", $data, $match)) {
            $date = strtotime(str_replace(".", "-", $match[1]));
        }

        if (preg_match("/Domain\s*Expiration\s*Date:\s*\t*([^\n\r]+)/i", $data, $match)) {
            $date = strtotime($match[1]);
        }


        //var_dump($date);

        return $date;

    }
}
?>

root@linux-debian-1:/var/www/dns.web.local/httpdocs# cat lib/ispmanager.php
<?php
class ispmanager {
    private $server = false;
    private $protocol = "https";
    private $suUser = false;
    private $suPassword = false;

  
    function __construct($server, $suUser, $suPassword) {
        //$ispmanagerDomainFuncXmlUrl = "https://serv001/manager/ispmgr?authinfo=root:qwerty&out=xml&func=domain";
        $this->server = $server;
        $this->suUser = $suUser;
        $this->suPassword = $suPassword;
    }
  
    public function setProtocol($protocol) {
        if ($protocol !== "http" && $protocol !== "https") {
            throw new Exception("Protocol set failed. Bad protocol specified");
        }
      
        $this->protocol = $protocol;
    }
  
    public function getDomains() {
        return $this->_getXmlFromDNSServer("{$this->protocol}://{$this->server}/manager/ispmgr?authinfo={$this->suUser}:{$this->suPassword}&out=xml&func=domain");
    }

    protected function _getXmlFromDNSServer($ispmanagerFunctionUrl) {
        $curlObject = curl_init($ispmanagerFunctionUrl);
        curl_setopt($curlObject, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curlObject, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curlObject, CURLOPT_HEADER, false);
        curl_setopt($curlObject, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($curlObject);
      
        if ($data === false) {
            throw new Exception("Error: can't get data from remote server", -1);
        }
  
        $xml = simplexml_load_string($data);
        $data = (array)$xml->xpath("/doc/elem/name");
  
        $return = arfray();
        foreach ($data as $name) {
            $return[] = (string)$name;
        }
        return $return;
    }
}

lib/idna/idna_convert.class.php
 
Спасибо за быстрый ответ. Мне нужен один код с html формой для joomlы

Я переделал один код, но рф зону не ищет?

В чем моя ошибка?
PHP:
<?php
class whois {

var $port = 43;
var $MAXLEN = 1024;


var $QUERY_TYPE = "domain";
var $DEFAULT_SERVER = "whois.crsnic.net";

var $MAX_RETRIES = 3;
var $SLEEP_VAL = 1;
var $RETRY = 0;

var $FOUND = 0;
var $ERROR = 0;
var $DATA_MIN = 8;

var $DATA_COUNT = 0;

var $ORGANIZATION;
var $ORG_HANDLE;
var $ORG_ADDRESS;
var $DOMAIN_NAME;
var $DOMAIN_STATUS;
var $ADMIN;
var $TECH;
var $ZONE;
var $BILLING;
var $UPDATED;
var $CREATED;
var $DNS_NAME=array();
var $HANDLES;

var $IP="";
var $SERVER = array(
"com"=>"whois.crsnic.net",
"net"=>"whois.crsnic.net",
"edu"=>"whois.educause.net",
"org"=>"whois.publicinterestregistry.net",
"arpa"=>"whois.arin.net",
"ripe"=>"whois.ripe.net",
"mil"=>"whois.nic.mil",
"coop"=>"whois.nic.coop",
"museum"=>"whois.museum",
"biz"=>"whois.neulevel.biz",
"info"=>"whois.afilias.net",
"name"=>"whois.nic.name",
"me"=>"whois.nic.me",
"mn"=>"whois.nic.mn",
"mobi"=>"whois.dotmobiregistry.net",
"gov"=>"whois.nic.gov",
"aero"=>"whois.information.aero",
"asia"=>"whois.nic.asia",
"ns"=>"whois.internic.net",
"ip"=>"whois.ripe.net",
"ad"=>"whois.ripe.net",
"al"=>"whois.ripe.net",
"am"=>"whois.ripe.net",
"as"=>"whois.gdns.net",
"at"=>"whois.nic.at",
"au"=>"box2.aunic.net",
"az"=>"whois.ripe.net",
"ba"=>"whois.ripe.net",
"be"=>"whois.dns.be",
"bg"=>"whois.ripe.net",
"br"=>"whois.nic.br",
"by"=>"whois.ripe.net",
"bz"=>"whois2.afilias-grs.net",
"ca"=>"eider.cira.ca",
"cc"=>"whois.nic.cc",
"ch"=>"domex.switch.ch",
"ck"=>"whois.ck-nic.org.ck",
"cl"=>"nic.cl",
"cn"=>"whois.cnnic.net.cn",
"cx"=>"whois.nic.cx",
"cy"=>"whois.ripe.net",
"cz"=>"dc1.eunet.cz",
"de"=>"whois.denic.de",
"dk"=>"whois.dk-hostmaster.dk",
"do"=>"ns.nic.do",
"dz"=>"whois.ripe.net",
"ee"=>"whois.ripe.net",
"eg"=>"whois.ripe.net",
"es"=>"whois.ripe.net",
"fi"=>"whois.ripe.net",
"fo"=>"whois.ripe.net",
"fr"=>"winter.nic.fr",
"ga"=>"whois.ripe.net",
"gb"=>"whois.ripe.net",
"ge"=>"whois.ripe.net",
"gl"=>"whois.ripe.net",
"gm"=>"whois.ripe.net",
"gr"=>"whois.ripe.net",
"gs"=>"whois.adamsnames.tc",
"hk"=>"whois.hkdnr.net.hk",
"hr"=>"whois.ripe.net",
"hu"=>"whois.nic.hu",
"id"=>"muara.idnic.net.id",
"ie"=>"whois.domainregistry.ie",
"il"=>"whois.isoc.org.il",
"in"=>"whois.ncst.ernet.in",
"is"=>"horus.isnic.is",
"it"=>"whois.nic.it",
"jo"=>"whois.ripe.net",
"jp"=>"whois.nic.ad.jp",
"kg"=>"whois.domain.kg",
"kh"=>"whois.nic.net.kh",
"kr"=>"whois.krnic.net",
"kz"=>"whois.nic.kz",
"la"=>"whois.nic.la",
"li"=>"domex.switch.ch",
"lk"=>"arisen.nic.lk",
"lt"=>"ns.litnet.lt",
"lu"=>"whois.dns.lu",
"lv"=>"whois.ripe.net",
"ma"=>"whois.ripe.net",
"mc"=>"whois.ripe.net",
"md"=>"whois.ripe.net",
"mm"=>"whois.nic.mm",
"ms"=>"whois.adamsnames.tc",
"mt"=>"whois.ripe.net",
"mx"=>"whois.nic.mx",
"nl"=>"whois.domain-registry.nl",
"no"=>"ask.norid.no",
"nu"=>"whois.worldnames.net",
"nz"=>"akl-iis.domainz.net.nz",
"pl"=>"nazgul.nask.waw.pl",
"pt"=>"whois.ripe.net",
"ro"=>"whois.rotld.ro",
"ru"=>"whois.ripn.net",
"рф"=>"whois.ripn.net",
"se"=>"ear.nic-se.se",
"sg"=>"qs.nic.net.sg",
"sh"=>"whois.nic.sh",
"si"=>"whois.arnes.si",
"sk"=>"whois.ripe.net",
"sm"=>"whois.ripe.net",
"st"=>"whois.nic.st",
"su"=>"whois.ripn.net",
"tc"=>"whois.adamsnames.tc",
"tf"=>"whois.adamsnames.tc",
"th"=>"whois.thnic.net",
"tj"=>"whois.nic.tj",
"tn"=>"whois.ripe.net",
"to"=>"whois.tonic.to",
"tr"=>"whois.ripe.net",
"tw"=>"whois.twnic.net",
"tv"=>"whois.nic.tv",
"tel"=>"whois.nic.tel",
"ua"=>"whois.net.ua",
"uk"=>"whois.nic.uk",
"us"=>"whois.nic.us",
"va"=>"whois.ripe.net",
"vg"=>"whois.adamsnames.tc",
"ws"=>"whois.worldsite.ws",
"yu"=>"whois.ripe.net",
"za"=>"apies.frd.ac.za",
"xn--p1ag"=>"ru.whois.i-dns.net",
"xn--p1ag"=>"ru.whois.i-dns.net",
"xn--j1ae"=>"whois.i-dns.net",
"xn--e1ap"=>"whois.i-dns.net",
"xn--c1av"=>"whois.i-dns.net",
"net.ru"=>"whois.ripn.net",
"org.ru"=>"whois.ripn.net",
"pp.ru"=>"whois.ripn.net",
"spb.ru"=>"whois.relcom.ru",
"msk.ru"=>"whois.relcom.ru",
"ru.net"=>"whois.relcom.ru",
"yes.ru"=>"whois.regtime.net",
"uk.com"=>"whois.centralnic.com",
"uk.net"=>"whois.centralnic.com",
"gb.com"=>"whois.centralnic.com",
"gb.net"=>"whois.centralnic.com",
"eu.com"=>"whois.centralnic.com"
);
var $TLD;
var $RAWINFO;
var $DNSINFO;
//обращение к WHOIS серверу
function connect ($server)
{
while($this->RETRY <= $this->MAX_RETRIES)
{
$ptr=fsockopen($server, $this->port);
if($ptr>0)
{
$this->ERROR=0;
return($ptr);
}else
{
$this->ERROR++;
$this->RETRY++;
sleep($this->SLEEP_VAL);
}
}
}

function rawlookup ($query)
{
$array=array();
$this->FOUND=1;
$query=strtolower(trim($query));
if(strlen($query)<=2)
{
$this->ERROR=1;
return($array);
}

$server=$this->DEFAULT_SERVER;
if($this->QUERY_TYPE=="domain")
{
ereg(".+\.(.+)\.{0,1}",$query,$backrefs);
if(isset($backrefs[1]) && strlen($backrefs[1])>0 && isset($this->SERVER[$backrefs[1]]))
{
$this->TLD=$backrefs[1];
$server=$this->SERVER[$this->TLD];
}

}
$ptr=$this->connect($server);
if($ptr)
{
$query .= "\n";
fputs($ptr, $query);
$i=0;
while(!feof($ptr))
{
$array[$i]=fgets($ptr,$this->MAXLEN);
$this->DATA_COUNT+=strlen(trim($array[$i]));
if(eregi("No match for", $array[$i]) || eregi("Not found", $array[$i]) || eregi("No entries found for", $array[$i]))
{
$this->FOUND=0;
break;
}
if(eregi("WHOIS database is down",$array[$i]) || eregi("Please wait a while and try again",$array[$i]))
{
$this->ERROR=1;
$this->FOUND=0;
break;
}
$i++;
}
fclose($ptr);
if($this->DATA_COUNT>$this->DATA_MIN && $this->ERROR==0 && $this->FOUND==1)
{
return($array);
}
}
return (array());
}


function parsezone ($array)
{
$result=array();
if(!isset($array) || !is_array($array) || count($array)<=3)
{
$this->FOUND=0;
return $result;
}
$cnt=count($array);
$rescnt=0;
$i=0;
$isinfo=true;
while($i<$cnt)
{
if(!$isinfo)
{
$str=trim($array[$i]);
$result[$rescnt]=$str;

if(eregi("NAME SERVER", $str) || eregi("NSERVER", $str))
{
$str=trim(substr($str, strpos($str, ":")+1));
if($pos=strpos($str, " "))
{
$str=substr($str, 0, $pos);
}
if(substr($str, -1)==".")
{
$str=substr($str, 0, -1);
}
$this->DNS_NAME[]=strtolower($str);
}
$rescnt++;
}
if(trim($array[$i])=="" && $isinfo)
{
$isinfo=false;
}
$i++;
}
return $result;
}

function zonelookup ($query)
{
$query=trim($query);
$this->RAWINFO=$this->rawlookup($query);
if($this->FOUND)
{
$this->RAWINFO=$this->parsezone($this->RAWINFO);
}
if($this->FOUND==0)
{
return;
}
if($this->dns_lookup($query))
{
$this->IP=gethostbyname($query);
$this->build_dns($query);
}
}

function build_dns($query)
{
$cnt=0;
// $temp=dns_get_record($query, "NS");
foreach($this->DNS_NAME AS $dns)
{
$this->DNSINFO[$cnt]="NS: ".$dns."\tinternet address = ".gethostbyname($dns);
$cnt++;
}
if(getmxrr($query, $temp))
{
foreach($temp AS $dns)
{
$this->DNSINFO[$cnt]="MX: ".$dns."\tinternet address = ".gethostbyname($dns);
$cnt++;
}
}

}
function dns_lookup($query)
{
return checkdnsrr($query,"ANY");
}


};

?><html>
<head>
<title>Проверка доменного имени</title>
</head>
<body>
<form method="post">
<form class="form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="domain">
  <table width=800px bgcolor="#2D64C3">
  <tr>
    <td  style="font-size:18px; color:#FFFFFF; font-family: Georgia, "Times New Roman", Times, serif;"
    width=195px; nowrap="nowrap">Введите имя домена:</td>
<td width=144px;><input name="domain" type="text" placeholder="Пример: yandex"/></td>
<td width=85px;><select size="1" name="TLD[]">
  <option name="TLD[]" value=".ru" >.RU</option>
  <option name="TLD[]" value=".рф">.РФ</option>
  <option name="TLD[]" value=".cc">.CC</option>
  <option name="TLD[]" value=".in">.IN</option>
  <option name="TLD[]" value=".me">.ME</option>
  <option name="TLD[]" value=".mn">.MN</option>
  <option name="TLD[]" value=".su">.SU</option>
  <option name="TLD[]" value=".ws">.WS</option>
  <option name="TLD[]" value=".tv">.TV</option>
  <option name="TLD[]" value=".kz">.KZ</option>
  <option name="TLD[]" value=".bz">.BZ</option>
  <option name="TLD[]" value=".us">.US</option>
  <option name="TLD[]" value=".com">.COM</option>
  <option name="TLD[]" value=".net">.NET</option>
  <option name="TLD[]" value=".org">.ORG</option>
  <option name="TLD[]" value=".biz">.BIZ</option>
  <option name="TLD[]" value=".tel">.TEL</option>
  <option name="TLD[]" value=".info">.INFO</option>
  <option name="TLD[]" value=".name">.NAME</option>
  <option name="TLD[]" value=".asia">.ASIA</option>
  <option name="TLD[]" value=".mobi">.MOBI</option>

</select></td>
<td  style="font-size:18px; color:#FFFFFF; font-family: Georgia, "Times New Roman", Times, serif;"
width=376px;><input type="submit" name="submitBtn" value="Проверить"/>
<?
if(isset($_POST["domain"]) && strlen($_POST["domain"])>0 && isset($_POST["TLD"]) && is_array($_POST["TLD"]))
{
$target=$_POST["domain"];
$whois=new whois();
foreach($_POST['TLD'] AS $tldz)
{
echo($target.$tldz." - ");
$whois->zonelookup($target.$tldz);
if($whois->ERROR==0)
{
if(is_array($whois->RAWINFO) && count($whois->RAWINFO)>7 && $whois->FOUND==1)
{
echo("Занят!");
}else
{
echo("Свободен!");
}
}else
{
echo("Ошибка запроса");
}
echo("<br>");
}
}
?>
</td>
</table>
</form>
</body>
</html>
</body>
</html>
 
Последнее редактирование:
Не, на этом форуме вы врятли получите готовое решение. Тут принято обсуждать решения, решать проблемы, учиться.
 
Добрые люди помогите!

Как поменять запрос на кириллицу имени домена и в зоне?
PHP:
  <option name="TLD[]" value=".xn--p1ai" >.РФ</option>
if(isset($_POST["domain"]) && strlen($_POST["domain"])>0 && isset($_POST["TLD"]) && is_array($_POST["TLD"]))
 
Активист, а зачем ручное кодирование карты? Разве нельзя это автоматизировать?
В большинстве случаев можно просто использовать сервер $zoneName.whois-servers.net, а пробить только исключения.

Стандартная команда whois так и делает.

Есть еще веселые зоны, где вообще whois-сервера по 43 порту нифига нет, и надо дергать веб-апи. :)
 
olegalimov, трабла whois в том, что ответ сервера собственно не стандартизирован. грубо в стандарте написано, что надо слушать 43 порт получать из него текст - плаин строку и отвечать тоже плаин текстом в котором около 20 возможных префиксов строк. А вот что там написано не оговорено.

Далее вхуиз не полная гарантия. Всегда есть временные лаги.
Истина для рушки и рф у РИПНа . Даже регистраторы на стадии заказа не будут делать проверку через ЕПП протокол (так как у них почасовые квоты на обращения).
И все равно пока не зарегится домен ни чего еще не известно.

Например . Чел хочет купить домен на аукционе у регистратора.
В этом случае регистратор постарается послать запрос в момент максимально близкий после освобождения его коордиоционный центром.
А другой чел у другого регистратора подгадал через партнерское апи момент так , что его запрос оказался в очереди раньше.
В результате домен достался тому кто заплатил 90 рублей , а готовый отдать Х килорублей в пролете.
 
кстати регистратор не обязан держать вхуиз на 43 поту. Достаточно http формы.
И для рунета требование, что должна быть на этой форме ссылка или описание правил пользования (по сути сколько запросов можно делать с одного ИП)
 
Сверху