[Petit Hack entre amis] Comment utiliser l’API DNS d’OVH pour tout savoir sur un nom de domaine

Bonjour à tous,

dns-hack-ovh

Edit :

Si vous avez des questions, ou des petits hack entre amis à faire tourner, je viens de mettre en place un petit forum dédié à cela :

http://www.hackitecte.fr

Voilà, see there soon :)

Chose promise, comme j’ai pu vous en parler dans le billet d’hier: [Exclu] L’ensemble des noms de domaines disponibles en .fr composés de 3 lettres, je vais essayer de vous expliquer le plus simplement possible comment utiliser l’API d’OVH pour avoir des informations sur un nom de domaine.

[note: Pour ceux qui ne sont pas forcément super à l'aise avec certains concepts de ce billet, j'ai mis pas mal de référence à la fin de l'article]

1. Comprendre avec les mains :


À l’époque où je faisais encore un peu de physique, j’aime bien sentir les phénomènes et que l’on me l’explique d’abord avec les mains avant de sortir tout le formalisme mathématique classique qui souvent cache la simplicité et la beauté de l’équation… Sentiment purement personnel, mais je vais essayer de procéder de la sorte dans cet humble billet… [Ça peut surprendre, mais il n'y a pas que des Geeks poilus qui passent sur ces pages !]

La première chose est de charger dans son navigateur la page suivante : https://www.ovh.com/cgi-bin/newOrder/order.cgi

Cette page, on s’en fou un peu, mais c’est pour des raisons de cookies et de session, il faut absolument la charger.

La page qui  nous intéresse vraiment est la suivante. Partons du principe que nous voulons des informations sur le domaine chrogeek.com (je sais, je suis une personne pleine d’originalité !), et bien il suffit d’ouvrir cette page la :  https://www.ovh.com/cgi-bin/newOrder/ajax-newOrderDomainChecker.pl?csid=0&domain=chrogeek.com

Génial non ! un joli petit fichier XML comme on les aime, simple et rapidement exploitable avec un peu de PHP et DOM (pour l’XML) … Voilà, le hack est là !

En fait pour trouver cette URL d’accès à l’API ovh, il suffit de fouiller un peu dans les sources de la première page, on se rend compte qu’il y a des requêtes AJAX donc l’idée est juste de récupérer le retour de la requête AJAX sans tout le ‘bordel ‘ de page HTML qui va avec…

Ce qu’il faut retenir dans la deuxième URL:

  • l’url jusqu’à .pl? , c’est une requête ajax passée ‘normalement’ via javascript
  • csid=0 , l’id de l’utilisateur, comme on a pas besoin d’être loggué, il suffit de laisser le 0 ça marche parfaitement
  • domain=chrogeek.com , c’est bien sûr sur cette information que l’on va jouer !

Voilà maintenant vous avez tout compris, on va formaliser l’affaire !

2. Y’a plus qu’à !

Y’a plus qu’à coder une classe PHP faisant le boulot d’automatisation.

Mise en garde, je vous livre mon code tel quel, il est loin d’être parfait ou optimisé, mais je pense qu’il pourrait intéresser certaine personnes, si vous avez des remarques et/ou optimisations à me suggérer, comme d’hab les commentaires sont la pour m’insulter !

Bon, comme vous l’avez vue avec les mains, il y a deux étapes fondamentales pour récupérer le fichier XML qui nous intéresse. La première est d’ouvrir la ‘véritable’ page HTML afin de charger le cookie et tout ce qui va bien. Si on ne le fait pas, on n’a pas accès à la seconde [en fait, on obtient un très joli "expired" (faites le test (sous chrome avec la navigation privée))]. Les plus attentifs auront sans doute déjà remarqué que pour récupérer le fichier XML qui nous plait, on doit (obligation) passer par une connexion HTTPS, rien de bien compliquer, mais comme c’est un peu plus lourd (et surtout relou) à mettre en place directement avec les sockets PHP5, ça m’a fait une bonne excuse pour utiliser le FrameWork Zend qui fait ça à merveille et dont la qualité de la doc est juste légendaire !

En fait, Zend est aussi et surtout ultrapratique pour la gestion des cookies. On va d’abord instancier un client Http avec gestion des cookies puis ouvrir la première page. On garde tout ça bien au chaud dans la classe et ensuite, pour toutes les requêtes suivantes, il suffit d’appeler la même classe et de directement demander la seconde page (celle XML) et Zend s’occupe en background de gérer tous les problèmes de connexion.

Cette classe est modélisée avec un modèle de singleton, non pas que je trouvais ça classe (sans jeu de mots ! [ndlr: cette phrase est presque symétrique :D ]), mais juste que dans le cas de mon script, je ne voulais pas ouvrir 10 000 sockets différents pour me connecter à la première page. D’autant plus que l’accès à cette page est ‘relativement’ long, donc il suffit d’une connexion pour initialiser la classe et les cookies puis hop on travaille toujours sur le même objet… Le modèle du singleton me semblait donc être le plus adéquat [je suis loin d'être un spécialiste en design pattern, j'ai fait la bêtise de prendre l'option réseau... ]

Dans cet exemple d’utilisation on ne peut pas voir l’intérêt du singleton, voir référence à la  fin de l’article.

Bon, passons tout de suite au code (fichier nddinfo.php ) :

 'Zend_Http_Client_Adapter_Socket',
  					 'ssltransport' => 'tls');
	private $client = null;
	private function __construct(){
		$this->setProvider();
	}
	private function __clone(){
 
	}
	private function setProvider(){                          //Connexion a la premiere page pour recupere
		$this->client =  new Zend_Http_Client();   //tout ce qui va bien
		$this->client->setConfig($this->config);
		$this->client->setCookieJar();
		$this->client->setUri("https://www.ovh.com/cgi-bin/newOrder/order.cgi"); //Premiere page
		$this->client->request();
	}
	public static function getInstance (){
        if (!(self::$_instance instanceof self))
            self::$_instance = new self();
 
        return self::$_instance;
    }
	function getXmlInfo($domain, $tld='fr'){
		$uri = $this->provider.'&domain='.$domain.'.'.$tld;
		$this->client->setUri($uri);
		$result = $this->client->request();
		$xml = $result->getBody();
		return $xml;
	}
}
?>

Pour son utilisation (fichier script.php) :

getXmlInfo($domain[0],$domain[1]));
Zend_Debug::dump($xml_data); //pratique pour les debugs
 
############################
?>

Et on obtient :

 string(466) "
    1
    domain owned by Ovh
    domain owned by Ovh
    domain owned by Ovh
no pending order for this domain
    domain name valid
 
"
  [1] => string(482) "
    1
    domain already registred
    domain not in Ovh
    this domain is transferable
no pending order for this domain
    domain name valid
 
"
  [2] => string(465) "
    1
    domain owned by Ovh
    domain owned by Ovh
    domain owned by Ovh
no pending order for this domain
    domain name valid
 
"
  [3] => string(472) "
    1
    domain already registred
    domain not in Ovh
    domain transferable
no pending order for this domain
    domain name valid
 
"
  [4] => string(462) "
    1
    domain owned by Ovh
    domain owned by Ovh
    domain owned by Ovh
no pending order for this domain
    domain name valid
 
"
  [5] => string(478) "
    1
    domain available
    domain not in Ovh
    not transferable because domain available
no pending order for this domain
    domain name valid
 
"
}
 
?>

Pour utiliser ce script, il vous faut obligatoirement le Zend Framework qui est disponible là : http://framework.zend.com/download/current/

Voilà, j’espère avoir été assez clair, si ce n’est pas le cas, n’hésitez pas à me poser des questions, mais encore une fois je suis loin d’être un spécialiste (quoi qu’il en pense ;) [cf, la ]) !

——–

Explication sur le modèle Singleton : http://www.apprendre-php.com/tutoriels/tutoriel-45-singleton-instance-unique-d-une-classe.html

Explication sur les Design Pattern : http://fr.wikipedia.org/wiki/Patron_de_conception

Les antipattern : http://fr.wikipedia.org/wiki/Antipattern

Doc sur Zend_Http : http://framework.zend.com/manual/fr/zend.http.html

Utilisation de XML avec PHP : http://eusebius.developpez.com/php5dom/

