Connexion freebox v6 et c#

Résolu
Signaler
Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
-
Messages postés
16569
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
-
Bonjour tout le monde,

Cela fait bien longtemps...ravi de vous retrouver...bref voici ma question :

J'ai un "petit" projet en tete. Pour l'instant je suis en train de mettre tout cela sur papier donc pas de programmation.

J'ai une freebox revolution (V6) et lorsque je veux acceder a mon interface de gestion des parametres, j'utilise un simple navigateur web dans lequel je lui indique cette adresse : mafreebox.freebox.fr et j'arrive sur une page de login, je me connecte et j'ai ensuite acces a tous les parametres de l'interface dans le navigateur web.

Mon idee est de pouvoir recuperer certaines infos presentes dans ces pages en c# bien evidemment.

Ma question est donc la suivante:

Faut il plutot un projet style client/serveur avec connexion au serveur, envoi de requetes, attente reponse etc.... ?

ou bien

une utilisation des get / post (webrequest) ?

Dans le second cas, j'ai deja fait quelques essais rapides car la mise en oeuvre "me semble plus simple" mais je suis ennuye car je pense que la page login va me poser quelques soucis. Et oui il faut bien que je me connecte avant de pouvoir acceder au reste des infos.

Du coup je me replonge dans la premiere solution et.....je suis perdu.

Quel est donc votre avis ?

@pluche

SD


[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b

4 réponses

Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
Bonjour a tous,

bon j'ai presque resolu mon "probleme".
Mais j'aurais bien voulu avoir votre avis.

@pluche


[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b
Salut dodo,

Je sais que ça fait un moment que tu posté ça mais j'aimerais savoir comment tu as fais finalement parce aujourd'hui j'aimerais bien moi aussi récupérer ces infos..

Merci d'avance :D
Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
Salut,

Alors les choses ont pas mal changé depuis 2011 puisque tout récemment les nouvelles API venant avec le firmware 2.0 sont sorties. Pour le moment je suis en train de lire la documentation qui elle aussi est disponible. Dès que j'ai un peu de temps, je posterais une source qui montrera comment au moins s'identifier pour ensuite utiliser les API.

@++

SD
/*
 * Created by SharpDevelop.
 * User: Eric
 * Date: 02/11/2013
 * Time: 13:43
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Net;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;

namespace testfree
{
 class Program
 {
  public static void Main(string[] args)
  {
   Console.WriteLine("Hello World!");
   Tuple<string,string> apptokenrequest = AppTokenRequest();
   Tuple<string,string> apptokenstatus = AppTokenStatus(apptokenrequest.Item2);
   Console.WriteLine(apptokenstatus.Item1);
   
   Console.Write("Activer l'app . . . ");
   apptokenstatus = AppTokenStatus(apptokenrequest.Item2);
   
   
   
   Console.WriteLine(apptokenstatus.Item1);
   Tuple<string,string> sessionRequest = SessionRequest("fr.freebox.testapp",apptokenrequest.Item1, apptokenstatus.Item2);
   
   if (sessionRequest.Item1 == "success")
   {
    Console.WriteLine(sessionRequest.Item1);
    string Output = ApiCall("http://mafreebox.freebox.fr/api/v1/lan/freeplug/",sessionRequest.Item2);
   }
   else
   {
    
   }
   
   Console.ReadKey(true);
  }
  
  private static Tuple<string,string> AppTokenRequest()
  {
   var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://mafreebox.freebox.fr/api/v1/login/authorize/");
   httpWebRequest.ContentType = "text/json";
   httpWebRequest.Method = "POST";

   using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
   {
    string json = "{\"app_id\":\"fr.freebox.testapp\"," +
     "\"app_name\":\"Test app\"," +
     "\"app_version\":\"1.0\"," +
     "\"device_name\":\"LaptopA\"}";

    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
     var result = streamReader.ReadToEnd();
     Regex token = new Regex("app_token\":\"(.[^\"]*)");
     Regex trackid = new Regex("track_id\":(\\d*)");
     return new Tuple<string,string>(token.Match(result).Groups[1].Value.ToString(), trackid.Match(result).Groups[1].Value.ToString());
    }
    
   }
  }
  
  private static Tuple<string,string> AppTokenStatus(string trackid)
  {
   var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://mafreebox.freebox.fr/api/v1/login/authorize/" + trackid);
   httpWebRequest.Method = "GET";

   var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
   using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
   {
    var result = streamReader.ReadToEnd();
    Regex status = new Regex("\"status\":\"(.[^\"]*)");
    Regex challenge = new Regex("challenge\":\"(.[^\"]*)");
    return new Tuple<string,string>(status.Match(result).Groups[1].Value.ToString(),challenge.Match(result).Groups[1].Value.ToString());
   }
   
  }
  
  private static string ChallengeRequest()
  {
   var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://mafreebox.freebox.fr/api/v1/login/");
   httpWebRequest.Method = "GET";

   var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
   using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
   {
    var result = streamReader.ReadToEnd();
    Regex challenge = new Regex("challenge\":\"(.[^\"]*)");
    return challenge.Match(result).Groups[1].Value.ToString();
   }
   
  }

  private static Tuple<string,string> SessionRequest(string appid, string apptoken, string challenge)
  {
   
   string password = Encode(challenge,Encoding.ASCII.GetBytes(apptoken));
   string password1 = Encode(apptoken,Encoding.ASCII.GetBytes(challenge));
   
    
   var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://mafreebox.freebox.fr/api/v1/login/session/");
   httpWebRequest.ContentType = "text/json";
   httpWebRequest.Method = "POST";

   using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
   {
    string json = "{\"app_id\":\"" + appid + "\",\"password\":\"" + password + "\"}";

    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
     var result = streamReader.ReadToEnd();
     Regex session = new Regex("session_token\" : \"(.[^\"]*)");
     Regex success = new Regex("success\": " + @"(\w[^,]*)");
     return new Tuple<string,string>(success.Match(result).Groups[1].Value.ToString(), session.Match(result).Groups[1].Value.ToString());
    }
    
   }
  }
  
  
  private static string ApiCall(string url, string sessionid)
  {
   //X-Fbx-App-Auth:
   HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
   httpWebRequest.Method = "GET";
   httpWebRequest.Headers.Add("X-Fbx-App-Auth", sessionid);

   HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
   using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
   {
    return streamReader.ReadToEnd();
   }
  }
  
  public static string Encode(string input, byte[] key)
        {
            HMACSHA1 myhmacsha1 = new HMACSHA1(key);
            byte[] byteArray = Encoding.ASCII.GetBytes(input);
            MemoryStream stream = new MemoryStream(byteArray);
            return myhmacsha1.ComputeHash(stream).Aggregate("", (s, e) => s + String.Format("{0:x2}",e), s => s );
        }
 
  
 }
}


J'ai un pb avec le password lors du login j'ai essayer d'inverser le challenge et l'apptoken comme pour le php, mais cela ne marche pas.

Quelqu'un pourrait m'aider?

Édition par la modération: ajout de la coloration syntaxique.
Messages postés
2
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
3 avril 2014

Bonjour à tous.
Le problème a été résolu de quelle manière je vous prie?

Merci
ça vaut le cout : http://p0w3rsh3ll.wordpress.com/2013/07/04/piloter-sa-freebox/
Messages postés
16569
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
6 décembre 2021
577
Bonjour, cependant cet article n'est pas en C#.