Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проверка подлинности и существование домена.


Автор: savmp 10.4.2012, 12:21
Здравствуйте!

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

Как узнать существует сайт или нет?

Типа ввёл в форму google.com нажал кнопку проверить, скрипт сработал и выдал:
такой сайт есть или нет.

Подскажите хотя бы алгоритм!

Заранее большое спасибо!

Автор: z-END 10.4.2012, 13:25
гуглим слово whois 

Автор: savmp 10.4.2012, 18:11
Цитата(z-END @ 10.4.2012,  13:25)
гуглим слово whois

После гугления я нашёл кучу скриптов... но они очень сложные для меня, и делают много лишнего.

Как сделать так, что бы скрипт делал только одну вещь.

После ввода домена в форму, нажатия на кнопку проверить
Скрипт выдавал только: свободно или занято (существует или нет).

Как это сделать подскажите...

Кроме определения занят или свободен больше ничего не нужно.

Автор: РОМАN 10.4.2012, 18:13
exec('whois ya.ru', $ret);
print_r($ret);

p.s. sudo apt-get install whois

Автор: savmp 10.4.2012, 18:18
Цитата(РОМАN @ 10.4.2012,  18:13)
exec('whois ya.ru', $ret);
print_r($ret);

p.s. sudo apt-get install whois

???

Это очень сложно для меня.
Если тебе не трудно поясни...

Автор: РОМАN 10.4.2012, 18:33
p.s. sudo apt-get install whois - установить утилиту whois (k/ubuntu), как сделать для других систем глянь где нить, собрать из исходов или rpm или может вообще у тебя винда, или может уже есть на твоем серваке smile

exec('whois ya.ru', $ret); - исполняешь команду, забираешь результат в массив $ret (кст, есть и другие способы это сделать)

Автор: savmp 10.4.2012, 18:39
Цитата(РОМАN @ 10.4.2012,  18:33)
p.s. sudo apt-get install whois - установить утилиту whois (k/ubuntu), как сделать для других систем глянь где нить, собрать из исходов или rpm или может вообще у тебя винда, или может уже есть на твоем серваке smile

exec('whois ya.ru', $ret); - исполняешь команду, забираешь результат в массив $ret (кст, есть и другие способы это сделать)

А как узнать  есть у меня такая утила или нет?

Автор: РОМАN 10.4.2012, 18:43
В консоле набери команду whois если ответит простыней параметров, значит есть. Если windows, то не знаю, но думаю что то подобное

Автор: savmp 10.4.2012, 18:46
Цитата(РОМАN @ 10.4.2012,  18:43)
В консоле набери команду whois если ответит простыней параметров, значит есть. Если windows, то не знаю, но думаю что то подобное

Блин... я не знаю как консоль на хостинге включить...

А вообще то, что ты предлагаешь это на хостинге работает?

Автор: РОМАN 10.4.2012, 18:53
Для этого тебе нужен ssh доступ к хосту, в услугу хостинга как правило входит, или выдается позже по запросу


Автор: Evghenusi 10.4.2012, 19:02
savmp, http://htmlweb.ru/php/example/whois.php

Автор: Gold Dragon 10.4.2012, 21:30
Класс whois.php
Код

<?php
// Copyright (c) by PWS.RU
// http://scripts.pws.ru/whois/
// Использование:
// $domain      = "somedomain.com";
// $whois       = new whois;
// $whois->zonelookup($domain);
//
// $whois->FOUND показывает найдена запись или нет
// $whois->ERROR признак возникновения ошибки.
//
// Устанавливает переменные
// $whois->ORGANIZATION
// $whois->ORG_HANDLE
// $whois->DOMAIN_NAME
// $whois->TECH
// $whois->ADMIN

