Estoy tratando de hacer un script que tome algunos feeds atom y los publique en Slack a través de la API de Slack a través de curl
. Lo que tengo ahora funciona para textos simples, pero algunos de ellos tienen comillas dobles o &
caracteres en ellos y eso parece molestar a la API floja ya que obtengo una invalid payload
error. Aquí está mi guión:
#!/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 salida del “eco” es:
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
No estoy avanzado en bash scripting y necesito un poco de ayuda. ¿Qué estoy haciendo mal?
¡Gracias!
Respuesta aceptada:
Necesita codificar los datos en URL, y la forma más fácil de hacerlo es obtener curl
para hacerlo reemplazando el -d
opción por --data-urlencode
.
Además, debe usar comillas dobles o el shell no expandirá la variable, por lo que tenemos
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
También puede simplificar la configuración de payload=
al tener parte de la cadena entre comillas simples y parte entre comillas dobles, siempre que no haya espacio entre
las partes, como en '...'"..."'...'
. Entonces, obtenemos
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Probablemente necesite escapar de las comillas dobles en data
, quizás con , ya que estarán dentro de
""
en una cadena json.
data='Something "&" and something do " "'
Si ha leído sus datos desde la entrada en la variable line
, puedes hacer este reemplazo con bash:
line=${line//"/\"}