#1 Le 03/03/2021, à 12:36
- bierzo
Question jq sur un json en sortie d'un curl
Bonjour à tous
J'ai un script dans lequel je fait des curl sur une api mailjet. Afin de récupérer certaines informations.
Voici mon script:
#!/bin/bash
ziprep="/home/batches/dev/compobatch/sendmail/"
zipfile=$ziprep\*.zip
campagne=$(basename ${zipfile} | cut -d '_' -sf1)
echo $campagne
#1ère étape: Appel de l'api pour trouver l'id de la campagne
id=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/campaign?CustomCampaign=$campagne | jq '.Data[0].ID')
echo "voici: $id"
#2ère étape: Appel de l'api
variable=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id)
echo "revoici: $variable"
#3ème étape: Générer le fichier csv
datecsv=$(date +%Y%m%d%H%M%S)
echo "Status;Date d'envoi" > MAILJET_RETOUR_"$id"_"$datecsv".csv
#nbrmessage=$variable | jq '.Count'
nbrmessage=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq '.Count')
echo "count $nbrmessage"
for ((i=0; i<$nbrmessage; i++))
do
statut=$variable | jq '.Data[0].Status'
echo "message $statut"
done
Dans mon premier curl, j'arrive bien à afficher ma variable id, et afficher sa valeur. Quand je lance le second curl, il me retourne ceci:
{ "Count" : 4, "Data" : [{ "ArrivedAt" : "2021-03-03T08:15:15Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 92886742930108178, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972770, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "bc60344f-2b8f-4bf7-8820-118550386009" }, { "ArrivedAt" : "2021-03-03T08:15:11Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 95420017728093675, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972798, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "ae4ab34f-e13d-4dda-960f-b03f9f17156f" }, { "ArrivedAt" : "2021-03-03T08:15:15Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 92042318010622907, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972696, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "97859cb1-93ba-4206-b044-06e6e3ca1168" }, { "ArrivedAt" : "2021-03-03T08:15:10Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 95701492698544310, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972724, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "a0125ec6-fdd2-466c-ba5e-eb0945357b81" }], "Total" : 4 }
Ce qui est normal, jusqu'ci tout va bien.
Il affiche les infos pour les 4 mails que j'ai envoyés.
Ensuite, je souhaite afficher avec une boucle, uniquement l'information status, ArrivedAt et l'ID. (je les ai mis en gras dans le résultat juste au dessus).
Pour cela, je fais un curl à nouveau, et je récupère l'info Count pour avoir le nombre de mails, ici 4 avec mon '"jq '.Count'".
Puis, je boucle pour afficher le status, ArrivedAt et ID de chaque mails. Mais c'est la que j'ai un petit soucis, quand je fais ceci avec ma boucle:
for ((i=0; i<$nbrmessage; i++))
do
statut=$variable | jq '.Data[i].Status'
echo "message $statut"
done
En sortie de mon script pour la boucle, j'ai ceci:
jq: error: i/0 is not defined at <top-level>, line 1:
.Data[i].Status
jq: 1 compile error
message
Et la, je n'arrive pas du tout à voir comprendre comment récupérer les informations. Donc si quelqu'un à une info, je suis preneur
Si je ne suis pas très clair dans mes explications, dites-moi.
Merci beaucoup
Bonne journée
Dernière modification par bierzo (Le 03/03/2021, à 12:38)
Hors ligne
#2 Le 03/03/2021, à 12:46
- Watael
Re : Question jq sur un json en sortie d'un curl
salut,
$ jq -r '.Data[]|.Status' /tmp/mail.json
sent
sent
sent
sent
autre chose ?
Dernière modification par Watael (Le 03/03/2021, à 12:47)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 03/03/2021, à 13:18
- bierzo
Re : Question jq sur un json en sortie d'un curl
J'ai donc supprimé ma boucle, et mis cette ligne à la place:
statut=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq -r '.Data[]|.Status')
date=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq -r '.Data[]|.ArrivedAt')
idmail=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq -r '.Data[]|.ID')
Et la il me retourne donc bien ceci:
sent
sent
sent
sent
2021-03-03T08:15:15Z
2021-03-03T08:15:11Z
2021-03-03T08:15:15Z
2021-03-03T08:15:10Z
92886742930108180
95420017728093680
92042318010622910
95701492698544300
Je vais l'incorporer dans un csv, donc une ligne avec le statut, date d'arrivée, et l'id. Pour ça par contre je dois mettre dans une boucle non ?
Car sans boucle mon csv ressemble à ça:
Status;Date d'envoi;Identifiant
sent
sent
sent
sent;2021-03-03T08:15:15Z
2021-03-03T08:15:11Z
2021-03-03T08:15:15Z
2021-03-03T08:15:10Z;92886742930108180
95420017728093680
92042318010622910
95701492698544300
Mais j'aimerais qu'il ressemble plus à ça:
Status;Date d'envoi;Identifiant
sent;2021-03-03T08:15:15Z;92886742930108180
etc.
Mais je ne vois comment faire.
Dernière modification par bierzo (Le 03/03/2021, à 14:52)
Hors ligne
#4 Le 03/03/2021, à 17:05
- Watael
Re : Question jq sur un json en sortie d'un curl
$ jq -r '.Data[]|[.Status,.ArrivedAt,.ID]|@csv' /tmp/mail.json
en fait :
$ curl 'taRequete...' | jq -r '.Data[]|[.Status,.ArrivedAt,.ID]|@csv'
Dernière modification par Watael (Le 03/03/2021, à 17:28)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 08/03/2021, à 09:49
- bierzo
Re : Question jq sur un json en sortie d'un curl
Nickel, merci beaucoup pour l'aide
Hors ligne