일부 원자 피드를 가져와서 Slack에 게시하는 스크립트를 만들려고 합니다.슬랙 API통과하다 curl
. 지금 내가 가지고 있는 것은 간단한 텍스트에 대해 작동하지만 그 중 일부에는 큰따옴표나 &
문자가 포함되어 있어 오류가 발생할 때 슬랙 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 \" \"'
변수 입력에서 데이터를 읽었다면 line
bash를 사용하여 다음과 같이 대체할 수 있습니다.
line=${line//\"/\\\"}