You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Pico W(MicroPython)发送含日文的Discord消息报错

解决树莓派Pico W调用Discord REST API发送日文私信的JSON格式问题

问题描述

在树莓派Pico W上使用MicroPython直接调用Discord REST API发送私信,英文内容可正常发送,但content字段包含日文时,会返回「请求体包含无效JSON」错误(错误码50109)。

正常运行代码(英文内容)

import urequests, ujson

# 省略Wi-Fi连接代码

DataObj = {
"content": "Hello, World"
}

Header = {
"content-type": "application/json; charset=utf-8",
"authorization": "Bot <token>"
}

Req = urequests.post("https://discord.com/api/v10/channels/<channel.id>/messages", data=ujson.dumps(DataObj), headers=Header)
print(Req.status) # 200 OK
Req.close()

出错代码(日文内容)

import urequests, ujson

# 省略Wi-Fi连接代码

DataObj = {
"content": "こんにちは、世界" # 意为Hello, World
}

Header = {
"content-type": "application/json; charset=utf-8",
"authorization": "Bot <token>"
}

Req = urequests.post("https://discord.com/api/v10/channels/<channel.id>/messages", data=ujson.dumps(DataObj), headers=Header)
print(Req.text) # {"message": "The request body contains invalid JSON.", "code": 50109}
Req.close()

已尝试的无效方法

  • 直接编写JSON字符串:data="{'content':'こんにちは、世界'}"
  • 使用Unicode转义:data="{'content':'\u3053\u3093\u306b\u3061\u306f\u3001\u4e16\u754c'}"
  • 使用URL编码(可发送但日文未正常显示)
  • 在VSCode中运行代码

环境信息

  • Windows11 Pro 23H2
  • Thonny 4.1.4(Python 3.10.11)
  • Raspberry Pi Pico W(RPI_PICO_W-20240602-v1.23.0.uf2)

解决方案

问题根源在于MicroPython中ujson.dumps()返回的Unicode字符串未被正确编码为UTF-8字节,导致Discord API无法解析。只需将JSON字符串显式编码为UTF-8字节后再发送即可:

import urequests, ujson

# 省略Wi-Fi连接代码

DataObj = {
"content": "こんにちは、世界"
}

Header = {
"content-type": "application/json; charset=utf-8",
"authorization": "Bot <token>"
}

# 将JSON字符串编码为UTF-8字节
json_data = ujson.dumps(DataObj).encode('utf-8')
Req = urequests.post("https://discord.com/api/v10/channels/<channel.id>/messages", data=json_data, headers=Header)
print(Req.status) # 应返回200 OK
Req.close()

原因说明

MicroPython的urequests.post()方法若传入字符串类型的data,会默认使用ASCII编码发送请求体,而Discord API要求JSON必须以UTF-8编码传输。显式调用encode('utf-8')将字符串转为UTF-8字节流后,请求体编码与content-type头指定的格式一致,就能被API正确解析。

另外,之前尝试的直接写JSON字符串用单引号不符合JSON规范(JSON要求键值对用双引号),这也是导致无效JSON的原因之一;手动Unicode转义不仅繁琐,也容易因格式错误失效。

内容的提问来源于stack exchange,提问作者Kinton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:00:10