// Устанавливает массивы
// $whois->DNS_NAME
// $whois->DNS_IP


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; // устанавливается в 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; // массив: "name", "nic" и "email"
    var $TECH; // массив: "name", "nic" и "email"
    var $ZONE; // массив: "name", "nic" и "email"
    var $BILLING;
    var $UPDATED;
    var $CREATED;
    var $DNS_NAME = array(); // массив с именами DNS серверов
    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",
        "gov"     => "whois.nic.gov",
        "aero"    => "whois.information.aero",
        "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",
        "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"      => "estia.ics.forth.gr",
        "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",
        "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",
        "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",
        "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"){
            preg_match("#.+\.(.+)\.{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(preg_match("#No match for#", $array[$i]) || preg_match("#Not found#", $array[$i]) || preg_match("#No entries found for#", $array[$i])){
                    $this->FOUND = 0;
                    break;
                }
                if(preg_match("#WHOIS database is down#", $array[$i]) || preg_match("#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;
                //Извлекаем настройки DNS
                if(preg_match("#NAME SERVER#", $str) || preg_match("#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");
    }
}


как использовать
Код

<?
set_time_limit(0);
require_once("whois.php");
?>
<html>
<head>
<title>скрипт проверки занятости домена - пример использования</title>
</head>
<body>
<form method="post">
Домен: <input type="text" name="domain"><br>
<input type="checkbox" name="TLD[]" value=".ru" id="l1"><label for="l1">.RU</label><br>
<input type="checkbox" name="TLD[]" value=".info" id="l2"><label for="l2">.INFO</label><br>
<input type="checkbox" name="TLD[]" value=".org" id="l3"><label for="l3">.ORG</label><br>
<input type="checkbox" name="TLD[]" value=".com" id="l4"><label for="l4">.COM</label><br>
<input type="submit" value="Проверить">
</form>
<hr>
<?
if(isset($_POST["domain"]) && strlen($_POST["domain"])>0 && isset($_POST["TLD"]) && is_array($_POST["TLD"]))
{
 $target=$_POST["domain"];
 $whois=new whois();
 foreach($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>");
 }
}


источник http://www.cyberforum.ru/php-beginners/thread365209.html

Автор: Evghenusi 10.4.2012, 21:53
Gold Dragon, и я сегодня эту страницу встречал, но автору нужно как можно проще......хотя может и подойдёт, я когда-то тремя-четырьмя строчками обошёл, но только в одной доменной зоне проверял.

Автор: РОМАN 10.4.2012, 22:00
Автору (не в обиду savmp) нужно читать теорию. Серьезно, savmp, это не сложная задача, потрать месяц хотябы на икспу, все станет легче. Потом с лихвой окупится smile

Автор: Gold Dragon 10.4.2012, 22:01
куда проще? smile
Реализация то простая

Автор: РОМАN 10.4.2012, 22:09
да это понятно, но ты прочитай переписку smile Парень хочет но не может реальне

Автор: Evghenusi 10.4.2012, 22:10
Цитата(Gold Dragon @  10.4.2012,  22:01 Найти цитируемый пост)
куда проще?

Код

if($fp=@fsockopen('whois.ripn.net', 43, &$errno, &$errstr, 30))
{
    fputs($fp, "mail.ru\r\n");
    while(!feof($fp)){ $str[]=fgets($fp,128); }
    fclose($fp);
}

через print_r позырить что собралось в массиве и из нужного элемента выковырять данные регуляркой или пальцем  smile , по мне так это проще

Автор: РОМАN 10.4.2012, 22:20
smile)
слуш, вот завтра он зайдет сюда и спросит, а что такое:
- @fsockopen и почему собачка?
- &$errno и почему здесь &
- fgets($fp,128) и почему здесь 128
smile
Читать ему надо, кмк

Автор: Evghenusi 10.4.2012, 22:51
Цитата(РОМАN @  10.4.2012,  22:20 Найти цитируемый пост)
почему собачка?

собака бывает кусачей, только от жизни собачей......в моём примере она тоже не от хорошей жизни  smile , почему-то я воспользовался оператором управления ошибками (строчки нашёл в закромах), хотя знаю что это зло.

Добавлено через 2 минуты и 50 секунд
может потому что порой без доступа к тырнэту сайт на локалке запускал, и псюня мне показалась хорошим временный решение.

Автор: Aliance 11.4.2012, 09:40
На сколько я знаю в php начиная с кажется 5.3 переменные автоматом передаются по ссылке, так что амперсанд особо не нужен-то.

Автор: savmp 11.4.2012, 13:11
Цитата(Evghenusi @ 10.4.2012,  22:10)
Цитата(Gold Dragon @  10.4.2012,  22:01 Найти цитируемый пост)
куда проще?

Код

if($fp=@fsockopen('whois.ripn.net', 43, &$errno, &$errstr, 30))
{
    fputs($fp, "mail.ru\r\n");
    while(!feof($fp)){ $str[]=fgets($fp,128); }
    fclose($fp);
}

через print_r позырить что собралось в массиве и из нужного элемента выковырять данные регуляркой или пальцем  smile , по мне так это проще

Спасибо тебе большое! Это именно то, что я искал... маленький и простой код который вытаскивает всё, что мне нужно.

Кстати хочу спросить у тебя совет.

У меня есть список сайтов в текстовом документе, их там примерно 200 сайтов.
Если я сделаю проверку в цикле...

То есть сработает цикл который будет проверять доменные имена.
если домен существует, то проверяй следующий, если домена нет то запиши в БД его.

Так вот ЭТА программка справиться с большой скоростью проверки в цикле?

Спасибо заранее.

Автор: Evghenusi 11.4.2012, 18:10
Цитата(savmp @  11.4.2012,  13:11 Найти цитируемый пост)
Кстати хочу спросить у тебя совет.

если обращаешься ко мне, то наверно мимо.

я понятия не имею, я приверженец 30 секунд, лимит на выполнение скрипта никогда не изменяю, хотя недавно парсил документы и дабы ненароком не упереться в лимит, я собрал скрипт на аяксе, но не знаю насколько это хорошее решение, и не знаю в каких условия у тебя будет парсить список.

Всё что могу посоветовать, это убрать собачку. (если что, есть - try… catch)

Автор: maximkou 11.4.2012, 19:30
Код

$sites = file("Название файла с адресами, каждый адрес на новой строке");
set_time_limit(count($sites)*5);  // предположим что на обработку одного сайта уйдет 5 секунд
for ($i = 0; $i < count($sites), $i++)
{
       if($fp=@fsockopen('whois.ripn.net', 43, &$errno, &$errstr, 30))
      {
           fputs($fp, "mail.ru\r\n");
           while(!feof($fp)){ $str[]=fgets($fp,128); }
           fclose($fp);
      }
}

И все путем. Если адресов меньше 100 вполне должен успеть и без изменения таймаута.

Автор: savmp 12.4.2012, 19:54
Цитата(maximkou @ 11.4.2012,  19:30)
Код

$sites = file("Название файла с адресами, каждый адрес на новой строке");
set_time_limit(count($sites)*5);  // предположим что на обработку одного сайта уйдет 5 секунд
for ($i = 0; $i < count($sites), $i++)
{
       if($fp=@fsockopen('whois.ripn.net', 43, &$errno, &$errstr, 30))
      {
           fputs($fp, "mail.ru\r\n");
           while(!feof($fp)){ $str[]=fgets($fp,128); }
           fclose($fp);
      }
}

И все путем. Если адресов меньше 100 вполне должен успеть и без изменения таймаута.

Подскажите почему у меня не получается такое:

Код

    $A = "No entries found for the selected source(s).";

    if ($str[5] == $A)
    {

echo "НЕ ЗАНЯТ";

    }


При условии, что проверяемый домен не занят.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)