カールを介してエスケープされた文字列を公開する

カールを介してエスケープされた文字列を公開する

いくつかのアトミックフィードを取得してSlackに公開するスクリプトを作成しようとしています。Slack API通過するcurl。今私が持っているのは単純なテキストに対してうまくいきますが、その一部には二重引用符や&文字が含まれているため、エラーが発生したときにSlack APIを迷惑にするようですinvalid payload。これは私のスクリプトです。

#!/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

「echo」の出力は次のようになります。

payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}

私はBashスクリプトに慣れていないので、少し助けが必要です。私は何が間違っていましたか?

ありがとうございます!

ベストアンサー1

データをURLにエンコードする必要があります。最も簡単な方法はcurlオプション-dをに置き換えることです--data-urlencode。また、二重引用符を使用する必要があります。それ以外の場合、シェルは変数を拡張しないので、

curl \
    -H "Accept: application/json" \
    -X POST \
    --data-urlencode "${payload}" \
    https://hooks.slack.com/services/xxxx

に示すように、文字列の一部を一重引用符で囲み、一部を二重引用符で囲むことで設定を簡素化することもできます。payload=ただし、部分の間にスペースを入れないでください'...'"..."'...'。だから我々は得る。

payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'

json文字列に含まれるため、二重引用符をエスケープする必要があるかもしれませんdata\""

data='Something \"&\" and something do \" \"'

変数入力からデータを読み取ったら、linebashを使用して次のように置き換えることができます。

line=${line//\"/\\\"}

おすすめ記事