J'utilisais une petite classe FreeboxClient.php pour controller ma freebox depuis le WEB.
Cependant depuis le 27 Juin il y a eu une nouvelle mise à jour de la freebox server, avec enfin une vrai API comme il se doit.
Etant donné que l'ancienne class ne marchait plus, j'ai du coder un remplacement, ci-joint le code
<?php
class FreeboxApp {
private $url;
private $box;
private $id='fr.freebox.unknown';
private $token=null;
private $sessionToken=null;
public $debug=false;
function __construct($appId, $token, $url="http://mafreebox.free.fr") {
$this->url=$url;
$this->id=$appId;
$this->token=$token;
$this->sessionToken=null;
$this->version();
}
function version() {
$path="api_version";
$content=file_get_contents("$this->url/$path");
return $this->box=json_decode($content);
}
function call($api_url,$params=array(), $method=null) {
if (!$method)
$method=(!$params)?'GET':'POST';
$rurl=$this->url.$this->box->api_base_url.'v'.intval($this->box->api_version).'/'.$api_url;
if ($this->debug)
echo "\n<hr/><b>$method to $rurl (".print_r($params,true).")]</b><br>\n";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $rurl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
if ($method=="POST") {
curl_setopt($ch, CURLOPT_POST, true);
} elseif ($method=="DELETE") {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
} elseif ($method=="PUT") {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
}
if ($params)
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
if ($this->sessionToken)
curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Fbx-App-Auth: $this->sessionToken"));
$content = curl_exec($ch);
curl_close($ch);
$r=json_decode($content);
if ($this->debug)
echo "Result:<br/><pre>".print_r($r,true)."</pre><hr/>";
return $r;
}
function authorize($name, $version, $device) {
$r=$this->call("login/authorize", array(
'app_id'=>$this->id,
'app_name'=>$name,
'app_version' => $version,
'device_name' => $device
));
if ($r->success)
$this->token=$r->result->app_token;
return $r;
}
function login() {
$rc=$this->call("login");
$c=$rc->result->challenge;
$password = hash_hmac('sha1', $c, $this->token);
$r=$this->call("login/session",
array('app_id' => $this->id,
'password' => $password));
if ($r->success)
$this->sessionToken=$r->result->session_token;
return $r;
}
}
?>
Alors à la difference de l'ancienne methode qui consistait à un appel de fichier .cgi, cette API se base sur du JSON.
Il y a un nouveau concept aussi, celui de l'application.
En gros, on demande une authorization d'une application defini par un identifiant unique (dans le code qui suit "net.aissam.test1";
<?php
require_once('FreeboxApp.class.php');
$fa=new FreeboxApp("net.aissam.test1","");
$fa->debug=true;
$r=$fa->authorize("Appli de test","0.1","mon computer");
print "La demande d'enregistrement est au numero ".$r->result->track_id;
print "\n<br/>Le token de l'application a sauvegarder est : <b>".$r->result->app_token."</b>";
print "\n<br/>Veuillez valider l'application en appuyant sur la fleche droite sur votre Freebox Server";
on peut suivre l'etat de la validation de l'application en appelant l'url :
http://mafreebox.free.fr/api/v1/login/authorize/<numero track id>
les status possibles sont
- "pending" en attente de validation (courez vite à votre freebox pour valider l'application :)
- "granted" pour une application accepté
- "denied" pour une application refusé
- "tmeout" si vous n'avez pas couru assez vite pour valider l'application :p
- "unknown" numero track_id inconnue
une fois donc votre application validé, il ne vous reste plus qu'a faire les appels
<?php
require_once('FreeboxApp.class.php');
$fa=new FreeboxApp('net.aissam.test1',"le token recuperé lors de l'authorize");
// on s'authentifier et on ouvre une session d'application
$r=$fa->login();
if ($r->success) {
// authentification reussi, on appel une appi
$r=$fa->call('fs/ls/');
if ($r->success)
foreach ($r->result as $file)
if (!$file->hidden) echo "\n <br/> * ".$file->name;
}
La methode call accepte comme parametre
- le chemin de l'api (bien faire attention au slash à la fin s'il existe), L'API est disponible dans l'aide et à la page du sdk : dev.freebox.fr/sdk/
- les parametres de l'appel (optionnel)
- la methode à utiliser (optionnel). Par défaut GET s'il n'y a pas de parametres, POST s'il y en a.
Si jamais vous avez un soucis, vous pouvez utiliser le mode debug en mettant l'attribut debug à true (dans les scripts precendents $fa->debug=true);
La liste des application est disponible dans l'interface d'administration : mafreebox.fr/ dans "Paramètres de la Freebox" et "Gestion des accès".
En double clickant sur l'application on accède aux autroisations fournis à l'application, Si votre application change des parametres de configuration (par exemple la redirection des ports), il faudra cocher l'autorisation : "Modification des réglages de la Freebox".
Voila, amusez-vous bien :)
|