La Classe DOM de PHP5 : http://fr.php.net/dom

——–

Merveilleux week-end à tous,

Enjoy,

Jaguie

Partager et découvrir :
  • email
  • Twitter
  • PDF
  • Facebook
  • Netvibes
  • Posterous
  • Bluegger
  • Fuzz
  • Tapemoi
  • Scoopeo
  • Zataz
  • MisterWong Fr
  • Digg
  • Reddit
  • Technorati
  • Wikio
  • Wikio IT
  • Yahoo! Buzz

Billets similaires

Tags: Chrogeek, Internet, Le merveilleux monde des Geeks, PHP // 14 Commentaires »

14 Réponses pour “[Petit Hack entre amis] Comment utiliser l’API DNS d’OVH pour tout savoir sur un nom de domaine”

  1. [...] bonheur ! (ndlr, je ferais un billet demain pour vous expliquer ce petit hack c’est par là: le petit hack entre amis , /! Bon gros billet geek avec un singleton, des sockets, du HTTPS et du Zend_Http_Client [...]

  2. [...] [Petit Hack entre amis] Comment utiliser l’API DNS d’OVH pour tout savoir sur un nom de domaine …www.chrogeek.com/2009/03/petit-hack-entre-amis-comment-utili… par jaguie il y a quelques secondes [...]

  3. Slt ChroGeek,

    Code très instructif sur l’utilisation du Framework de Zend.

    N’est ce pas un peu compliqué comme méthode d’utiliser (détourner ?) un script OVH en sachant qu’il existe un paquet de scipt PHP sur le WhoIS ?

  4. @Lemoussel, bin j’ai pas trouvé une API web simple et rapide pour fournir des infos de registrat … Si tu as sous la main surtout fais moi suivre !!

  5. @jaguie, envoi moi un petit message en MP et je t’adresse ça.

  6. Article intéressant, Zend simplifie énormément le travail c’est le rêve :)

    @jaguie je suis aussi interressé par les infos de @lemoussel si tu pouvais me forwader l’info :)

    Mercii.

  7. Pas con du tout, il faudrait tester avec des mots du dictoinnaire, voir si y’en a des libre (anticonstitutionnelement est toujours libre dans toutes les extensions)
    Il y a ke 138 000 mots dans mon dictionnaire, ca pourait marcher, ca durerait juste 10 fois plus longtemps d’apres ce que j’ai compris… Non?

  8. [...] Comment utiliser l’API DNS d’OVH pour tout savoir sur un nom de domaine [...]

  9. Une version du script avec l’api de lemoussel pourrait etre interessant :)

  10. Hello.

    Il y a sans doute qqchose qui m’échappe, mais je ne vois pas trop l’intérêt de faire un « hack » compliqué (avec Zend Framework, des contraintes de cookie et du retraitement XML) et non autorisé (c un peu le principe du hack) sur des fonctions OVH… alors qu’OVH fournit gratuitement une API avec plein de commandes de gestion simples et pratiques (dont l’incontournable whois) et des exemples de code PHP !

    http://www.ovh.com/fr/produits/soapi.xml
    http://www.ovh.com/soapi/fr/

    Je vois effectivement le plaisir qu’on peut retirer de développer un hack par soi-même, mais s’il s’agit de réinventer la poudre avec un résultat moins bon (??) que l’original, ça ne vaut pas forcément le coup de se fatiguer.

    Je peux me tromper, bien sûr.
    Ceci dit, merci pour ce billet, ça a le mérite d’être didactique et technologiquement intéressant.

  11. J’ai sur le xml à la page : https://www.ovh.com/cgi-bin/newOrder/ajax-newOrderDomainChecker.pl?csid=0&domain=chrogeek.com ?

  12. The owner of the parent zone must then incorporate the DS record and re-sign the parent zone. ,

  13. ba moi sa marche pas j essaye de le faire avec soonnight car fo ke je recuper des lien et des info et sa ne marche pas quelqun peu m aider plz merci


  14. hop, je viens de mettre un petit forum en ligne. N’hésitez à poser vos question : http://www.hackitecte.fr/

    See you there :)

Laissez un commentaire