You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Discord Webhook的JSON请求体无效?此前相似请求可正常运行

解决Discord Webhook JSON无效错误(代码50109)

核心问题分析

你的备份完成通知JSON存在两个关键语法问题:

  • 数组末尾多余逗号:fields数组的最后一项("Finished"字段)后保留了尾随逗号,JSON语法明确禁止数组最后一个元素后加逗号。
  • 手动拼接JSON的风险:直接用Shell变量拼接JSON字符串,当变量包含空格、引号或特殊字符时,会直接破坏JSON结构,即便启动通知暂时能运行,也属于潜在隐患。

修复方案

第一步:移除尾随逗号(快速临时修复)

找到备份完成通知里的这段代码,删除最后一个字段后的逗号:

{
  "name": "Finished",
  "value": "Finished backup on '"$END_DATE"' at '"$END_TIME"'"
},  # 删掉这个多余的逗号

第二步:用jq安全构造JSON(推荐长期方案)

手动拼接JSON极易出错,改用jq工具生成规范JSON,能自动处理引号转义、特殊字符等问题。修改send_notification函数如下:

send_notification() {
  output_transferred_main=${rclone_sani_command#*Transferred: }
  output_transferred_main=${output_transferred_main% Errors*}
  output_errors=${rclone_sani_command#*Errors: }
  output_errors=${output_errors% Checks*}
  output_checks=${rclone_sani_command#*Checks: }
  output_checks=${output_checks% Transferred*}
  output_transferred=${rclone_sani_command##*Transferred: }
  output_transferred=${output_transferred% Elapsed*}
  output_elapsed=${rclone_sani_command##*Elapsed time: }

  # 用jq生成合规JSON,自动处理转义逻辑
  notification_data=$(jq -n \
    --arg username "$DISCORD_NAME_OVERRIDE" \
    --arg avatar "$DISCORD_ICON_OVERRIDE" \
    --arg src "$SOURCE_DIR" \
    --arg dest "$DESTINATION_DIR" \
    --arg transfer_main "$output_transferred_main" \
    --arg errors "$output_errors" \
    --arg checks "$output_checks" \
    --arg transfer "$output_transferred" \
    --arg elapsed "$output_elapsed" \
    --arg end_date "$END_DATE" \
    --arg end_time "$END_TIME" \
    '{
      username: $username,
      avatar_url: $avatar,
      content: null,
      embeds: [
        {
          title: "Rclone Local Backup: Finished!",
          color: 65408,
          fields: [
            {name: "Directories synced", value: "\($src) to \($dest)"},
            {name: "Transferred", value: $transfer_main},
            {name: "Errors", value: $errors},
            {name: "Checks", value: $checks},
            {name: "Transferred", value: $transfer},
            {name: "Elapsed time", value: $elapsed},
            {name: "Finished", value: "Finished backup on \($end_date) at \($end_time)"}
          ],
          thumbnail: {url: null}
        }
      ]
    }')

  curl -H "Content-Type: application/json" -d "$notification_data" "$DISCORD_WEBHOOK_URL"
}

额外优化:启动通知同步改用jq(可选)

虽然启动通知暂时能运行,但同样存在手动拼接的风险,建议同步修改:

send_notification_start() {
  notification_data=$(jq -n \
    --arg username "$DISCORD_NAME_OVERRIDE" \
    --arg avatar "$DISCORD_ICON_OVERRIDE" \
    --arg src "$SOURCE_DIR" \
    --arg dest "$DESTINATION_DIR" \
    --arg start_date "$START_DATE" \
    --arg start_time "$START_TIME" \
    '{
      username: $username,
      avatar_url: $avatar,
      content: null,
      embeds: [
        {
          title: "Rclone Local Backup: Started!",
          color: 4094126,
          fields: [
            {name: "Started", value: "Started backup on \($start_date) at \($start_time)"},
            {name: "Directories being synced", value: "\($src) to \($dest)"}
          ],
          thumbnail: {url: null}
        }
      ]
    }')

  curl -H "Content-Type: application/json" -d "$notification_data" "$DISCORD_WEBHOOK_URL"
}

验证方法

修改后可先将notification_data输出到终端,复制到JSON验证工具检查语法,或直接执行脚本测试Discord通知是否正常发送。

内容的提问来源于stack exchange,提问作者dezerving

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:45:46