いくつかのアトムフィードを取得し、 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//"/\"}