Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/03/2021, à 13: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, à 13:38)

Hors ligne

#2 Le 03/03/2021, à 13: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, à 13:47)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 03/03/2021, à 14: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, à 15:52)

Hors ligne

#4 Le 03/03/2021, à 18: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, à 18:28)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 08/03/2021, à 10:49

bierzo

Re : Question jq sur un json en sortie d'un curl

Nickel, merci beaucoup pour l'aide smile

Hors ligne