PHP使用CURL发送带按钮的Discord消息报50035错误如何解决
错误原因
返回MODEL_TYPE_CONVERT报错是因为提交的components字段结构不符合Discord API的规范,具体问题有两个:
- 消息体顶层的
components字段要求是动作行(Action Row)对象的数组,你的代码直接将单个动作行的关联数组赋值给了components,没有外层索引数组包裹。json_encode处理关联数组时会输出JSON对象,API解析时会把这个对象下的type、components两个键识别为两个独立的组件项,这两项都不是合法的组件对象格式,因此触发报错。 - 动作行对象内部的
components字段要求是按钮等交互组件对象的数组,你的代码直接将单个按钮的关联数组写在该字段下,同样缺少索引数组包裹,结构不合法。
额外注意:所有组件的type字段建议传整数类型,不要传字符串格式的数字,避免隐式类型转换引发兼容问题。
修复代码
调整components的数组层级,严格按照「消息体 → components数组 → 动作行对象 → components数组 → 按钮对象」的结构嵌套即可,修复后的完整代码如下:
<?php $channelID = "IDHERE"; $webhookurl = "https://discord.com/api/v10/channels/" . $channelID . "/messages"; $json_data = json_encode([ // 消息内容 "content" => "test", // 关闭语音播报 "tts" => false, // 消息组件 "components" => [ [ "type" => 1, // 动作行类型,固定值为1 "components" => [ [ "type" => 2, // 按钮类型,固定值为2 "label" => "test", "custom_id" => "help_me", "style" => 1 // 按钮样式,1为主色按钮 ] ] ] ], ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); $ch = curl_init($webhookurl); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/json', 'Authorization: Bot 替换为你的机器人实际Token' // 注意此处替换为真实Bot Token )); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); echo $response; curl_close($ch);
如果需要在同一个动作行放多个按钮,直接往内层的components数组里追加按钮关联数组即可;如果需要放多行按钮,就往顶层的components数组里追加新的动作行对象。
内容的提问来源于stack exchange,提问作者ItIsN3RD
相关产品推荐
相关产品推荐

