bash - 为 slack bot 创建 jq json

标签 bash ubuntu jq webhooks slack

更新:我得到了这个工作并发布了一个答案。
我正在尝试使用 bash 脚本中的 jq 为 slack 机器人创建一个 Markdown block 。我发现的大多数教程都是用于阅读 json,但我正在尝试创建 json。
我很接近,但我仍然做错了什么。这是 desired slack format ,我复制了下面的相关部分:

{
    "text": "Danny Torrence left a 1 star review for your property.",
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "Danny Torrence left the following review for your property:"
            }
        },
这是我的脚本的一部分:
FALLBACK_MESSAGE="TEST MESSAGE - $HOSTNAME"
FIRST_INNER_SECTION=$(jq -n --arg secType "mrkdwn" --arg textVal "Hi\nperson\n<@U12345789>" '{type: $secType, text: $textVal}')
FIRST_OUTER_SECTION=$(jq -n --arg secType "section" --arg textVal "$FIRST_INNER_SECTION" '{type: $secType, text: $textVal}')
echo $FIRST_INNER_SECTION
echo $FIRST_OUTER_SECTION
MY_STR=$(jq -n --arg text "$FALLBACK_MESSAGE" --arg blocks "$FIRST_OUTER_SECTION" '{text: $text, blocks: [$blocks]}');
echo $MY_STR
curl -X POST -H 'Content-type: application/json' --data "$MY_STR" https://hooks.slack.com/services/123456789
我收到无效的 block 格式错误。我认为这是由于创建了多个字符串并试图将它们与 jq 结合起来(看到很多斜杠和换行符)。我尝试使用除 -n 之外的其他标志,但它们不起作用。我现在将尝试创建一个巨型字符串,但更愿意像我所做的那样将其拆分。这里有什么帮助吗?
更新 Megastring 工作。仍然想找到一种更好地格式化它的方法。
JSON_STRING=$( jq -n --arg fallbackText "Fallback message" --arg sectionType "section" --arg markdownType "mrkdwn" --arg textType "test" '{text: $fallbackText, blocks: [{type: $sectionType, text: {type: $markdownType, text: $textType}}]}')
echo $JSON_STRING
curl -X POST -H 'Content-type: application/json' --data "$JSON_STRING" https://hooks.slack.com/services/12345678

最佳答案

好吧,我想通了。我会留下这个,以防它对任何人有帮助。
有关转义 Markdown 字符串的说明,请参见 this post

# Setup messages
fallback_message="TEST MESSAGE - $HOSTNAME"
markdown_message="TEST MESSAGE - $HOSTNAME \n Hi <@U12345678>\n\`\`\`Can we do a\nmultiline code block\`\`\`"

# Convert markdown message to correct format for jq parse
printf -v markdown_message_unescaped %b "$markdown_message"

# Create the json string
json_string=$( jq -nr \
    --arg jq_fallback_message "$fallback_message" \
    --arg jq_section_type "section" \
    --arg jq_markdown_type "mrkdwn" \
    --arg jq_markdown_message "$markdown_message_unescaped" \
    '{
        text: $jq_fallback_message, 
        blocks: [
            {
                type: $jq_section_type,
                text: {
                    type: $jq_markdown_type, 
                    text: $jq_markdown_message
                }
            }
        ]
    }')

# Echo and send to slack
echo $json_string
curl -X POST -H 'Content-type: application/json' --data "$json_string" https://hooks.slack.com/services/123456789

关于bash - 为 slack bot 创建 jq json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67389971/

相关文章:

linux - Ubuntu 和拉撒路

MySql 导入卡住

linux - 通过无密码的 ssh 连接(rpm 安装)

bash - 我如何在golang中运行shell命令

c# - 单声道/WCF : Cannot determine caller IP on Ubuntu

jq 选择数组不包含字符串的元素

linux - 在linux中抑制JQ​​解析错误信息

json - 有没有办法获取 JSON 值中特定元素的路径?

linux - 如何使用 bash 监视目录中新创建的文件?

bash - Azure CLI 阻止虚拟机执行 bash 的速度非常慢