У меня есть API-интерфейс монитора (например: www.example.com/monitor), который хорошо возвращает статус системы в формате JSON, например:
{
"foo" : 1000,
"bar" : 100
}
Я хочу использовать curl для получения статуса системы из этого API и передачи в Slack.
Ниже приведен мой текущий сценарий.
status=$(curl "http://www.xample.com/monitor/status" )
slackWebHook = "https://hooks.slack.com/services/xxxxx/xxxxx/xxxxx"
function sentSlack () {
json_template='{
channel: $channel,
username: $username,
text: $text,
icon_emoji: $icon_emoji,
attachments: [$attachments]
}'
jq -n --arg channel "#unicorn_log" \
--arg username "Kuasa Search Report" \
--arg text "${msg}"\
--arg icon_emoji "chart_with_upwards_trend" \
--arg attachments "${status}" "$json_template" |
curl -i -X POST --data-urlencode "$(</dev/stdin)" ${slackWebHook}
}
sentSlack
Я всегда получаю недопустимая_полезная нагрузка , потому что статус экранируется.
{
\"foo\" : 1000,
\"bar\" : 100
}
Как правильно передать JSON в полезную нагрузку Slack?
--arg key value
рассматривает значение как строку. Поскольку строка, содержащая литерал "
, должна быть дополнена экранированием, чтобы быть допустимой в JSON, именно это и делает jq
.
--argjson key value
, напротив, анализирует value
как текст JSON; что, кажется, то, что вы хотите сделать здесь.
Замените --arg attachments "$status"
на --argjson attachments "$status"
.
спасибо, я меняю на --argjson и повторяю результат echo $(</dev/stdin), и это кажется правильным, но все равно получаю invalid_payload
Можете ли вы заставить curl работать вручную, поэтому единственный вопрос заключается в том, как заставить вывод jq соответствовать заведомо хорошему примеру? В противном случае мы потенциально находимся в пространстве, где кому-то нужно знать API Slack, а не только jq или bash.
@howie, ... тем не менее, вопрос об API вполне может подойти для сайта - если вы в конечном итоге пришли к выводу, что застряли в понимании того, как использовать curl для отправки этого сообщения даже после исключения jq
и bash
-специфических частей из вопроса, не стесняйтесь редактировать вопрос, чтобы сосредоточиться на этой нерешенной проблеме; Я снова открою его и удалю этот ответ.
хорошо~ Я проверю, что не так с slack API~:D
Неважно для вашего вопроса, но в стороне,
function name() {
объединяет два разных варианта синтаксиса - устаревший синтаксис kshfunction name {
и синтаксис, совместимый с POSIXname() {
- в комбинации, которая несовместима с устаревшим либо ksh или POSIX sh стандарт. (Более того, bash не учитывает особое значениеfunction
в ksh, контролируя, являются ли переменныеdeclare
d локальными по умолчанию). Лучше придерживаться одного или другого; см. wiki.bash-hackers.org/scripting/устаревший