You are not logged in.
Pages: 1
Bonjour à tous,
Est-il possible d'importer des tickets dans GLPI ? De la même manière qu'avec le plugin datainjection. Effet, je tiens à jour un tableau Excel avec tous les incidents et problèmes.
Après de longues recherches, je n'ai rien trouvé ...
merci
Offline
bonjour,
en utilisant l'API REST vous pouvez creer des tickets. il faudra un peu de developpement mais vous pouvez créer une page php qui va lire votre fichier excel et avec les informations du fichier créer les tickets
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
un exemple simple si vous avez un csv avec 2 colonnes titre et description.
mais vous pouvez completer comme vous voulez avec d'autre champs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- la denree -2017- -->
<head>
<title>TEST API</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="generator" content="Bluefish 2.2.7" />
<meta name="Keywords" content="GLPI,import API," />
<meta name="Description" content="imports de tickets via API REST" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
</head>
<body>
<h1>import tickets from csv using GLPI API REST</h1>
<?php
echo "<h2>read csv file</h2>";
//initialisation des variables
$mycsvfile="tickets.csv";
$api_url="http://localhost/glpi/apirest.php";
$user_token="myusertocker";
$app_token ="myapptoken";
//initialisation api glpi
$ch = curl_init();
$url=$api_url . "/initSession?Content-Type=%20application/json&app_token=".$app_token ."&user_token=".$user_token;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
$sess_token = $obj[session_token];
$headers = array(
('Content-Type: application/json'),
('App-Token: ' . $app_token),
('Session-Token: '.$sess_token)
);
if (!file_exists($mycsvfile)){
die("le fichier n'existe pas");
}
// lecture des lignes du fichier
$ligne=1;
$fic=fopen($mycsvfile, "r");
while($tab=fgetcsv($fic,1024,','))
{
$titre=$tab[0];
$description=$tab[1];
echo "creation du ticket ". $titre." ".$description."<br/>";
$ch = curl_init();
$url=$api_url . "/Ticket/";
$fields='{
"input": {
"name": "' .$titre. '","requesttypes_id": "8","itilcategories_id": "20","content": "'.$description.'","type": "1",
"users_id_recipient": "6"
}
}';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$request_result = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($request_result,true);
$ticket_id=$obj['id'];
echo "<br/>$ticket_id<br/>";
}?>
</body>
</html>
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Merci pour les infos LaDenrée :-)
Offline
re
j'ai activé API REST, la page http://127.0.0.1/glpi/apirest.php/ fonctionne.
ou est-ce que je dois mettre le fichier .php et mon .csv ?
j'avoue que je suis un peu perdu ...
Merci
Offline
le fichier php doit être sur un serveur web.
le plus simple est de le mettre dans /var/www/html/api sur le même serveur que glpi comme ça vous pouvez laisser l'adresse locahost : $api_url="http://localhost/glpi/apirest.php";
pour le csv il faut le mettre aussi sur le serveur par exemple dans /home ou dans /tmp et il faudra modifier le chemin du fichier en conséquence.
IMPORTANT : faites un dump préalable de votre base et travaillez sur un serveur de test (j'ai écrit le script en vitesse et je l'ai testé avec un fichier de 2 lignes mais on n'est pas à l'abri d'un bug)
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
J'ai mis le fichier .php sur mon serveur à l'emplacement suivant :
/var/www/html/api/ticket.php
J'ai modifié le chemin du .csv :
$mycsvfile="/home/user/Documents/ticket.csv";
Puis je rentre l' URL :
http://127.0.0.1/api/ticket.php
Voici ce que j'ai à l’écran :
import tickets from csv using GLPI API REST
read csv file
creation du ticket titre description
creation du ticket titre test 1 description test 1
creation du ticket titre test 2 description test 2
creation du ticket titre test 3 description test 3
Par contre les tickets ne s'incrémentent pas dans GLPI
Avez-vous une petite idée ?
Offline
déjà, la lecture du csv fonctionne,
avez vous activé l'API pour 127.0.0.1 ? avec le apptoken corespondant ?
que vous renvoie votre navigateur si vous tapez en url http://127.0.0.1/glpi/apirest.php
j'ai modifié le code pour y ajouter des messages qui vont nous aider pour le debug...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- la denree -2017- -->
<head>
<title>TEST API</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="generator" content="Bluefish 2.2.7" />
<meta name="Keywords" content="GLPI,import API," />
<meta name="Description" content="imports de tickets via API REST" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
</head>
<body>
<h1>import tickets from csv using GLPI API REST</h1>
<?php
echo "<h2>read csv file</h2>";
//initialisation des variables
$mycsvfile="tickets.csv";
$api_url="http://127.0.0.1/glpi/apirest.php";
$user_token="myusertocker";
$app_token ="myapptoken";
//initialisation api glpi
$ch = curl_init();
$url=$api_url . "/initSession?Content-Type=%20application/json&app_token=".$app_token ."&user_token=".$user_token;
// ligne suivante pour debug à commenter en prod;
echo "<br/>url authentification : " . $url . "<br/>" ;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
// ligne suivante pour debug à commenter en prod;
print_r($obj);
$sess_token = $obj[session_token];
// ligne suivante pour debug à commenter en prod;
echo " <br/>session token : ". $sess_token ."<br/>";
$headers = array(
('Content-Type: application/json'),
('App-Token: ' . $app_token),
('Session-Token: '.$sess_token)
);
// ligne suivante pour debug à commenter en prod;
print_r($header);
if (!file_exists($mycsvfile)){
die("le fichier n'existe pas");
}
// lecture des lignes du fichier
$ligne=1;
$fic=fopen($mycsvfile, "r");
while($tab=fgetcsv($fic,1024,','))
{
$titre=$tab[0];
$description=$tab[1];
echo "creation du ticket ". $titre." ".$description."<br/>";
$ch = curl_init();
$url=$api_url . "/Ticket/";
$fields='{
"input": {
"name": "' .$titre. '","requesttypes_id": "1","content": "'.$description.'","type": "1"
}
}';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$request_result = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($request_result,true);
$ticket_id=$obj['id'];
echo "<br/>$ticket_id<br/>";
}?>
</body>
</html>
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Effectivement, problème au niveau app_token et user_token.
Un GRAND merci LaDenrée .. ça fonctionne à merveille ;-)
Offline
On peut bien évidemment importer plus que titre et description. ...
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Vu ;-)
je suis entrain d'ajouter des champs pour mon fichier .csv
J'ai donc modifié le .php comme ceci :
// lecture des lignes du fichier
$ligne=1;
$fic=fopen($mycsvfile, "r");
while($tab=fgetcsv($fic,1024,','))
{
$titre=$tab[0];
$dateouverture=$tab[1];
$tempsresolution=$tab[2];
$lieu=$tab[3];
$demandeur=$tab[4];
$categorie=$tab[5];
$description=$tab[6];
echo "creation du ticket ". $titre." ". $dateouverture." ". $tempsresolution." ". $lieu." ". $demandeur." ". $categorie." ".$description."<br/>";
$ch = curl_init();
$url=$api_url . "/Ticket/";
$fields='{
par contre je bloque sur cette partie....
"input": {
"name": "' .$titre. '","requesttypes_id": "8","itilcategories_id": "20","content": "'.$description.'","type": "1",
"users_id_recipient": "6"
}
}';
Je ne sais pas ou trouver les informations ... Pouvez-vous me donner une piste ?
merci
Last edited by Shamrockst (2017-05-25 19:54:05)
Offline
"itilcategories_id": ".$catégorie." : c'est le N° de ma catégorie de ticket GLPI
"requesttypes_id": "8" source de la demande ( chez moi 8 c'est API)
"_users_id_requester": "'.$id_demandeur.'"
"locations_id"
vous pouvez mettre presque tous les champs de la table glpi_tickets
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
un exemple ci desssous
$fields='{
"input": {
"entities_id": "1",
"name": " ",
"date": "2016-10-06 17:34:28",
"closedate": "2016-10-15 14:50:02",
"solvedate": "2016-10-08 10:32:47",
"date_mod": "2016-10-15 14:50:02",
"users_id_lastupdater": "6",
"status": "6",
"users_id_recipient": "9",
"requesttypes_id": "2",
"content": "description",
"urgency": "3",
"impact": "3",
"priority": "3",
"itilcategories_id": "1",
"type": "2",
"solutiontypes_id": "0",
"solution": " solution",
"global_validation": "1",
"slts_ttr_id": "0",
"slts_tto_id": "0",
"ttr_slalevels_id": "0",
"_users_id_requester": "'.$id_demandeur.'"
"begin_waiting_date": "2016-10-08 10:32:47",
"sla_waiting_duration": "0",
"waiting_duration": "142673",
"close_delay_stat": "625061",
"solve_delay_stat": "4826",
"takeintoaccount_delay_stat": "934",
"actiontime": "0",
"is_deleted": "0",
"locations_id": "1",
"validation_percent": "0"
}
}';
bien sur certains champ n'ont pas de sens lors d'une creation ou import, vous pouvez les supprimer.
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
re ...
Désolé de vous solliciter une fois de plus mais je n'arrive pas à intégrer toutes les colonnes de mon fichier .csv, (j'y ai passé de nombreuses heures mais rien à faire :-( )
à savoir : titre, dateouverture, tempsresolution, demandeur,lieu, categorie, entite et description
Voici mon ticket.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- la denree -2017- -->
<head>
<title>TEST API</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="generator" content="Bluefish 2.2.7" />
<meta name="Keywords" content="GLPI,import API," />
<meta name="Description" content="imports de tickets via API REST" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
</head>
<body>
<h1>import tickets from csv using GLPI API REST</h1>
<?php
echo "<h2>read csv file</h2>";
//initialisation des variables
$mycsvfile="/home/user/Documents/tickets.csv";
$api_url="http://127.0.0.1/glpi/apirest.php";
$user_token="z0dsfi2r9crs7aiky84zmzmjzbp94mdo9miw7tn8";
$app_token ="heu3wuza8ynsi69g4mg0gilhnr9q4yhegne8s8rc";
//initialisation api glpi
$ch = curl_init();
$url=$api_url . "/initSession?Content-Type=%20application/json&app_token=".$app_token ."&user_token=".$user_token;
// ligne suivante pour debug à commenter en prod;
echo "<br/>url authentification : " . $url . "<br/>" ;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($json,true);
// ligne suivante pour debug à commenter en prod;
print_r($obj);
$sess_token = $obj[session_token];
// ligne suivante pour debug à commenter en prod;
echo " <br/>session token : ". $sess_token ."<br/>";
$headers = array(
('Content-Type: application/json'),
('App-Token: ' . $app_token),
('Session-Token: '.$sess_token)
);
// ligne suivante pour debug à commenter en prod;
print_r($header);
if (!file_exists($mycsvfile)){
die("le fichier n'existe pas");
}
// lecture des lignes du fichier
$ligne=1;
$fic=fopen($mycsvfile, "r");
while($tab=fgetcsv($fic,1024,','))
{
$titre=$tab[0];
$dateouverture=$tab[1];
$tempsresolution=$tab[2];
$demandeur=$tab[3];
$lieu=$tab[4];
$categorie=$tab[5];
$entite=$tab[6];
$description=$tab[7];
echo "creation du ticket ". $titre." ". $dateouverture." ". $tempsresolution."". $demandeur."". $lieu."". $categorie."". $elementassocie."".$description."<br/>";
$ch = curl_init();
$url=$api_url . "/Ticket/";
$fields='{
"input": {
"name": "' .$titre. '","requesttypes_id": "1",
"date": "' .$dateouverture. '","2016-10-06 17:34:28",
"closedate": "' .$tempsresolution. '","2016-10-15 14:50:02",
"_users_id_requester": "' .$demandeur. '","'.$id_demandeur.'"
"locations_id": "' .$lieu. '","1",
"itilcategories_id": "' .$categorie. '","1",
"entities_id": "' .$entite. '","1",
"content": "'.$description.'","type": "1"
}
}';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$request_result = curl_exec($ch);
curl_close ($ch);
$obj = json_decode($request_result,true);
$ticket_id=$obj['id'];
echo "<br/>$ticket_id<br/>";
}?>
Merci :-)
Offline
bonjour,
je ne comprends pas bien certaines parties du input :
$fields='{
"input": {
"name": "' .$titre. '",
"requesttypes_id": "1",
"date": "' .$dateouverture. '","2016-10-06 17:34:28", //pourquoi une date en dur après la variable $dateouverture????
"closedate": "' .$tempsresolution. '","2016-10-15 14:50:02",//pourquoi une date en dur après la variable $tempsresolution????
"_users_id_requester": "' .$demandeur. '","'.$id_demandeur.'"// vous avez 2 variables pour id_requester il ne vous en faut qu'une;
"locations_id": "' .$lieu. '","1",
"itilcategories_id": "' .$categorie. '","1",
"entities_id": "' .$entite. '","1",
"content": "'.$description.'",
"type": "1"}
}';
edit : pouvez vous faire un print_r($fields) et poster le resultat (pour vérifier que les id sont bien des entiers par exemple)
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
allez y par étape :
$fields='{
"input": {
"name": "' .$titre. '",
"requesttypes_id": "1",
"date": "' .$dateouverture. '"
"content": "'.$description.'",
"type": "1"
}
}';
essayez des descriptions avec des apostrophes et double quote il faudra peut échapper certains caractères...
Trouver la panne avant de réparer...
GLPI10.0.16 (ubuntu 22.04 PHP8.1 Mariadb10.6 ) plugins : comportements 2.7.3 reports 1.16.0 formcreator 2.13.9, datainjection 2.13.5 fields 1.21.9
Offline
Bonjour LaDenrée,
Je me permet de réouvrir ce post, j'ai un souci, le ticket ne se crée pas à la fin.
Tout semble pourtant ok, la lecture du CSV, les token.
Seulement à la fin pas d'appiration de l'id du ticket et dans la liste de ticket rien..
Merci de ton aide si possible,
Nicolas
Offline
root@support-sap:/var/www/glpi/files/_log# tail -f api.log
2020-03-04 11:34:52 [408@support-sap]
Enpoint 'createItems' called by 127.0.0.1 (ntrophime)
2020-03-04 11:34:52 [408@support-sap]
Enpoint 'createItems' called by 127.0.0.1 (ntrophime)
2020-03-04 11:36:20 [@support-sap]
Enpoint 'initSession' called by 127.0.0.1
2020-03-04 11:36:20 [408@support-sap]
Enpoint 'createItems' called by 127.0.0.1 (ntrophime)
2020-03-04 11:36:20 [408@support-sap]
Enpoint 'createItems' called by 127.0.0.1 (ntrophime)
J'ai ça dans les logs API..
Pourtant aucune trace de l'item créé.
Offline
Je précise que j'utilise le plugin Behavior, est-ce que cela pourrait être l'incrémentation de la numérotation des tickets qui bloque ?
Offline
J'ai ca dans mes logs php de GLPI lorsque je lance le fichier PHP via l'API ..
[2020-03-04 11:55:36] glpiphplog.ERROR: Toolbox::userErrorHandlerNormal() in /var/www/glpi/inc/toolbox.class.php line 658
*** PHP Notice(8): Undefined index: _users_id_requester
Backtrace :
plugins/behaviors/inc/ticket.class.php:301
inc/plugin.class.php:1112 PluginBehaviorsTicket::beforeAdd()
inc/commondbtm.class.php:1092 Plugin::doHook()
inc/api.class.php:1770 CommonDBTM->add()
inc/apirest.class.php:263 API->createItems()
apirest.php:48 APIRest->call()
{"user":"408@support-sap","mem_usage":"0.000\", 1.54Mio)"}
Offline
OK je me fais mes questions et réponse tout seul... s'était bien le plugin, je l'ai désactivé et ton script marche super bien.
Merci pour ce formidable boulot LaDenrée !
Bien à toi,
Nicolas
Offline
Pages: 1