Traiter le retour d'un script curl

Bonjour a tous,

j’ai un petit problème « oui encore » :wink: avec mon script « headzy »

La requête curl que j’exécute depuis un scenario fonctionne et me renvoi bien la bonne information, mais je n’arrive pas a traiter son format de retour

ma requete :
$json = system("curl -X GET --header 'Accept: application/json' --header 'X-Gizwits-User-token:2984000000000000000000000018f0fc' --header 'X-Gizwits-Application-Id:c70a66ff039d41b4a220e198b0fcc8b3' 'https://euapi.gizwits.com/app/bindings';");

le retour est le suivant :

{« devices »: [{« protoc »: 0, « ws_port »: 8888, « port_s »: 8888, « is_disabled »: false, « gw_did »: «  », « wifi_soft_version »: « 00000000 », « dev_alias »: « Extension », « remark »: « range=0|isdelete=0|gid=0|groupname=|grouprange=0 »}, {« protoc »: 0, « ws_port »: 8888, « port_s »: 8888, « is_disabled »: false, « gw_did »: «  », « wifi_soft_version »: « 00000000 », « dev_alias »: « piece TV », « remark »: « range=0|isdelete=0|gid=0|groupname=|grouprange=0 »}, {« protoc »: 0, « ws_port »: 8888, « port_s »: 8888, « is_disabled »: false, « gw_did »: «  », « wifi_soft_version »: « 00000000 », « dev_alias »: " Cuisine ", « remark »: « range=0|isdelete=0|gid=0|groupname=|grouprange=0 »}]}

j’ai essayé de reprendre ce qu’il a été fait dans le sujet suivant :
https://community.jeedom.com/t/probleme-de-script/23021/14

mais le seul moyen que j’ai trouvé c’est en passant par le scipt suivant :

$json = system("curl -X GET --header 'Accept: application/json' --header 'X-Gizwits-User-token:2984000000000000000000000018f0fc' --header 'X-Gizwits-Application-Id:c70a66ff039d41b4a220e198b0fcc8b3' 'https://euapi.gizwits.com/app/bindings';");
$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

if (!empty($json))
{
$findme   = 'devices';
$pos = strpos($json, $findme);

	if ($pos === false) 
  	{
    	$scenario->setLog('Erreur de retour de la fonction CURL, la fonction renvoi  : ' .$json);
  	}
  	else
  	{
    	$obj = json_decode($json, TRUE);
    
    	if (json_last_error() === JSON_ERROR_NONE) 
		{
    		$Infos_devices = $obj['devices'];
         	$scenario->setLog('Infos_devices : ' . $Infos_devices);
         	$scenario->setData('Infos_devices', $Infos_devices);
              
          	foreach ($Infos_devices as $a ) 
            {
                $transformation_tableau = implode ($a, ';');	
             	$scenario->setData("test_php".$b++, $transformation_tableau);
            }
        }
       	else 
      	{
        	$scenario->setLog('Erreur json est : ' . $json_errors[json_last_error()]);
      	} 
	}
}

Ce script, me renvoi 3 variables, avec toutes les informations sur une même ligne séparé par un « ; » mais sans les titres:
test_php : 0;8888;8888;false;;00000000;Extension;range=0|isdelete=0|gid=0|groupname=|grouprange=0
test_php1 : 0;8888;8888;false;;00000000;piece TV;range=0|isdelete=0|gid=0|groupname=|grouprange=0
test_php2 : 0;8888;8888;false;;00000000; cuisine ;range=0|isdelete=0|gid=0|groupname=|grouprange=0

Ce que je voudrais c’est pouvoir traiter le retour avec une variable par informations, comme ceci:
protoc_1 : 0
ws_port_1 : 8888
port_s_1: 8888
is_disabled_1: false
gw_did_1: «  »,
wifi_soft_version_1: « 00000000 »,
dev_alias_1: « Extension »,
remark_1: « range=0|isdelete=0|gid=0|groupname=|grouprange=0 »

protoc_2 : 0
ws_port_2 : 8888
port_s_2: 8888
is_disabled_2: false
gw_did_2: «  »,
wifi_soft_version_2: « 00000000 »,
dev_alias_2: « piece TV »,
remark_2: « range=0|isdelete=0|gid=0|groupname=|grouprange=0 »

