samedi 29 décembre 2018

Domotique: XBOX API & scripts dans Jeedom

En fait, j'ai eu besoin de pouvoir faire des statistiques sur les jeux et l'utilisation des consoles par mes enfants. Finalement, j'ai jamais vraiment utilisé cela pour les surveiller mais plus pour le challenge de voir si une api existait pour cela... et je suis tombé sur cela qui n'est pas une API officiel mais qui m'a satisfait pour mes besoins : https://xboxapi.com/


...qui marche sur xbox one mais je pense aussi sur xbox 360 ou pc si vous avez un compte xbox live ! (je vous laisse tester ces cas mais j'ai testé que sur xbox one et avec plusieurs comptes ;-)

En fait, cette API est gratuite et si votre utilisation est limité à 60 requêtes par heure et par compte xbox live par compte (je crois ;-). Pour l'instant, je n'ai pu associé qu'un seul compte xbox live par compte xbox API. 

Il faut créer un compte sur ce site et y lier votre comptre xbox live, il faudra y récupérer 2 infos, le "XBOX Profile User ID" et  le "XboxAPI API Key" comme on peut le voir sur un de mes comptes :



Ensuite, on va pouvoir utiliser des scripts pour récupérer des infos de l'API, j'ai essayé de faire un script générique (plus ou moins ;-) et donc avec en passage de paramètre comme la clé et le profile, et aussi dans certains cas, je rajoute l'info que je cherche dans le résultat de l'API, je vous expliquerais plus loin le principe.

Donc on peut passer sur Jeedom dès lors que le compte est créé, lié au xbox live account et que l'on a la clé et le profile....

Voici donc le script en perl pour cette fois (me demandez pas pourquoi ;-) :


#!/usr/bin/perl -s
use LWP::UserAgent;
use Net::Ping;
use JSON qw( decode_json ); # need to install json parsing library using this command: sudo apt-get install libjson-pp-perl

no warnings 'uninitialized';

#HTTP example command
#https://xboxapi.com/v2/profile
#https://xboxapi.com/v2/{xuid}/presence
#see more command from here: https://xboxapi.com/documentation

$ua=LWP::UserAgent->new; $ua->timeout(5);

if ($h==1 or (not defined $k) or (not defined $c) or (not defined $t))
{
  print("
  Script to use with https://xboxapi.com
  
  Need to install json parsing library using this command: sudo apt-get install libjson-pp-perl
  
  Parameters are: 
  -h for help 
  -k= (Mandatory)
  -c= (Mandatory)
  -t= (Mandatory)
  -p= (Optional but requested for some commands)
  
  #HTTP example command from XBOXAPI
  #https://xboxapi.com/v2/profile
  #https://xboxapi.com/v2/{xuid}/presence
  #see more command from here: https://xboxapi.com/documentation
  ");
}
else
{  
      #print("XBOX API Key=$k\n");
      #print("command=$c\n");
      
      if (defined $p)
      { 
        #print("XBOX profile User ID=$p\n");
        #X-AUTH token to get from your account of XBOXAPI, you need to have/create account from https://xboxapi.com
        $res=$ua->get("https://xboxapi.com/v2/$p/$c",'X-AUTH' => $k);
      }
      else
      {
        #X-AUTH token to get from your account of XBOXAPI, you need to have/create account from https://xboxapi.com
        $res=$ua->get("https://xboxapi.com/v2/$c",'X-AUTH' => $k);
      }

        unless ($res->is_success) { warn $res->status_line };

      #json parsing
      $decoded = decode_json($res->content);
      
      #print("tag to parse=$t\n");
      if((substr $t, 0, 1) ne '{')
      {
         #try to add { and } to help parsing of the string if missing
         $t = '{'.$t.'}';        
      }
      my $cmd = '$result = $decoded->'. $t. ';';
      eval "$cmd";
      print $result;
}

Et comme vous pouvez le voir dans les codes et les commentaires, il faudra bien s'assurer d'avoir installé la dépendance suivante et de cette manière : "sudo apt-get install libjson-pp-perl" pour gérer au mieux le JSON que l'on doit parser et venant de XBOXAPI.COM.

Dans jeedom, il faut juste créer un script "info" perl avec le code que j'ai donné (dans mon cas, j'ai appelé le script "xboxapi.perl", voici un screenshot où j'ai juste viré ma clé et mon id de profil bien sur ;-)



Il y a différents paramètres mais voici des exemples d'appel de ce script qui parlerons d'eux mêmes.

Pour savoir si le compte xbox live est "Online" ou pas : 

xboxapi.perl -k="votre API key" -p="votre profile id" -c=presence -t=state

Pour connaitre le gamerTag du profil : 

xboxapi.perl -k="votre API key" -c=profile -t=gamerTag

Pour savoir quel est le jeu en cours ou si on se trouve dans le menu de la xbox : 

xboxapi.perl -k="votre API key" -p="votre profile id" c=presence -t={devices}[0]{titles}[1]{name}

Pour connaitre le status du jeu (Dans Fortnite, vous aurez le nombre de gens restant sur la map par exemple ;-) : 

xboxapi.perl -k="votre API key" -p="votre profile id" -c=presence -t={devices}[0]{titles}[1]{activity}{richPresence}

Si vous voulez parser d'autres infos, il faudra aller voir la doc ou appeler l'API en direct et regarder ce que l'on trouve dans le JSON renvoyé.

Voici un exemple de JSON suite à une commande "presence" (j'ai mis des X pour les ids que je ne veux pas révéler):


{"xuid":XXXXXXXXXXXXXXXX,"state":"Online","devices":[{"type":"XboxOne","titles":[{"id":XXXXXXXX,"name":"Accueil","placement":"Background","state":"Active","lastModified":"2018-12-29T16:57:30.7121865Z"},{"id":XXXXXXXXXXX,"activity":{"richPresence":"CLASS\u00c9 - Manche 6\/6 (d\u00e9cisive)"},"name":"Tom Clancy's Rainbow Six Siege","placement":"Full","state":"Active","lastModified":"2018-12-29T16:57:30.7121865Z"}]}],"cloaked":true}


Conclusion:

Voilà, jespère que cela aidera certains à jouer avec cette API bien sympa et qui permet d'intégrer un peu plus encore nos consoles de jeu ;-)

On pouvait déjà utiliser l'UPNP/DLNA pour savoir si les consoles sont allumées (un simple PING ne marchait pas toujours :-( ) mais avec ce script et cette API, on peut avoir plus d'info... On pourrait imaginer faire un contrôle parental avec nos boxes domotiques en Jeedom ou autre utilisant des scripts perl.

Enjoy !!! 












Aucun commentaire :

Enregistrer un commentaire