为何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
相关产品推荐
相关产品推荐

