[PHP] Une librairie pour la nouvelle API Freebox v6 (FreeboxOS)


[PHP] Une librairie pour la nouvelle API Freebox v6 (FreeboxOS)


Une librairie PHP pour la nouvelle API Freebox OS

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 :)

 

 


Poster un commentaire:

Nom/Name
Comment.

#. (03 Mar 2016 - 11:40)

#. (19 Jul 2014 - 09:28)

Pour la télécommande il faut utiliser les URLs encore.
Il y a un exemple ici:

http://tutoriels.domotique-store.fr/content/51/90/fr/api-de-la-freebox-tv-_-player-v5-_-v6-via-requ%C3%AAtes-http.html
#.Thomas (14 Jun 2014 - 04:04)

Impossible avec le SDK de simuler la télécommande ? uniquement orienté server ??
 1
3 commentaires