WhoisDomainQuery

raspi 06.08.06 20:45

Tarkistaa onko domain varattu

 Tekstiversio  Arvo: 5 (5 ääntä)  Äänestä: +  -
<?php
/* Class: WhoisDomainQuery
 * Uses PEAR (pear.php.net)
 *
 * <example>
 * <code>
 * $freedomain = new WhoisDomainQuery();
 * $is_free = $freedomain->isAvailable('mureakuha.com');
 * switch ($is_free)
 * {
 *   default:
 *   case -2: echo "TLD not found."; break;
 *   case -1: echo "no dot (.) in address."; break;
 *   case 1: echo "Domain is free!; break;
 *   case 0: echo "Domain in use"; break;
 * }
 * </code>
 * </example>
 *
 * @author Pekka Järvinen
 * @copyright Pekka Järvinen
 */

class WhoisDomainQuery extends Net_Whois
{
  public $resolver;
 
  public $whoisServerList = array(
    "ac.ug" => array("wawa.eahd.or.ug", "No entries found"),
    "biz" => array("whois.biz", "Not found"),
    "com" => array("whois.crsnic.net", "No match for"),
    "co.uk" => array("whois.nic.uk", "No match"),
    "co.ug" => array("wawa.eahd.or.ug", "No entries found"),
    "net" => array("whois.crsnic.net", "No match for"),
    "org" => array(" whois.pir.org", "NOT FOUND"),
    "info" => array("whois.afilias.net", "NOT FOUND"),
    "or.ug" => array("wawa.eahd.or.ug", "No entries found"),
    "ne.ug" => array("wawa.eahd.or.ug", "No entries found"),
    "sc.ug" => array("wawa.eahd.or.ug", "No entries found"),
    "nl"        => array("whois.domain-registry.nl", "not a registered domain"),
    "ro" => array("whois.rotld.ro", "No entries found for the selected"),
    "com.au" => array("whois.ausregistry.net.au", "No data Found"),
    "ca" => array("whois.cira.ca", "AVAIL"),
    "org.uk" => array("whois.nic.uk", "No match"),
    "name" => array("whois.nic.name", "No match"),
    "us" => array("whois.nic.us", "Not Found"),
    "ws" => array("whois.website.ws", "No Match"),
    "be" => array("whois.ripe.net", "No entries"),
    "com.cn" => array("whois.cnnic.cn", "no matching record"),
    "net.cn" => array("whois.cnnic.cn", "no matching record"),
    "org.cn" => array("whois.cnnic.cn", "no matching record"),
    "no" => array("whois.norid.no", "no matches"),
    "se" => array("whois.nic-se.se", "No data found"),
    "nu" => array("whois.nic.nu", "NO MATCH for"),
    "com.tw" => array("whois.twnic.net", "No such Domain Name"),
    "net.tw" => array("whois.twnic.net", "No such Domain Name"),
    "org.tw" => array("whois.twnic.net", "No such Domain Name"),
    "cc" => array("whois.nic.cc", "No match"),
    "nl" => array("whois.domain-registry.nl", "is free"),
    "pl" => array("whois.dns.pl", "No information about"),
    "pt" => array("whois.ripe.net", "No entries found"),
    "fi" => array("whois.ficora.fi", "Domain not found")
  );
 
  public function __construct ()
  {
    $this->resolver = new Net_Whois();
  }

  public function isAvailable ($domain)
  {
    $domain = strtolower($domain);

    if (strstr($domain, '.'))
    {
      $ext = null;
      $found = false;

      foreach ($this->whoisServerList as $tld => $arr)
      {
        $re = '/\.' . preg_quote($tld) . '$/i';
        if (preg_match($re, $domain))
        {
          $found = true;
          $ext = $tld;
          break;
        }
      }

      if ($found)
      {
        $data = $this->resolver->query($domain);
        if (strstr($data, $this->whoisServerList[$ext][1]))
        {
          return 0;
        }
        else
        {
          return 1;
        }
      }
      else
      {
        return -2;
      }

    }
    else
    {
      return -1;
    }
  }

}
?>