protoc_3 : 0
ws_port_3 : 8888
port_s_3: 8888
is_disabled_3: false
gw_did_3: «  »,
wifi_soft_version_3: « 00000000 »,
dev_alias_3: " cuisine ",
remark_3: « range=0|isdelete=0|gid=0|groupname=|grouprange=0 »

y a t’il une solution?

merci d’avance pour votre aide
dkvince

Bonjour @dkvince
En modifiant un peu la boucle foreach:

$b=1;
foreach ($Infos_devices as $a) {
  $scenario->setData("protoc_".$b, $a['protoc']);
  $scenario->setData("ws_port_".$b, $a['ws_port']);
  $scenario->setData("port_s_".$b, $a['port_s']);
  $scenario->setData("is_disabled_".$b, $a['is_disabled']);
  $scenario->setData("gw_did_".$b, $a['gw_did']);
  $scenario->setData("wifi_soft_version_".$b, $a['wifi_soft_version']);
  $scenario->setData("dev_alias_".$b, $a['dev_alias']);
  $scenario->setData("remark_".$b, $a['remark']);
  $b++;
}

Vous allez avoir les variables demandées qui vont être créées.

La structure partielle de votre json:
image

Avec la recup de dev_alias:
image

merci beaucoup @jpty ça fonctionne

Bonjour

je viens encore vous embêter avec mes retours de script cUrl, à chaque fois je pense avoir compris, mais lorsque j’ai un retour il est différent du précédent, et je n’arrive pas à adapter le script.

voici mon retour

{
	"did":"7xxxxxxxxxxxxxxxxxxxxS",
	"updated_at":1000000008,
	"attr":	{
			"time_week":2,
			"mode":"cft",
			"time_hour":25,
			"lock_switch":0,
			"timer_switch":1,
			"boost_time":0,
			"boost_switch":0,
			"derog_time":0,
			"p7_data12":85
			}
}

mon script

$json = system("curl -X GET --header 'Accept: application/json' --header 'X-Gizwits-Application-Id:c70a66ff039d41b4a220e198b0fcc8b3' 'https://euapi.gizwits.com/app/devdata/2732555555/latest'";);
$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);
if (!empty($json))
{
      $findme   = 'did';
      $pos = strpos($json, $findme);

      if ($pos === false) 
      {
        $scenario->setLog('Erreur de retour de la fonction CURL, la fonction renvoi  : ' .$json);
      }
      else
      {
    	$obj = json_decode($json, TRUE);
    
           if (json_last_error() === JSON_ERROR_NONE) 
           {
                 $did = $obj['did'];
                 $scenario->setLog('device_id_1: ' , $did);
                 $scenario->setData('device_did_1: ' , $did);
          
                $updated_at = $obj['updated_at'];
                $scenario->setLog('updated_at_1: ' , $updated_at);
                $scenario->setData('updated_at_1': ' , $updated_at);
          
                $attr = $obj['attr']; //a partir d'ici attr me renvoi un [object object]
          
                $b=1;
	        foreach ($Infos_devices as $a) 
                {
                   $scenario->setData("dev_alias_".$b, $a['dev_alias']);
		   $scenario->setData("time_week_".$b, $a['time_week']);
		   $scenario->setData("mode_".$b, $a['mode']);
		   $scenario->setData("time_hour_".$b, $a['time_hour']);
		   $scenario->setData("lock_switch_".$b, $a['lock_switch']);
		   $scenario->setData("timer_switch_".$b, $a['timer_switch']);
		   $scenario->setData("boost_time_".$b, $a['boost_time']);
		   $scenario->setData("boost_switch_".$b, $a['boost_switch']);
		   $scenario->setData("derog_time_".$b, $a['derog_time']);
		   $scenario->setData("p7_data12_".$b, $a['p7_data12']);
                   b++;
                }   
             }  
         }
}
else 
{
	$scenario->setLog('Erreur json est : ' . $json_errors[json_last_error()]);
}

ce script me renvoi bien le
device_did_1
updated_at_1
mais impossible de recuperer les 10 variables qui se trouvent dans « attr » :frowning:

merci pour votre aide
dkvince

Après la ligne $attr = $obj['attr'];,
vous pouvez accéder à la valeur de ‹ mode › par : $attr['mode']
ou directement par $obj['attr']['mode']

génial merci beaucoup
dkvince

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.