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//"/\"}