FreeboxV6 Api V3 avec Python
2016/01/27 21:47Un peu de python, et ça vient annuler ça ;-)
Voilà une api python simple de registration et de connexion avec les API v3 de la freebox :
import urllib2,hmac,json,hashlib,time
class FbxCnx:
def __init__(self,host="mafreebox.free.fr"):
self.host=host
def register(self,appid,appname,devname):
data={"app_id": appid,"app_name": appname,"device_name": devname}
r=self._com("login/authorize/",data)["result"]
trackid,token=r["track_id"],r["app_token"]
s="pending"
while s=="pending":
s=self._com("login/authorize/%s"%trackid)["result"]["status"]
time.sleep(1)
return s=="granted" and token
def _com(self,method,data=None,headers={}):
url = "http://"+self.host+"/api/v3/"+method
if data: data = json.dumps(data)
return json.loads(urllib2.urlopen(urllib2.Request(url,data,headers)).read())
def _mksession(self):
challenge=self._com("login/")["result"]["challenge"]
data={
"app_id": self.appid,
"password": hmac.new(self.token,challenge,hashlib.sha1).hexdigest()
}
return self._com("login/session/",data)["result"]["session_token"]
class FbxApp(FbxCnx):
def __init__(self,appid,token,session=None,host="mafreebox.free.fr"):
FbxCnx.__init__(self,host)
self.appid,self.token=appid,token
self.session=session if session else self._mksession()
def com(self,method,data=None):
return self._com(method,data,{"X-Fbx-App-Auth": self.session})
def dir(self,path='/Disque dur/'):
return self.com( "fs/ls/" + path.encode("base64") )
Pour commencer, il suffit de registrer son appli dans la freebox, en lançant, dans son reseau local uniquement, chez soi, la commande suivante :
print "token='%s'" % FbxCnx().register("test.id","le nom de l'app","la device")
Il faut valider la registration sur l'afficheur LCD de la freebox, et garder le token !
Une fois que c'est fait; on peut attaquer les API depuis n'importe où sur le web. Si on est ailleurs que dans son sous réseau freebox, il faudra préciser l'ip public de la freebox, ainsi que sont port, dans un paramètre 'host' (faut évidemment que ça soit activé dans la config freebox).
f=FbxApp("test.id",token,host="11.22.33.44:4444")
print f.dir()
L'instance FbxApp négocie, en douce, un 'token de session'. Si on veut garder la même session, il est possible de l'obtenir (f.session), de la faire persister, et de la donner à l'instanciation, comme ceci :
session="WV+O0z1XgE4QB728uINupbQdBiKKAhKYjAX+UylmGwL2ejo6ViQkcx1tK4onQIzt"
f=FbxApp("test.id",token,session,host="11.22.33.44:4444")
print f.dir()
Il n'y a que la commande "fs/ls" d'implementer (via dir()), mais le reste est tout aussi simple ;-)
Mais on peut aussi appeler directement les API, ainsi (et voir passer des params, via un dict comme second argument):
print f.com("airmedia/receivers")
**EDIT 20/02/2017 : ça marche avec les nouvelles APIs V4, faut juste remplacer "v3" par "v4" **

