# Argument shell curl dans un AppleScript



## onilov (17 Mai 2019)

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 : 

```
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 : 

```
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 (17 Mai 2019)

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.


----------



## onilov (17 Mai 2019)

Romuald a dit:


> 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.



Merci Romuald, mais ca ne marche pas...


----------



## zeltron54 (18 Mai 2019)

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.


```
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
```


----------



## zeltron54 (18 Mai 2019)

Essai avec les lignes de ce style .


```
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 (18 Mai 2019)

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 : 

```
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 : 

```
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) : 

```
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 (18 Mai 2019)

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.


----------



## onilov (18 Mai 2019)

zeltron54 a dit:


> 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.



Merci en tout cas d'avoir essayé !


----------



## zeltron54 (18 Mai 2019)

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 !


```
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 (18 Mai 2019)

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 : 

```
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 (18 Mai 2019)

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 (18 Mai 2019)

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)

```
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 (18 Mai 2019)

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 (18 Mai 2019)

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 :

```
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 (18 Mai 2019)

Je viens de tester pour que ça passe j'ai inclus les apostrophes dans la variable json ce qui donne:


```
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 (18 Mai 2019)

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 : 

```
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 (18 Mai 2019)

Ok ! si tu as trouvé une solution, c'est parfait...
Je laisse donc tombé !

Bonne soirée et bonne programmation...


----------



## onilov (18 Mai 2019)

zeltron54 a dit:


> Ok ! si tu as trouvé une solution, c'est parfait...
> Je laisse donc tombé !
> 
> Bonne soirée et bonne programmation...



Merci à toi zeltron54 ! 
Je te paye une bière virtuelle !


----------



## onilov (19 Mai 2019)

Pour information, j'ai finalement la solution, comme je disais plus haut. 
Enregistrer le json "data.json", puis : 
	
	



```
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.


----------



## Romuald (19 Mai 2019)

As-tu vu ça ?
https://serverfault.com/questions/875445/how-to-add-single-quote-inside-of-a-bash-variable


----------

