Skip to content

Instantly share code, notes, and snippets.

@dandelionmood
Created May 2, 2012 20:04
Show Gist options
  • Save dandelionmood/2579869 to your computer and use it in GitHub Desktop.
Save dandelionmood/2579869 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 );
@mqu
Copy link

mqu commented Jan 31, 2013

merci pour ce code. Ca m'a bien servi pour récupérer les graph RRD. J'ai mis en place un dépot GITHUB avec une API assez complète pour langage PHP + Ruby : https://github.com/mqu/mafreebox ; y'a plus qu'à coder. A vos claviers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment