使用 curl 在 Slack 上发布文件的一部分

问题描述 投票:0回答:3

我想使用 curl 将给定行号后的文件内容发送到 Slack。我希望它在一些消息后被格式化为代码。 ChatGPT 在这里无法提供帮助。我使用的代码是:

log_text=$(awk -v n="$some_number" 'NR >= n' "$log_file" )

# Handle line breaks and special characters:
#log_text=$(printf '%s' "$log_text" | jq -Rs .) # Doesn't work
#log_text=$(printf '%s' "$log_text" | sed 's/"/\\"/g; s/$/\\n/' | tr -d '\n')  # Also doesn't work
log_text=$(echo "$log_text" | jq -R -s -c)  # Doesn't work as well
echo "============================"
echo "$log_text"
echo "============================"
curl -s -f  --retry 2 -X POST -H 'Content-type: application/json' --data "{\"text\": \" some text here  \`\`\`$log_text\`\`\` \"}" \
"$slack_hook" || echo "Failed to send message"

这样总是发送消息失败。如果我设置

log_text=""
那么它就可以正常工作,所以我假设
log_text
中的内容格式存在一些问题。该文件有几个特殊字符换行符等,但我想在 json 上整齐地发送它,以便可以在 Slack 上读取它。这是怎么回事?

json windows bash curl mingw
3个回答
0
投票

我建议避免在 curl 命令中使用模板生成器,而是使用单个参数。

代替:

curl -s -f  --retry 2 -X POST -H 'Content-type: application/json' --data "{\"text\": \" some text here  \`\`\`$log_text\`\`\` \"}"

你可以这样做:

curl -s -f  --retry 2 -X POST -H 'Content-type: application/json' --data "$log_text_2"

在这种情况下,您可以打印

$log_text_2
以获得对问题所在的一些见解。我认为可能有一些转义字符导致了这个问题。


0
投票

什么最终起作用了(不知道为什么):

首先复制斜杠,然后将所有换行符替换为' ':

log_text="$(printf '%s' "$log_text" | sed 's/\\/\\\\/g' | sed ':a;N;$!ba;s/\n/\\n/g' )"

然后使用一个变量来创建整个payload,这样更容易调试:

json_string="{\"text\": \" some text \\n \`\`\`$log_text\`\`\` \"}"

最后发消息:

curl -s -f  --retry 2 -X POST -H 'Content-type: application/json' --data "$json_string"

0
投票

ChatGPT 永远不会为您做的是编写带有解释的工作代码,以便您学到一些东西

cat sendlog.sh

#!/usr/bin/env sh

SLACK_API=https://example.com/

start_line=${1:-0}
start_line=${start_line##[^[:digit:]]}

{
  # Print markdown start code block with no syntax highlight
  printf '```none\n'

  # Insert content of input file starting at line
  tail "-n+${start_line}"

  # Print markdown end code block
  printf '```\n'
} |

  # Get all of it piped to jq and handled as Raw text
  # and inserted in a JSON object
  jq -sR '{"file":.}' |

  # Send the piped-in JSON data
  curl -s -f --retry 2 \
    -X POST -H 'Content-type: application/json' \
    --data-binary @- "$SLACK_API"

从第42行开始发送

somefile.log
内容的例子:

bash sendlog.sh 42 < somefile.log
© www.soinside.com 2019 - 2024. All rights reserved.