Accéder à un serveur de news via les sockets.
Publié par Sebastien Dudek il y a 3 mois
Les sockets
La manière la plus simple d'appréhender cette notion est de faire le parallèle avec la communication d'individus par courrier ou par téléphone.
Chacune des entités impliquées dans une communication doit disposer d'un point de contact : il peut s'agir d'une boite aux lettres ou d'un poste téléphonique.
Une socket n'est rien d'autre que l'équivalent dabs le système de l'un de ces objets : il s'agit donc d'un point de communication bidirectionnel par lequel un processus pourra émettre ou recevoir des informations.
Php peut utiliser les sockets sur des machines locales ou distantes. Nous allons voir comment se connecter à un serveur de news, comment lui parler, comment récupérer des articles d'un newsgroups et enfin comment poster une news. Ceci via une classe PHP.
Pour commencer juste une petite explication sur l'ouverture d'une socket.
Ouvrir une socket en PHP
Les sockets sont ouvertes via la fonction fsockopen(). Celle ci existe tant sous php4 que sous php5.
- <?php
- ?>
fsockopen() créé un flot de connexion à l'Internet ou à un domaine Unix. Via Internet, cette fonction va ouvrir une socket de connexion TCP avec l'hôte hostname sur le port port.
Pour les connexions UDP, vous devez explicitement spécifier le protocole : udp://hostname. Via un domaine Unix, hostname représente le chemin jusqu'à la socket, et port doit être mis à 0.
L'option timeout sert à donner une durée maximale à cet appel.
Network News Transfer Protocol
Pour accéder a un serveur de news usenet il faut utiliser un protocole spécifique appelé nntp (Network News Transfer Protocole).
Ce protocole est détaillé dans les RFC977 (Request For Comment number 977), qui est disponible a l'adresse suivante : [lien RFC]
Une RFC détaille le fonctionnement d'un protocole (http est aussi un protocole).
La classe NNRP
Afin de voir comment parler à un serveur nntp nous allons utiliser une classe développée par une société anglaise VH consultants (http://www.vhconsultants.com).
Description
PHP NNRP est une classe permettant de parler à un serveur nntp.
- <?php
- include ('/chemin_d_acces/class.nnrp');
- $ma_classe_nnrp = new NNRP('news.domain.com');
- $ma_classe_nnrp->Authinfo('nom_d_utilisateur','password ');
- $ma_classe_nnrp->Group('alt.test');
- $ma_classe_nnrp->Quit() ;
- ?>
Attention : Il est possible que la classe ne marche pas avec sa configuration par défaut.
Dans ce cas modifiez $Safemode dans le fichier de la classe car il est possible que la valeur par defaut vous empeche de vous connecter aux serveurs de news.
Les méthodes de la classe
Une classe dispose d'un certain panel de fonctions.
Nous allons ici présenter rapidement les principales fonctions (méthodes) de la classe NNRP.
Si vous voulez + d'infos regardez directement dans le code de la classe. Nous détaillerons un peu plus bas comment marche le constructeur de classe.
Authinfo($nom_d_utilisateur,$pass)
Renvoie vrai en cas de succès.
Nlist()
Liste tous les newsgroup. Attention cela peut prendre du temps. Renvoie un tableau associatif avec le nom du groupe (key) et la valeur ($high, $low, $mode).
Newsgroups($timestamp,$distribution)
Group($groupe)
Renvoie un tableau ($num_of_arts, $low_mark, $high_mark,$mode) en cas de succès.
Last()
Renvoie le dernier identifiant de message.
Next()
Renvoie l'identifiant du prochain message.
Article($m= '')
Renvoie un tableau ($hdr,$body) ou $hdr est un tableau associatif et $body est un tableau des lignes de l'articles.
Post($hdr, $body)
Poste au serveur de news. Renvoie vrai en cas de succès.
Quit()
Ferme la connexion au serveur.
On va se connecter à un serveur de news, afficher tous les newsgroup dispo et enfin afficher le dernier message d'un newsgroup.
- <?php
- //On inclue le ficher comprenant la classe nnrp
- include ('class.nnrp');
- //Définition du serveur de news auquel on va se connecter.
- $serveur = "news.wanadoo.fr";
- //On instancie la classe NNRP
- $ma_classe_nnrp = new NNRP($serveur) ;
- //En cas de besoin on definit le login/pass de la personne souhaitant se connecter
- //echo $ma_classe_nnrp->Authinfo("login", "pass") ;
- //On va lister les newsgroup de ce serveur de news grace à la methode Nlist():
- //On récupère un tableau associatif contenant le nom des groupes.
- $res = $ma_classe_nnrp->Nlist();
- echo "$key";
- echo "<br />";
- }
- //Maintenant on va se connecter a un newsgroup via la methode Group() :
- $res = $ma_classe_nnrp->Group('fr.comp.lang.php');
- //renvoie un tablo avec 0: , 1: messages debut, 2:messages fin, 3: nom du groupe
- echo "Article id du premier :$res[1]<br />";
- echo "Article id du second :$res[2]<br />";
- echo "Nom du news group : $res[3]<br />";
- //On va afficher le dernier article publié via la methode Article().
- $last_id = $res[2];
- $article = $ma_classe_nnrp->Article($last_id);
- //On recupère un tableau associatif qui comprend le header et le body du message.
- echo "$key <br />";
- echo "$temp<br />";
- }
- //On ferme la socket via la methode Quit()
- $ma_classe_nnrp->Quit() ;
- ?>
Conclusion
Somme toute une classe très intéressante pour attaquer un serveur de news et récupérer les infos dedans.
N'oubliez pas de modifier $Safemode dans le fichier de la classe car il est possible que la valeur par défaut vous empêche de vous connecter aux serveurs de news.
Ce serait intéressant de la développer et de créer avec un système de reader de news.