いくつかのアトムフィードを取得し、 curl
を介してSlackAPIを介してそれらをSlackに投稿するスクリプトを作成しようとしています。 。私が今持っているものは単純なテキストで機能しますが、それらのいくつかには二重引用符または&
があります それらの文字は、無効なペイロード
を取得するため、SlackAPIを煩わせるようです。 エラー。これが私のスクリプトです:
#!/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
「エコー」の出力は次のとおりです。
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
私はbashスクリプトの上級者ではないので、少し助けが必要です。何が間違っているのですか?
ありがとう!
承認された回答:
データをURLエンコードする必要があります。これを行う最も簡単な方法は、 curl
を取得することです。 -d
を置き換えることでそれを行う -data-urlencode
によるオプション 。
また、二重引用符を使用する必要があります。そうしないと、シェルが変数を展開しないため、
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
payload =
の設定を簡素化することもできます '...' "..."'...' <のように、文字列の一部を一重引用符で囲み、一部を二重引用符で囲みます。ただし、
部分の間にスペースがない場合に限ります。 / code> 。だから、私たちは
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
おそらくdata
の二重引用符をエスケープする必要があります 、おそらく
、 ""
内にあるため json文字列で。
data='Something "&" and something do " "'
入力から変数line
にデータを読み込んだ場合 、bashでこの置換を行うことができます:
line=${line//"/\"}