Выбрать страницу

Как обычно неделя была насыщенная, но это не помешало мне заниматься сайтом регистрации и продажи доменных имен. За неделю была произведена регистрации и подключение приема платежей. Поиск доменов пока нет, но это дело поправимое. В частности эта статья написана про поиск доменных имен. Как оказалось в интернете «Тема не раскрыта». Пришлось взять инициативу в свои руки.

iregs.ru - регистрация доменов

После анализа доступных скрипов и расширений было принято решение о написании копонента проверки занятости домена. Изучив, теоретическую часть на свет появилась реализация в виде класса «iregsWhois». Который и представляется для обсуждения. Это только подготовительный этап к написанию компонента для Joomla, но и этот код уже можно использовать в других проектах.

<?php
/**
 * Работа с whois сервисами
 *
 * Класс  создавался в рамках проекта iregs.ru (Регистрация доменных имен).
 * Для работы необходимо, чтобы у вашего хостига были открыты исходящие коннекты 
 * и доступна функция fsockopen.
 * @package		iregs.ru
 * @subpackage	whois
 * @author		Луценко Андрей,
 * @copyright	Copyright (c) 2010, Луценко Андрей
 * @license		GNU/GPL
 * @link		http://www.iregs.ru
 * @since		Version 1.0
 * @filesource
 */

 // ------------------------------------------------------------------------
 
 /**
* Класс работы с whois сервисами
*
* Класс для работы с whois сервисами, работает по протоколу whois. Обращаясь напрямую к
* whois серверам. Помимо получения whois информации, класс определяет занято или совобдно 
* доменное имя.
* Пример использования:
* 
* $whois=new iregsWhois();
* if ($whois->whoisDomain('iregs.ru')){
*	if ($whois->result==iregsWhois::IREGS_WHOIS_NOT_FOUND){
*		echo "Домен свободен.";
*	}else{
*		echo "Домен занят.";
*	}
* }
* 
* @package		iregs.ru
* @subpackage	whois
* @author		Луценко Андрей,
* @link		https://www.yousoft.ru/
*/

class iregsWhois{
	/**
	* Ошибка: Домен первого уровня не найден в списке.
	*/
	const IREGS_WHOIS_ERROR_TOP=0;
	/**
	* Ошибка: Невозможно подключиться к whois серверу.
	*/
	const IREGS_WHOIS_ERROR_CONNECT=1;
	/**
	* Ошибка: Превышен лимит обращений к серверу whois.
	*/
	const IREGS_WHOIS_ERROR_LIMIT=2;
	/**
	* Whois описание домена найдено.
	*/
	const IREGS_WHOIS_FOUND=10;
	/**
	* Whois описание домена не найдено.
	*/
	const IREGS_WHOIS_NOT_FOUND=11;

	/**
	* Ответ whois сервера.
	* 
	* @var boolean
	*/
	public $response=null;
	/**
	* Результат работы функции.
	* 
	* В переменной $result сохраняется результат выполнения функции whoisDomain, 
	* может принимать следующие значения:
	* Функция вернула true: IREGS_WHOIS_FOUND, IREGS_WHOIS_NOT_FOUND
	* Функция вернула false: IREGS_WHOIS_ERROR_TOP, IREGS_WHOIS_ERROR_CONNECT, IREGS_WHOIS_ERROR_LIMIT
	* @var integer
	*/
	public $result=null;

	/**
	* Массив доменов первого уровня
	* 
	* В массиве хранятся соответствия между доменами первого уровня и серверами, 
	* которые поддерживают эту зону. А также предусмотренно хранение любой другой информации
	* @var array 
	*/
	static $whois_top=array(
		'ru' =>array('id'=>1,  'checked'=>true, ), 
		'su'  =>array('id'=>1,  'checked'=>true, ),
	);
	/**
	* Описание серверов whois
	* 
	* В массиве хранятся:
	* server: URL whois сервера
	* response_not_found: строка содержащаяся в ответе сервера, если домен не найден
	* response_limit: строка содержащаяся в ответе сервера, превышен лмимт обращений к серверу
	* @var array 
	*/
	static $whois=array(
		1 =>array('server'=>'whois.ripn.net',
			'response_not_found'=>'No entries found for the selected source',
			'response_limit'=>'You have exceeded allowed connection rate'),
		);

	/**
	* Отправить запрос whois серверу
	* 
	* Функция по переданым $domain и $topdomain пытается получить информацию с соответствующего whois сервера.
	* В качестве результата возварщает логическое значение указывающее на успешность выполнения. 
	* Расшифровка результат доступна в переменой result. Ответ сервера содержиться в переменной response.
	* В случае вызова функции с двумя параметрами, параметр $domain должен содержать доменное имя без зоны,
	* а $topdomain - зону.
	* 
	* $whois=new iregsWhois();
	* $whois->whoisDomain('iregs.ru');
	* $whois->whoisDomain('iregs','ru');
	* 
	* @param string $domain доменое имя, если зона не указана, она должна быть передана в параметре $topdomain.
	* @param string $topdomain используемая зона.
	* @return boolean
	*/
	function whoisDomain($domain,$topdomain=''){

		if (!isset(self::$whois_top[$topdomain])){
			$topdomain=end(explode('.',$domain));
		}else{
			$domain.=".$topdomain";
		}
		if (!isset(self::$whois_top[$topdomain])){
			$this->result=self::IREGS_WHOIS_ERROR_TOP;
			return false;
		}
		$_whois=self::$whois[self::$whois_top[$topdomain]['id']];

		$con = fsockopen($_whois['server'], 43);
		if (!$con){
			$this->result=self::IREGS_WHOIS_ERROR_CONNECT;
			return false;
		}
		fputs($con, $domain."\r\n");
		$this->response = '';
		while(!feof($con)) {
			$this->response.= fgets($con,128); 
		}
		fclose($con);

		if ($this->response){
			if (strpos($this->response, $_whois['response_limit'])){
				$this->result=self::IREGS_WHOIS_ERROR_LIMIT;
				return false;
			}elseif(strpos($this->response, $_whois['response_not_found'])!==false){
				$this->result=self::IREGS_WHOIS_NOT_FOUND;
				return true;
			}else{
				$this->result=self::IREGS_WHOIS_FOUND;
				return true;
			}
		} else {
			return false; 
		}
	}
}
?>
Share This