Argument shell curl dans un AppleScript

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
Bonjour,

Je dois envoyer un json (que j'ai en string) sur un webhook. Ce json est entièrement variable, jamais le même, et peut contenir des apostrophes.

Or, l'apostrophe marque la fin de l'argument curl. Donc quand mon json comporte une apostrophe, le shell plante.

Cet exemple plante :
Bloc de code:
set lien to "https://webhooklink"
set json to "{\"mot 1\":\"l'avion\",\"mot 2\":\"Jean-Michel\"}"
set lePost to do shell script "curl -d '" & json & "' -H \"Content-Type: application/json\" -X POST" & lien
Avec pour erreur, logique :
Bloc de code:
error "sh: -c: line 0: unexpected EOF while looking for matching `\"'
sh: -c: line 1: syntax error: unexpected end of file" number 2
Retirer l'apostrophe de "l'avion" passe sans aucun problème.

J'ai essayé d'entourer mon json de " plutôt que de '. Et à ce moment là, j'ai aussi une erreur, car forcément, cette fois c'est les guillemets du json qui ne passent pas...

Quelqu'un aurait-il une idée pour faire passer cette apostrophe ? (Quelque chose du genre faire passer ' à l'intérieur d'une chaine dans des ' ')

Merci d'avance pour vos réponses et pistes de recherche
 

Romuald

Bof...
Club MacG
14 Septembre 2006
8 689
2 662
Quand je codais en assembleur et qu'on avait le même genre de problème, on en mettait trois à la suite : '''
Peut-être que ça marche aussi avec apple script.
 

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Bonjour,
Dans la commande do shell script il faut mettre l'antislash et l'apostrophe, mais pas directement, tu mets les caractères dans des variables et tu construit ta variable avant de la passer.
Je te met un exemple ce sera plus clair, avant une commande echo et sed qui modifie la phrase d'entrée "bonjour l'avion est bleu" en bonjour l'avion est blanc.

Bloc de code:
tell application "Finder"

    set aa to ASCII character (39) -- code apostrophe
    set bb to ASCII character (92) -- code antislash
  
    set cmd to "echo bonjour l" & bb & aa & " avion est bleu | sed s/bleu/blanc/"
    do shell script cmd
  
end tell
 
Dernière édition:

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Essai avec les lignes de ce style .

Bloc de code:
set aa to ASCII character (39) -- code apostrophe
    set bb to ASCII character (92) -- code antislash
set json to "{\"mot 1\":\"l" & bb & aa & "avion\",\"mot 2\":\"Jean-Michel\"}"
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
Merci zeltron54, malheureusement, ca ne marche pas dans mon cas.
Ca marche effectivement pour un echo, car les arguments passés (la phrase) ne sont pas mis entre apostrophes.
La commande curl peut prendre du sans apostrophe en argument uniquement pour une string sans espace. A partir du moment ou il y a un espace, on peut soit utiliser les guillemets, soit les apostrophes.

Par exemple avec say, ceci fonctionne :
Bloc de code:
set aa to ASCII character (39) -- code apostrophe
set bb to ASCII character (92) -- code antislash
set cmd to "say l" & bb & aa & "avion"
do shell script cmd
Ceci aussi avec apostrophes encadrantes :
Bloc de code:
set aa to ASCII character (39) -- code apostrophe
set cmd to "say 'la voiture' "
do shell script cmd
Mais pas ceci (apostrophe codée en ASCII à l'intérieur d'apostrophes encadrantes) :
Bloc de code:
set aa to ASCII character (39) -- code apostrophe
set bb to ASCII character (92) -- code antislash
set cmd to "say 'l" & bb & aa & "avion' "
do shell script cmd
 

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Alors, désolé, je n'ai pas de solution à te proposer.
Mais dés que j'ai un peu de temps, (par curiosité) je vais chercher

Bonne soirée.
 

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Coucou je viens d'essayer en ajoutant les apostrophes d'encadrement avec les codes ascii (antislash plus apostrophe) ça marche !
Ton dernier exemple:
J'ai ajouté un display dialog pour voir la tête de la variable !

Bloc de code:
set aa to ASCII character (39) -- code apostrophe
set bb to ASCII character (92) -- code antislash


