Skip to content

Instantly share code, notes, and snippets.

@wikijm
Forked from dandelionmood/FreeboxClient.classe.php
Created January 3, 2017 08:40
Show Gist options
  • Save wikijm/aaeae119f8d2e47f3f1957b33f10e69c to your computer and use it in GitHub Desktop.
Save wikijm/aaeae119f8d2e47f3f1957b33f10e69c to your computer and use it in GitHub Desktop.
API Freebox
<?php
/**
* Classe de connexion à la Freebox.
*
* N'hésitez pas à la surclasser pour définir vos propres méthodes s'appuyant
* sur celles qui sont présentes ici.
*
* Exemple d'utilisation :
* <?php
* require('freebox_client.class.php');
* $freebox = new FreeboxClient('http://10.0.0.2', 'freebox', 'monmdp');
*
* // Listons le contenu du disque dur interne de la Freebox.
* $contenu = $freebox->interroger_api( 'fs.list', array('/Disque dur') );
*/
class FreeboxClient
{
private $url_serveur;
private $identifiant;
private $mot_de_passe;
private $cookie;
/**
* Constructeur classique
* @param string URL de votre freebox
* @param string Identifiant de connexion (saisir «freebox» par défaut)
* @param string Votre mot de passe
*/
public function __construct( $url_serveur, $identifiant, $mot_de_passe )
{
// On assigne les paramètres aux variables d'instance.
$this->uri = $url_serveur;
$this->identifiant = $identifiant;
$this->mot_de_passe = $mot_de_passe;
// Connexion automatique puis récupération du cookie.
$this->cookie = $this->recuperer_cookie();
}
/**
* Interroger l'API de la Freebox.
* @param string le nom de la méthode à appeler (ex. conn.status)
* @param array paramètres à passer
* @return mixed le retour de la méthode appelée.
*/
public function interroger_api( $methode, $parametres = array() )
{
// On détermine la page à appeler en fonction du nom de la méthode.
$page_a_appeler = explode('.', $methode);
$page_a_appeler = "{$page_a_appeler[0]}.cgi";
// Initialisation de la connexion avec CURL.
$ch = curl_init();
// En cas de problèmes, vous pouvez décommenter ces lignes
//curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_URL, $this->uri.'/'.$page_a_appeler);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
// On passe le cookie à la requête, c'est important.
curl_setopt($ch, CURLOPT_COOKIE, 'FBXSID='.$this->cookie);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json'
));
// On respecte le formalisme JSON/RPC
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
'jsonrpc' => '2.0',
'method' => $methode,
'params' => $parametres
)));
$retour_curl = curl_exec($ch);
curl_close($ch);
// On essaye de décoder le retour JSON.
$retour_json = json_decode( $retour_curl, true );
// Gestion minimale des erreurs.
if( $retour_json === false )
throw new Exception("Erreur dans le retour JSON !");
if( isset($retour_json['error']) )
throw new Exception( json_encode($retour_json) );
// Ce qui nous intéresse est dans l'index «result»
return $retour_json['result'];
}
/**
* Récupération du cookie de session.
* @return l'identifiant de la session.
*/
private function recuperer_cookie( )
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->uri.'/login.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// On doit lire le header pour récupérer le cookie, il va donc nous
// falloir le retourner.
curl_setopt($ch, CURLOPT_HEADER, 1);
// On se connecte via ces deux paramètres.
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'login' => $this->identifiant,
'passwd' => $this->mot_de_passe
));
$r = curl_exec($ch);
curl_close($ch);
// Récupération du cookie dans les entêtes à l'aide d'une expression
// régulière.
$ptn = '/FBXSID=\"([^"]*)/';
preg_match($ptn, $r, $matches);
// En cas de problème, on jette une exception.
if( count($matches) != 2 )
throw new Exception("Pas de cookie retourné !");
// On retourne l'identifiant de la session.
return $matches[1];
}
}
<?php
// Inclusion de la classe FreeboxClient
require('FreeboxClient.classe.php');
// Connectez-vous en utilisant vos identifiants (le login est freebox par défaut).
$freebox = new FreeboxClient('http://mafreebox.fr', 'freebox', 'monmdp');
// Listons maintenant le contenu du disque dur interne de la Freebox.
$contenu = $freebox->interroger_api( 'fs.list', array('/Disque dur') );
print_r( $contenu );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment