如何在discord.py机器人消息中美化JSON输出并访问字段?
问题解决思路
一、消息格式混乱的解决办法
- Discord里发送JSON内容必须用代码块包裹,也就是用三个反引号```json开头和结尾,这样平台会自动做语法高亮和排版,不然直接发字符串会挤成一团。
- 本地用
json.dumps(data, indent=4)格式化没问题,但机器人发送时要把这个字符串放进代码块:
await ctx.send(f"```json\n{json.dumps(data, indent=4)}\n```")
- 如果只需要展示关键信息,别发原始JSON,自己拼接成清晰的文本格式更友好:
server_info = f"""📋 服务器信息: 名称:{data['name']} 最大玩家数:{data['maxplayers']} 当前在线:{data.get('players', 0)} """ await ctx.send(server_info)
二、无法访问name、maxplayers字段的排查要点
- 确认JSON解析是否正确:用
response.json()解析后,先打印type(data)和data.keys(),确认返回的是字典,同时看最外层有哪些键。很多API返回的是嵌套结构,比如data藏在response或result键下面,不能直接取data['name']。 - 检查字段名大小写和拼写:API返回的字段是大小写敏感的,比如可能是
Name而非name,或者max_players而非maxplayers,本地打印时仔细核对键名。 - 处理多层嵌套:游戏服务器API常返回多层结构,比如:
{ "status": "ok", "result": { "server": { "name": "我的生存服", "maxplayers": 30 } } }
这种情况得按层级取:data['result']['server']['name'],不能直接data['name']。
三、完整示例代码
import discord import requests import json intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_message(message): if message.author == client.user: return if message.content.startswith('!server'): api_url = "你的游戏服务器API地址" try: response = requests.get(api_url) response.raise_for_status() server_data = response.json() # 根据实际API结构调整层级,这里假设数据在result->server下 server_details = server_data.get('result', {}).get('server', {}) if 'name' not in server_details or 'maxplayers' not in server_details: await message.channel.send("无法获取服务器名称或最大玩家数") return info_msg = f"""📋 服务器状态: 名称:{server_details['name']} 最大玩家数:{server_details['maxplayers']} 当前在线:{server_details.get('players', 0)} """ await message.channel.send(info_msg) except requests.exceptions.RequestException as e: await message.channel.send(f"API请求失败:{str(e)}") except json.JSONDecodeError: await message.channel.send("API返回的不是有效JSON") client.run("你的机器人Token")
内容的提问来源于stack exchange,提问作者VekTheSorcerer
相关产品推荐
相关产品推荐

