Saya mencoba membuat skrip yang mengambil beberapa umpan atom dan mempostingnya ke slack melalui Slack API melalui curl
. Apa yang saya miliki sekarang berfungsi untuk teks sederhana, tetapi beberapa di antaranya memiliki tanda kutip ganda atau &
karakter di dalamnya dan itu tampaknya mengganggu slack API karena saya mendapatkan invalid payload
kesalahan. Ini skrip saya:
#!/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
Output dari "echo" adalah:
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
Saya tidak mahir dalam skrip bash dan saya butuh sedikit bantuan. Apa yang saya lakukan salah?
Terima kasih!
Jawaban yang Diterima:
Anda perlu url-encode data, dan cara termudah untuk melakukannya adalah dengan mendapatkan curl
untuk melakukannya dengan mengganti -d
pilihan dengan --data-urlencode
.
Juga, Anda perlu menggunakan tanda kutip ganda atau shell tidak akan memperluas variabel, jadi kami memiliki
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
Anda juga dapat menyederhanakan pengaturan payload=
dengan memiliki bagian dari string di dalam tanda kutip tunggal, dan bagian dalam tanda kutip ganda, asalkan tidak ada spasi di antara
bagian, seperti dalam '...'"..."'...'
. Jadi, kita mendapatkan
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Anda mungkin perlu menghindari tanda kutip ganda di data
, mungkin dengan , karena mereka akan berada di dalam
""
dalam string json.
data='Something "&" and something do " "'
Jika Anda telah membaca data Anda dari input ke variabel line
, Anda dapat melakukan penggantian ini dengan bash:
line=${line//"/\"}