You are not logged in.
Bonjour,
Je migre GLPI 10.0.3 vers Jira Service Manager.
J'ai besoin d'exporter les ID des tickets GLPI 2024 et les chemins de leurs pièces jointes dans un CSV.
Pour ceci, mon choix s'est porté vers l'API.
J'ai donc ce script Pyhton qui est censé me remplir un csv avec plus de 4000 tickets et les chemins des pièces jointes. Or, à l'exécution du script il ne semble traiter que 15 tickets et ne retourne qu'un ticket dans le csv. Sauriez-vous expliquer pourquoi s'il vous plait ?
import requests
import urllib3
import csv
# Désactiver les avertissements SSL
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Configuration des variables
base_url = "https://glpi.*******.lan/apirest.php"
app_token = "**************"
user_token = "**************"
# Préparer les en-têtes pour initier la session
headers = {
'Content-Type': 'application/json',
'App-Token': app_token,
'Authorization': f'user_token {user_token}'
}
# Initialiser la session pour obtenir le session_token
session_url = f"{base_url}/initSession"
response = requests.get(session_url, headers=headers, verify=False)
# Vérifier la réponse de la session
try:
session_data = response.json()
session_token = session_data['session_token']
print("Session initialisée avec succès.")
except requests.exceptions.JSONDecodeError:
print("Erreur: Impossible de décoder la réponse JSON lors de l'initialisation de la session.")
print("Contenu de la réponse:", response.text)
exit()
except KeyError:
print("Erreur: session_token manquant dans la réponse.")
exit()
# Ajouter le session_token aux en-têtes
headers['Session-Token'] = session_token
# Créer le fichier CSV pour écrire les données
csv_file = 'glpi_tickets_2024.csv'
with open(csv_file, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Ticket ID', 'Ticket Name', 'Document ID', 'Document Name', 'Document Path'])
start = 0
limit = 100
total_tickets_processed = 0
while True:
print(f"Récupération des tickets {start} à {start + limit - 1}...")
# Récupérer une page de tickets avec filtrage par date de création en 2024
tickets_url = f"{base_url}/Ticket?range={start}-{start+limit-1}&criteria[0][field]=date_creation&criteria[0][searchtype]=contains&criteria[0][value]=2024"
response = requests.get(tickets_url, headers=headers, verify=False)
# Log de la réponse pour débogage
print(f"Réponse brute de l'API : {response.text[:500]}...")
try:
tickets = response.json()
except requests.exceptions.JSONDecodeError:
print("Erreur: La réponse n'est pas en JSON ou est vide.")
print("Contenu de la réponse:", response.text)
break
# Si la liste de tickets est vide, nous avons atteint la fin
if not tickets or isinstance(tickets, list) and len(tickets) == 0:
print("Aucun ticket trouvé. Fin du traitement.")
break
tickets_processed_in_current_iteration = 0
for ticket in tickets:
if isinstance(ticket, dict):
ticket_id = ticket['id']
ticket_name = ticket['name']
print(f"Traitement du ticket ID: {ticket_id}")
# Récupérer les documents liés au ticket
documents_url = f"{base_url}/Ticket/{ticket_id}/Document"
response = requests.get(documents_url, headers=headers, verify=False)
try:
documents = response.json()
except requests.exceptions.JSONDecodeError:
print(f"Erreur: La réponse pour le ticket {ticket_id} n'est pas en JSON.")
continue
if isinstance(documents, list):
for doc in documents:
if isinstance(doc, dict):
document_id = doc['id']
document_name = doc['name']
document_path = f"/files/{doc['filepath']}/{doc['filename']}"
writer.writerow([ticket_id, ticket_name, document_id, document_name, document_path])
print(f"Document ajouté: Document ticket {ticket_id}")
else:
print(f"Format inattendu pour le document: {doc}")
else:
print(f"Erreur: Impossible de récupérer les documents pour le ticket {ticket_id}.")
print(f"Message retourné: {documents}")
total_tickets_processed += 1
tickets_processed_in_current_iteration += 1
# Si aucun ticket n'a été traité dans cette itération, arrêter la boucle
if tickets_processed_in_current_iteration == 0:
print("Aucun nouveau ticket traité dans cette itération. Fin du traitement.")
break
# Passer à la page suivante
start += limit
print(f"{total_tickets_processed} tickets traités jusqu'à présent.")
print(f"Les données ont été exportées avec succès dans le fichier {csv_file}.")
print(f"Nombre total de tickets traités : {total_tickets_processed}")
Last edited by stricking-hammer (2024-08-14 14:09:31)
Offline