Ich versuche, ein Skript zu erstellen, das einige Atom-Feeds aufnimmt und sie über curl
über die Slack-API an Slack sendet . Was ich jetzt habe, funktioniert für einfache Texte, aber einige von ihnen haben doppelte Anführungszeichen oder &
Zeichen in ihnen und das scheint die Slack-API zu stören, da ich eine invalid payload
erhalte Error. Hier ist mein Skript:
#!/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
Die Ausgabe des „Echos“ ist:
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
Ich bin nicht fortgeschritten im Bash-Scripting und brauche ein wenig Hilfe. Was mache ich falsch?
Danke!
Akzeptierte Antwort:
Sie müssen die Daten per URL codieren, und der einfachste Weg, dies zu tun, ist, curl
abzurufen um dies zu tun, indem Sie das -d
ersetzen Option durch --data-urlencode
.
Außerdem müssen Sie doppelte Anführungszeichen verwenden oder die Shell wird die Variable nicht erweitern, also haben wir
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
Sie können auch das Setzen von payload=
vereinfachen indem ein Teil der Zeichenfolge in einfache Anführungszeichen und ein Teil in doppelte Anführungszeichen gesetzt wird, vorausgesetzt, es gibt kein Leerzeichen zwischen
den Teilen, wie in '...'"..."'...'
. Also bekommen wir
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Wahrscheinlich müssen Sie die doppelten Anführungszeichen in data
maskieren , vielleicht mit , da sie sich in
""
befinden in einer json-Zeichenfolge.
data='Something "&" and something do " "'
Wenn Sie Ihre Daten aus der Eingabe in die Variable line
gelesen haben , können Sie diese Ersetzung mit bash vornehmen:
line=${line//"/\"}