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)
核心问题
- 缺少Message Content权限:Discord.py v2.0及以上版本,必须显式开启
message_content意图才能读取消息内容。当前代码仅开启了members意图,未开启message_content,导致message.content为空字符串,startswith('/click')条件不触发,返回空字典。 - 手动解析命令易出错:使用
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
相关产品推荐
相关产品推荐

