树莓派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
相关产品推荐
相关产品推荐

