J'essaie de créer un script qui prend des flux d'atomes et les publie pour se détendre via l'API Slack via curl
. Ce que j'ai maintenant fonctionne pour des textes simples, mais certains d'entre eux ont des guillemets doubles ou &
caractères en eux et cela semble gêner l'API lâche car j'obtiens une invalid payload
Erreur. Voici mon script :
#!/bin/bash
rsstail -i 3 -u "http://MY_FEED_URL" -n 0 | while read line;
do
# This is just a sample text, it should be ${line}
data='Something "&" and something do " "';
payload="payload={"channel": "#my_channel", "username": "Bot", "text": "${data}", "icon_emoji": ":ghost:"}";
echo ${payload};
curl
-H "Accept: application/json"
-X POST
-d '${payload}'
https://hooks.slack.com/services/xxxx
La sortie de "l'écho" est :
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
Je ne suis pas avancé dans les scripts bash et j'ai besoin d'un peu d'aide. Qu'est-ce que je fais de mal ?
Merci !
Réponse acceptée :
Vous devez coder en URL les données, et le moyen le plus simple de le faire est d'obtenir curl
pour le faire en remplaçant le -d
option par --data-urlencode
.
De plus, vous devez utiliser des guillemets doubles ou le shell ne développera pas la variable, nous avons donc
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
Vous pouvez également simplifier la configuration de payload=
en plaçant une partie de la chaîne entre guillemets simples et une partie entre guillemets doubles, à condition qu'il n'y ait pas d'espace entre
les parties, comme dans '...'"..."'...'
. Donc, nous obtenons
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Vous devez probablement échapper les guillemets doubles dans data
, peut-être avec , car ils seront à l'intérieur de
""
dans une chaîne json.
data='Something "&" and something do " "'
Si vous avez lu vos données depuis l'entrée dans la variable line
, vous pouvez effectuer ce remplacement avec bash :
line=${line//"/\"}