set cmd to "say " & bb & aa & "l" & bb & aa & "avion" & bb & aa
display dialog cmd
do shell script cmd
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
Argh, désolé zeltron54, ça marche parce que tu n'as pas mis d'apostrophe d'encadrement, car tu mets aussi l'antislash. Tu as mis aa & bb, soit \', il faudrait juste aa
L'argument n'est donc pas encadré, et est une chaine de caractère.

Donc ceci ne fonctionne pas :
Bloc de code:
set aa to ASCII character (39) -- code apostrophe
set bb to ASCII character (92) -- code antislash

set cmd to "say " & aa & "l" & bb & aa & "avion" & aa
log cmd
do shell script cmd
En fait je pense que mon problème n'est pas vraiment sur l'AppleScript, mais plus sur le shell et le curl.

Merci encore zeltron54 !
 

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Dommage , il me semblait que en mettant l'antislash l'apostrophe ne serait pas interprété comme fin de chaine et donc devait passer.

je ne connaît pas assez le shell et curl, il me faudrait avoir un exemple qui fonctionne sans l'apostrophe que je puisse faire des tests... si tu as ça ?
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
D'accord, alors pour tester avec le curl, voici un exemple.
Webhook.site permet de créer un webhook de test, et de voir les résultats. En cliquant sur ce lien tu vas pouvoir voir toutes les requêtes que tu as testées.

Et voici le bout de code qui marche (car il n'y a pas l'apostrophe dans lavion)
Bloc de code:
set lien to "https://webhook.site/0bde2334-367a-4528-acab-3fdb5a2ae566"
set json to "{\"mot 1\":\"lavion\",\"mot 2\":\"Jean-Michel\"}"
set lePost to do shell script "curl -d '" & json & "' -H \"Content-Type: application/json\" -X POST     " & lien
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
Je me dis que finalement le json est peut-être pas la bonne solution du coup. Il faudra que j'essaye de poster sur le webhook en url encoded
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
C'est bon j'ai une solution. C'est pas la solution, je ne sais toujours pas comment faire pour du json.
Mais j'ai trouvé comment envoyer mes apostrophes sur le webhook : passer par l'URL encode.
Je transforme mon json en URL, et je post au format URL encoded.

Derrière, le serveur interprète sans problème l'url encoded. Ceci fonctionne :
Bloc de code:
set lien to "https://webhook.site/0bde2334-367a-4528-acab-3fdb5a2ae566/"
set toPost to "mot%201=l%27avion&mot%202=Jean-Michel"
set lePost to do shell script "curl -d \"" & toPost & "\" -H \"Content-Type: application/x-www-form-urlencoded\" -X POST " & lien
Merci beaucoup zeltron54 pour ton aide précieuse !
 

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Je viens de tester pour que ça passe j'ai inclus les apostrophes dans la variable json ce qui donne:

Bloc de code:
set lien to "https://webhook.site/0bde2334-367a-4528-acab-3fdb5a2ae566"
set aa to ASCII character (39) -- code apostrophe
set bb to ASCII character (92) -- code antislash

set json to aa & "{\"mot 1\":\"l" & bb & aa & "avion\",\"mot 2\":\"Jean-Michel\"}" & aa

set lePost to do shell script "curl -d '" & json & "' -H \"Content-Type: application/json\" -X POST     " & lien
Edit: nos réponses ce sont croisées, donc solutions au pluriel ...
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
Ta solution ne fait passer qu'une seule ligne du Json, et sans les guillemets ni accolades, ce qui ne permet pas au webhook de comprendre la data.
Pour rester au json, je pense qu'il faudrait que j'enregistre le json, puis que je poste le fichier comme ceci :
Bloc de code:
curl -d "@data.json" -X POST http://webhooklink
Mais ne t'embête pas plus ! (sauf si ca t'intéresse vraiment)
J'ai peut-être pas la solution pour faire passer le json, mais j'ai une solution à mon problème
 

zeltron54

Membre d’élite
29 Mars 2008
1 755
262
Lorraine
Ok ! si tu as trouvé une solution, c'est parfait...
Je laisse donc tombé !

Bonne soirée et bonne programmation...
 

onilov

Membre junior
11 Décembre 2004
78
0
Nîmes
Pour information, j'ai finalement la solution, comme je disais plus haut.
Enregistrer le json "data.json", puis :
Bloc de code:
curl -d "@/Users/machin/data.json" -X POST http://webhooklink
Tout les caractères spéciaux (y compris les apostrophes) passent sans aucun problème.