Piloter sa freebox

Une fois n’est pas coutume, je vais blogguer en français parce que le sujet de ce billet concerne mon opérateur free.fr qui vient récemment de mettre à jour son freebox server et qui propose d’interopérer avec une API documentée sur cette page: http://dev.freebox.fr/sdk/os/

  • Etape 1: découvrir la version de l’API:
  • $FbxApi = Invoke-RestMethod -Uri http://mafreebox.freebox.fr/api_version

    Je reçois une réponse en Json m’indiquant la version de l’API

  • Etape 2: Autoriser une application
  • # Déclarer l'application            
    $AuthJson = @'
    {
       "app_id": "fr.freebox.testapp",
       "app_name": "Test App",
       "app_version": "1.0.0",
       "device_name": "Mon PC"
    }
    '@            
                
    $BaseURL = "http://mafreebox.freebox.fr$($FbxApi.api_base_url)v$([int]$FbxApi.api_version)"            
                
    # Demander l'autorisation            
    $post = Invoke-RestMethod -Uri "$BaseURL/login/authorize" -Method Post -Body $AuthJson

    A ce stade, une demande est affichée sur l’écran du Freebox server

    Il faut une validation manuelle, la flèche vers la droite signifiant ‘oui’.

  • Etape 3: traquer la progression du processus d’autorisation
  • $statusToken = Invoke-RestMethod -Uri "$BaseURL/login/authorize/$($post.result.track_id)"            
    # Requete GET pour interroger le statut            
    while ($statusToken.result.status -eq "pending") {            
     $statusToken = Invoke-RestMethod -Uri "$BaseURL/login/authorize/$($post.result.track_id)"            
     Start-Sleep -Seconds 1            
    }            
                
    if ($statusToken.result.status -eq "granted") {            
        "Bravo, application autorisée"            
        "le app_token secret à conserver est: {0}" -f $post.result.app_token            
    } else {            
        "Echec: résultat du processus d'autorisation: {0}" -f $statusToken.result.status            
    }            
    

    NB: les étapes 2 et 3 ne sont à réaliser qu’une seule fois (à condition que ça ait fonctioné et que les permissions de l’application n’aient pas été révoquées)

  • Etape 4: ouvrir une session
  • $AppToken= 'mon-app_token-secret-a-conserver'            
    $Challenge = (Invoke-RestMethod -Uri "$BaseURL/login").result.challenge            
                
    # password = hmac-sha1(app_token, challenge)            
    # http://leftshore.wordpress.com/2010/10/04/hmac-sha1-using-powershell/            
    $hmacsha = New-Object System.Security.Cryptography.HMACSHA1            
    $hmacsha.key = [Text.Encoding]::ASCII.GetBytes($AppToken)            
    $signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($Challenge))            
    $password = [string]::join("", ($signature | % {([int]$_).toString('x2')}))            
                
    $SessionJson = @"
    {
       `"app_id`": `"fr.freebox.testapp`",
       `"password`": `"$($password)`"
    }
    "@            
                
    $session = Invoke-RestMethod -Uri "$BaseURL/login/session/" -Method Post -Body $SessionJson            
                
    'ouverture de la session avec succes: {0}' -f $session.success             
    'le session_token est: {0}' -f $session.result.session_token            
    # Afficher les permissions            
    $session.result.permissions

  • Etape 5: faire un appel authentifié à l’API
  • J’ai choisi un exemple qui consiste à afficher les journaux d’appel.

    # Get-Unixdate from http://thepowershellguy.com            
    Function Get-Unixdate ($UnixDate){            
     [timezone]::CurrentTimeZone.ToLocalTime(            
      ([datetime]'01/01/1970 00:00:00').AddSeconds($UnixDate)            
     )            
    }            
    # Construction de l'entête            
    $Header = @{'X-Fbx-App-Auth' = $($session.result.session_token)}            
    # Afficher le journal d'appel            
    (Invoke-RestMethod -Uri "$BaseURL/call/log/" -Headers $Header).result |             
    Sort -Descending:$false -Property datetime |             
    Select name,type,duration,@{l='Date';e={            
    Get-Unixdate $_.datetime            
    }} | ft -AutoSize

    Super, maintenant je peux facilement calculer combien de temps ma femme et mes enfants passent au téléphone 😉

    Advertisements

    3 thoughts on “Piloter sa freebox

    1. Salut, merci pour ce super tuto !
      Je but sur le redémarrage de la freebox, vous ne sauriez pas comment faire ?

    Leave a Reply

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Change )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Change )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Change )

    Google+ photo

    You are commenting using your Google+ account. Log Out / Change )

    Connecting to %s