Meitsi 21:12 6.8.06 
Ihan hyvää koodia.
editoitu: 11:45 7.8.06
d0ggie 11:39 7.8.06 
Jep, kivan näköinen. Pari asiaa tekisin ehkä itse eri tavalla (taas sarjassamme makukysymyksiä), eli noille palautuville arvoille omat constant:t ja tuon yhden if:n voisi sanoa

PHP
return strpos($data, $arr[1]) !== false
  ? WDQ_DOMAIN_NOT_AVAIL
  : WDQ_DOMAIN_AVAILABLE;
 

ja pistää tuon tuonne foreach -loopin sisään. Foreach loopin jälkeen sitten yksinkertaisesti "return WDQ_TLD_NOT_FOUND" yms. Tuohan karsisi "turhat" muuttujat $ext ja $found pois ja lisäksi $arr:lle tulisi käyttöä.

Lisäksi nuo regexp -lauseet voisi kaikki luoda valmiiksi suoraan __construct:ssa jolloin niitä ei kaikkia tarvitisi luoda aina uudelleen kun funktiota käytetään

PHP
foreach (<$whoisServerList kokonaisuudessaan> as $tdl => $arr)
  $this->whoisServerList['/\.' . preg_quote($tld) . '$/i'] = $arr; /* Mahdollisesti i -valitsin pois ja $domain:lle strtolower(), saattaa
  olla marginaalisesti nopeampi. */

 

edit: Vielä tyylikäämpihän olisi luoda tuolle oma yksityinen metodi jota kutsuttaisiin vain ensimmäisen kerran kun isAvailable -metodia kutsutaan tyyliin

PHP
private $whoisServerListBuilt;
private function buildWhoisServerList() { }

..

if (!$this->whoisServerListBuilt) $this->buildWhoisServerList()
 


Tuo -1 virhekoodi taitaa olla turha, sillä nyt aluksi voisi ihan hyvin sanoa

PHP
foreach ($this->whoisServerList as $tdl => $arr)
  if (preg_match($tdl, $domain))
  {
    <koodi>
  }

return WDQ_TDL_NOT_FOUND;
 

Mutta kuten jo totesin alussa, makuasioita ;-)
Runoltaja 15:42 7.8.06 
no näkeepä sitä pätevääkin kommentointia ;-)
pikkuveli 22:00 7.8.06 
miten tätä käytetään esim normaalissa php sivustossa? oon aika alottelija php puolella niin tahtoisin kumminkin tietää miten tämän sais käytännössä toimimaan?
ajv 12:43 8.8.06 
pikkuveli kirjoitti:
miten tätä käytetään esim normaalissa php sivustossa? oon aika alottelija php puolella niin tahtoisin kumminkin tietää miten tämän sais käytännössä toimimaan?
Siinä koodin alussa on se käyttöesimerkki.
nixe 18:56 7.11.06 
Minkä Php-version tämä vaatii ?? Ainakaan 4.0 ja 4.1 -versioilla ei suostu toimimaan
raspi 11:25 26.11.06 
vitosen vaatii.
Kirbo 17:32 23.6.08 
tää nyt futaa kyllä vähän miten sattuu; http://kirbo.homeunix.com/kirbo/whois/
Jos tuolla etsin "kirbo" niin se sanoo että varattuina on; com, net, us, name, ws, be, se

Mutta kun tarkistan; http://www.domainsearch.com/cgi-bin/Domain_Search
niin varattuina onkin vain; com, net, name

Tarkistin saman vielä linuxin "WHOIS" komennolla, ja sain sillä samat tulokset.

Muuten kyllä todella pätevä koodi, harmittaa vain ettei voi luottaa sen tuuppaamiin tuloksiin. Olisin halunnut tehdä itselleni ajax whois-lookup koodin jolla olisi domain haut olleet helpompia =P