Why is my JSON request body showing as invalid when earlier, a similar request is working?

879 Views Asked by At

I have the following code snippet where I'm trying to send notification data to a discord webhook, but it is returning {"code": 50109, "message": "The request body contains invalid JSON."}%.

Here is the non-working code (bolded the JSON request part):

if [ "$DISCORD_WEBHOOK_URL" != "" ]; then
    rclone_sani_command="$(echo $rclone_command | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g')" # Remove all escape sequences
    # Notifications assume following rclone ouput:
    # Transferred: 0 / 0 Bytes, -, 0 Bytes/s, ETA - Errors: 0 Checks: 0 / 0, - Transferred: 0 / 0, - Elapsed time: 0.0s
    transferred_amount=${rclone_sani_command#*Transferred: }
    transferred_amount=${transferred_amount%% /*}
**    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: }
      notification_data='{
            "username": "'"$DISCORD_NAME_OVERRIDE"'",
            "avatar_url": "'"$DISCORD_ICON_OVERRIDE"'",
            "content": null,
            "embeds": [
              {
                "title": "Rclone Local Backup: Finished!",
                "color": 65408,
                "fields": [
                  {
                    "name": "Directories synced",
                    "value": "'"$SOURCE_DIR"' to '"$DESTINATION_DIR"'"
                  },
                  {
                    "name": "Transferred",
                    "value": "'"$output_transferred_main"'"
                  },
                  {
                    "name": "Errors",
                    "value": "'"$output_errors"'"
                  },
                  {
                    "name": "Checks",
                    "value": "'"$output_checks"'"
                  },
                  {
                    "name": "Transferred",
                    "value": "'"$output_transferred"'"
                  },
                  {
                    "name": "Elapsed time",
                    "value": "'"$output_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
    }**
    if [ "$transferred_amount" != "0" ]; then
      send_notification
    fi
  fi
  rm -f "$LOCK_FILE"
  trap - SIGINT SIGTERM
  exit
fi

Earlier in the same script, the following code snippet does correctly send a notification to discord:

  touch "$LOCK_FILE"
  echo "Starting to backup $SOURCE_DIR to $DESTINATION_DIR on $START_DATE at $START_TIME" | tee -a $LOG_FILE
  **send_notification_start() {
    notification_data='{
          "username": "'"$DISCORD_NAME_OVERRIDE"'",
          "avatar_url": "'"$DISCORD_ICON_OVERRIDE"'",
          "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": "'$SOURCE_DIR' to '$DESTINATION_DIR'"
                }
              ],
              "thumbnail": {
                "url": null
              }
            }
          ]
        }'
        curl -H "Content-Type: application/json" -d "$notification_data" $DISCORD_WEBHOOK_URL
  }**

I've tried messing with the quotes and other characters to see if that is the issue but I am unable to figure out why this JSON request body is incorrect.

Running either of those two JSON snippets themselves (bolded) through a JSON validator I just get that it is incorrectly parsing right the beginning (even though the latter is working fine).

I am pretty new to using JSON but I wanted to just get a notification sent to discord when my script finishes backing up with some details on what exactly occurred.

1

There are 1 best solutions below

0
On

Your last JSON bracket here:

              {
                "name": "Finished",
                "value": "Finished backup on '"$END_DATE"' at '"$END_TIME"'"
              },

has a comma following it.

The final } should not have a comma after, so it should be:

              {
                "name": "Finished",
                "value": "Finished backup on '"$END_DATE"' at '"$END_TIME"'"
              }

Hope that helps.