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

Discord Bot解析/click命令返回空字典,请求技术支持

Discord Bot命令参数解析失败问题修复

我编写了一段Discord Bot的Python代码,当在Discord中发送命令/click Ms.Azazel #/battle=2aaaaabaf64e2379 A时,Bot输出的是空字典{'username': '', 'link': '', 'command': ''},但预期结果应该是{'username': 'Ms.Azazel', 'link': '#/battle=2aaaaabaf64e2379', 'command': 'A'}。

原始代码如下:

from discord.ext import commands
import discord

intents = discord.Intents.default()
intents.members = True

bot = commands.Bot(command_prefix='/', intents=intents)


async def process_message(message):
    user_data = {'username': '', 'link': '', 'command': ''}

    if message.content.startswith('/click'):
        parts = message.content.split(' ')
        user_data['username'] = parts[1]
        user_data['link'] = parts[2]
        user_data['command'] = parts[3]
    return user_data


@bot.event
async def on_ready():
    print('Logged in as {0.user}'.format(bot))


@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    user_data = await process_message(message)
    print(user_data)

    await bot.process_commands(message)

核心问题

  1. 缺少Message Content权限:Discord.py v2.0及以上版本,必须显式开启message_content意图才能读取消息内容。当前代码仅开启了members意图,未开启message_content,导致message.content为空字符串,startswith('/click')条件不触发,返回空字典。
  2. 手动解析命令易出错:使用split(' ')手动拆分命令参数,无法可靠处理带特殊字符的参数(比如含#的链接),也无法应对参数中出现空格的情况。

修复步骤

1. 在Discord开发者门户开启权限

  • 进入你的Bot应用页面,切换到Privileged Gateway Intents选项卡;
  • 开启Message Content Intent权限。

2. 修改代码开启意图

在代码中添加intents.message_content = True:

intents = discord.Intents.default()
intents.members = True
intents.message_content = True  # 添加这一行开启消息内容读取权限

3. 改用框架命令装饰器处理(推荐)

使用@bot.command()装饰器替代手动解析,框架会自动处理参数拆分,更稳定可靠:

from discord.ext import commands
import discord

intents = discord.Intents.default()
intents.members = True
intents.message_content = True

bot = commands.Bot(command_prefix='/', intents=intents)


@bot.event
async def on_ready():
    print('Logged in as {0.user}'.format(bot))


@bot.command(name='click')
async def click(ctx, username: str, link: str, cmd: str):
    user_data = {
        'username': username,
        'link': link,
        'command': cmd
    }
    print(user_data)
    # 可选:回复用户确认命令已处理
    await ctx.send(f"已接收命令参数:{user_data}")


# 无需手动编写on_message事件,框架会自动处理命令路由

效果验证

修改后发送命令/click Ms.Azazel #/battle=2aaaaabaf64e2379 A,Bot会输出预期的字典:{'username': 'Ms.Azazel', 'link': '#/battle=2aaaaabaf64e2379', 'command': 'A'}。

内容的提问来源于stack exchange,提问作者Александр xs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:46:20