はじめに
DiscordのWebHookを用いてEmbedを送信するときに、なぜか正しいはずなのにAPIのレスポンスで{"embeds": ["0"]}
というエラーが返ってきたため、原因の解明と注意点についての覚え書き。
実行環境など
- 言語はPHPを使用
- Discord-PHPなどの特別なライブラリは未使用
- JSONを直書きではなく、自前のプログラムで配列をエンコードしている
このエラーの原因
基本的にEmbedと呼ばれる埋め込みは、一回で最大10個送れます。
つまりこのエラー{"embeds": ["0"]}
はそのEmbedsの一つ目に問題があるよということ。
私の場合、Embedを一つだけ送るときにこのエラーが出ていたので紛れもなくそのEmbedがおかしいということになる。
以下はstackoverflowの投稿を簡単に和訳して抜粋したもの。
情報の信憑性の有無に関しては今回スルー。
引用元の投稿はこちらから
1. 無効な要素が含まれている
主に値のフォーマットが間違っているパターンと値そのものがおかしいパターンの二通り。
-
timestamp
の要素がISO8601に準していない -
color
がdecimal値(10進数)じゃなくて、"red"
や"#ff00ff"
などである -
icon_url
avatar_url
url
などのリンクが要求される要素がhttps://
やhttp://
で始まっていない - ブール値であるべき要素で別の型の要素が渡されている
- 空またはnull値がある
- 未定義の値がある
2. 特定の要素の制限を超えている
文字数や含められる要素の制限を超過してしまっているパターン。
-
title
の文字数制限 256 を超えている -
description
の文字数制限 2048 を超えている -
field
のname
の文字数制限 256 を超えている -
field
のvalue
の文字数制限 1024 を超えている -
footer
の文字数制限 2048 を超えている -
author
の文字数制限 256 を超えている -
field
の数が 25 を超えている - 全体の合計文字数が 6000 を超えている
私の場合
》原因
-
icon_url
avatar_url
url
などのリンクが要求される要素がhttps://
やhttp://
で始まっていない - 空またはnullがある
》そもそもなぜそうなったのか
私は上項でも述べたようにJSONを直書きではなく、自前のプログラムで配列をエンコードしている。
以下がエラーを誘発させていた埋め込みを作る箇所の修正前のコードである。
public function buildEmbed() : array
{
$embed = [];
$embed["title"] = $this->title;
$embed["description"] = $this->description;
$embed["url"] = $this->url;
$embed["timestamp"] = $this->timestamp;
$embed["color"] = $this->color;
$embed["footer"] = $this->footer;
$embed["image"] = $this->image;
$embed["thumbnail"] = $this->thumbnail;
$embed["author"] = $this->author;
$embed["fields"] = $this->fields;
return $embed;
}
当初の目的として、様々な用途で使うためにAPIのようなものとして実装をしていたが、初期値である空配列[]
や空文字""
がどんな状況であれ確実に埋め込みの要素として含まれてしまうことが原因だった。
すべてのプロパティが初期値である場合のみ条件分岐で$embed
へ格納しない方法をとることで無事再稼働させた。
さいごに
とてつもなく初歩的なことでミスをしていたのが恥ずかしい。
でも誰かのためになればいいと思ったので覚え書きとして残した。