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

如何在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字段的排查要点

  1. 确认JSON解析是否正确:用response.json()解析后,先打印type(data)和data.keys(),确认返回的是字典,同时看最外层有哪些键。很多API返回的是嵌套结构,比如data藏在response或result键下面,不能直接取data['name']。
  2. 检查字段名大小写和拼写:API返回的字段是大小写敏感的,比如可能是Name而非name,或者max_players而非maxplayers,本地打印时仔细核对键名。
  3. 处理多层嵌套:游戏服务器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:39:22