Sto cercando di creare uno script che prenda alcuni feed atomi e li pubblichi per slack tramite l'API Slack tramite curl
. Quello che ho ora funziona per testi semplici, ma alcuni di essi hanno virgolette o &
caratteri al loro interno e questo sembra infastidire l'API slack poiché ottengo un invalid payload
errore. Ecco il mio copione:
#!/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
L'output dell'”eco” è:
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
Non sono avanzato nello scripting bash e ho bisogno di un po' di aiuto. Cosa sbaglio?
Grazie!
Risposta accettata:
Devi codificare l'URL dei dati e il modo più semplice per farlo è ottenere curl
per farlo sostituendo -d
opzione di --data-urlencode
.
Inoltre, devi usare le virgolette doppie o la shell non espanderà la variabile, quindi abbiamo
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
Puoi anche semplificare l'impostazione di payload=
avendo parte della stringa tra virgolette singole e parte tra virgolette doppie, a condizione che non vi sia spazio tra
le parti, come in '...'"..."'...'
. Quindi, otteniamo
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Probabilmente devi evitare le virgolette in data
, magari con , poiché saranno all'interno di
""
in una stringa json.
data='Something "&" and something do " "'
Se hai letto i tuoi dati dall'input nella variabile line
, puoi eseguire questa sostituzione con bash:
line=${line//"/\"}