In my discord webhook, I am getting the error: {"embeds": ["0"]}

Viewed 10297

I am making a discord webhook for logging something, I have done it with the help of a template (I'm not good at php) and I keep getting the error: {"embeds": ["0"]}

I have already tried researching it, I haven't gotten back anything helpful. Mind the messiness I did this to test.

Here is my code:

<?php
  $url = "https://discordapp.com/api/webhooks/xxx"; // Censored for privacy

  $hookObject = json_encode([
      "username" => "Promotion Logs",
      "avatar_url" => "https://cdn.discordapp.com/icons/472520717515096078/60cc7dd2864c95a749516d1213359b67.png",
      "tts" => false,
      "embeds" => [
          [
              "title" => "Promotion Logs",
              "type" => "rich",
              "description" => "",
              "url" => "http://police.riverside-roleplay.com/promologs.php",
              "color" => hexdec( "0099ff" ),
              "fields" => [
                  [
                      "name" => "Name",
                      "value" => "dd",
                      "inline" => false
                  ],
                  [
                      "name" => "Rank",
                      "value" => "$rank",
                      "inline" => true
                  ],
                  [
                    "name" => "Their name",
                    "value" => "dd",
                    "inline" => true
                ],
                [
                  "name" => "Old rank",
                  "value" => "dd",
                  "inline" => true
              ],
              [
                "name" => "New rank",
                "value" => "dd",
                "inline" => true
            ],
            [
              "name" => "Reason",
              "value" => "dd",
              "inline" => true
          ],
          [
            "name" => "Date",
            "value" => "dd",
            "inline" => true
        ],
            ]
          ]
      ]

  ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );

  $ch = curl_init();

  curl_setopt_array( $ch, [
      CURLOPT_URL => $url,
      CURLOPT_POST => true,
      CURLOPT_POSTFIELDS => $hookObject,
      CURLOPT_HTTPHEADER => [
          "Length" => strlen( $hookObject ),
          "Content-Type" => "application/json"
      ]
  ]);

  $response = curl_exec( $ch );
  curl_close( $ch );

  ?>

Here is the template I was using:

<?php

// Replace the URL with your own webhook url
$url = "https://discordapp.com/api/webhooks/0000000/ABCDEFGH....";

$hookObject = json_encode([
    /*
     * The general "message" shown above your embeds
     */
    "content" => "A message will go here",
    /*
     * The username shown in the message
     */
    "username" => "MyUsername",
    /*
     * The image location for the senders image
     */
    "avatar_url" => "https://pbs.twimg.com/profile_images/972154872261853184/RnOg6UyU_400x400.jpg",
    /*
     * Whether or not to read the message in Text-to-speech
     */
    "tts" => false,
    /*
     * File contents to send to upload a file
     */
    // "file" => "",
    /*
     * An array of Embeds
     */
    "embeds" => [
        /*
         * Our first embed
         */
        [
            // Set the title for your embed
            "title" => "Google.com",

            // The type of your embed, will ALWAYS be "rich"
            "type" => "rich",

            // A description for your embed
            "description" => "",

            // The URL of where your title will be a link to
            "url" => "https://www.google.com/",

            /* A timestamp to be displayed below the embed, IE for when an an article was posted
             * This must be formatted as ISO8601
             */
            "timestamp" => "2018-03-10T19:15:45-05:00",

            // The integer color to be used on the left side of the embed
            "color" => hexdec( "FFFFFF" ),

            // Footer object
            "footer" => [
                "text" => "Google TM",
                "icon_url" => "https://pbs.twimg.com/profile_images/972154872261853184/RnOg6UyU_400x400.jpg"
            ],

            // Image object
            "image" => [
                "url" => "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
            ],

            // Thumbnail object
            "thumbnail" => [
                "url" => "https://pbs.twimg.com/profile_images/972154872261853184/RnOg6UyU_400x400.jpg"
            ],

            // Author object
            "author" => [
                "name" => "Alphabet",
                "url" => "https://www.abc.xyz"
            ],

            // Field array of objects
            "fields" => [
                // Field 1
                [
                    "name" => "Data A",
                    "value" => "Value A",
                    "inline" => false
                ],
                // Field 2
                [
                    "name" => "Data B",
                    "value" => "Value B",
                    "inline" => true
                ],
                // Field 3
                [
                    "name" => "Data C",
                    "value" => "Value C",
                    "inline" => true
                ]
            ]
        ]
    ]

], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );

$ch = curl_init();

curl_setopt_array( $ch, [
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $hookObject,
    CURLOPT_HTTPHEADER => [
        "Length" => strlen( $hookObject ),
        "Content-Type" => "application/json"
    ]
]);

$response = curl_exec( $ch );
curl_close( $ch );

?>

My expected results is to make an embed with the fields I have setup. I had this before then I implemented it to a different page and changed a few things, then it was broken. Actual results is the error {"embeds": ["0"]}

4 Answers

The main problem with your code appear to be that $rank is undefined, as in there's no value in it, so "value" => "$rank", is causing the problem as Discord is expecting a value in it.

Using the code you wrote (and substituting webhook link with functioning link for testing) initially gave a different error:

{"message": "Cannot send an empty message", "code": 50006}

That could be fixed by changing this bit:

      CURLOPT_HTTPHEADER => [
          "Length" => strlen( $hookObject ),
          "Content-Type" => "application/json"
      ]

into this:

      CURLOPT_HTTPHEADER => [
          "Length" => strlen( $hookObject ),
          "Content-Type: application/json"
      ]

After that bit had been changed, it now indeed gave out the error {"embeds": ["0"]} as you described. After I define some value for $rank at top, your code works again. So the actual problem is really that the value is undefined.

See full file comparison between your original code and the edited code on my Gist: https://gist.github.com/mnh48/a707aec600ac74f4e5d50875fcab5d7c

I put 34.2 as example $rank = 34.2;, and the result:

result


For anyone else coming from search engine

I initially got the same error and I had found the reason, but the reason on my side is different from what OP encountered.

Whenever anyone get this response from Discord webhook:

{"embeds": ["0"]}

It can mean two different thing:

  1. There is invalid field being sent in the body
  2. The limit has been exceeded for certain element

For the first case, it can be:

  1. formatting error:

    • wrong format in timestamp, it must be in ISO8601 format
    • wrong format in color, it must be in decimal, anything else are not accepted (yes, even colour name string like "red" are not accepted, convert them to decimal -- red is 16711680, you can use site like SpyColor to check the decimal value)
    • wrong format in icon_url, avatar_url, or url, all of them must be in http://, https://, (additionally for url that expects image, it can be attachment:// so long the image file is also attached to the request)
  2. invalid value:

    • using unexpected values, like passing string instead of boolean for inline (there's two strings accepted, probably for compatibility reason: "true" and "false", but any other strings are not accepted, and it's expecting boolean)
    • empty or null value, if you want it to be empty then don't include it in the first place, or use _ _ as the value
    • undefined value, check that all variables are actually defined

For the second case, the limit is as follows:

  1. The limit for embed titles are 256 characters
  2. The limit for embed descriptions are 2048 characters
  3. Each field's name is limited to 256 characters
  4. Each field's value is limited to 1024 characters
  5. The limit for footer text is 2048 characters
  6. The limit for author name is 256 characters
  7. There can be 25 fields maximum per message
  8. There can be 10 embeds maximum per message
  9. Total characters overall must not exceed 6000 characters

In my case, it was the latter. I set my email client to send the content of the email as Discord Webhook in embeds > fields > value, and it was passing the whole long email message. The value field has maximum character limit of 1024 but my email content message had 1565 characters.

I was getting the same error and the problem for me was using env vars in my JSON.

You'll get an error back if url fields aren't valid urls.

e.g "url":"$SOME_VAR"

I believe that this can also happen with other types too!

For anyone else coming across this from google:

Response from API:

{"embeds": ["0"]}

The issue for me was that I was using a float number vars in my JSON.

Wrong json:

{
    "allowed_mentions": {
        "parse": [
            "everyone"
        ]
    },
    "embeds": [
        {
            "author": {
                "name": "Name"
            },
            "title": "Title",
            "color": "51281",
            "fields": [
                {
                    "name": "Label",
                    "value": 648.2,
                    "inline": true
                }
            ]
        }
    ]
}

Right json

{
    "allowed_mentions": {
        "parse": [
            "everyone"
        ]
    },
    "embeds": [
        {
            "author": {
                "name": "Name"
            },
            "title": "Title",
            "color": "51281",
            "fields": [
                {
                    "name": "Label",
                    "value": 648,
                    "inline": true
                }
            ]
        }
    ]
}

For anyone coming from Google, I got the same error when the url parameter was invalid.

I had the url as file:///Users/myUser/Downloads/test.html while I was testing and it didn't work. Seems only valid URLs are accepted for webhooks, which makes sense.

Related