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

如何基于变量修改Discord机器人命令并使其生效?

动态配置Discord机器人命令的正确姿势

嘿,我看你想让用户能通过设置变量来修改机器人的命令,但原来的写法有问题——Python里不能直接用变量作为函数名来定义命令,@bot.command()装饰器认的是你写死的函数名,不是变量里的值。不过别担心,我们可以用动态注册命令的方式来实现需求。

下面是修正后的完整代码,我还顺便更新了一些Discord.py的新写法(比如ctx.send()替代旧的bot.say(),还有必须的Intents配置):

import discord
from discord.ext import commands
import asyncio
import requests
import random

# 这里就是用户可以修改的命令名变量
custom_command = "test"

# 先定义命令的执行逻辑,函数名随便取,不用和命令名一致
async def run_custom_command(ctx):
    await ctx.send("Test!")
    print("Test posted")

# 初始化机器人,记得启用message_content权限(Discord v2.0+要求)
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)

# 在机器人上线时动态注册命令
@bot.event
async def on_ready():
    # 创建一个Command对象,把变量里的命令名传进去
    new_cmd = commands.Command(
        name=custom_command,
        callback=run_custom_command,
        pass_context=True
    )
    # 给命令加上冷却时间,和你原来的装饰器效果一样
    new_cmd.cooldown = commands.Cooldown(1.0, 30.0, commands.BucketType.default)
    # 把这个命令添加到机器人里
    bot.add_command(new_cmd)
    print(f"机器人已启动!命令`{custom_command}`已成功注册")

# 最后替换成你的机器人Token运行
bot.run("YOUR_BOT_TOKEN")

几个关键要点:

  • 动态注册:不再依赖装饰器,而是手动创建commands.Command对象,通过name参数传入我们的变量值,再用bot.add_command()把它加到机器人的命令列表里。
  • 逻辑与命令名分离:执行命令的函数(run_custom_command)和对外的命令名(custom_command变量)完全分开,用户只需要修改custom_command的值就能改命令,不用动函数代码。
  • 适配新版本:Discord.py现在要求必须配置Intents才能读取消息内容,所以代码里加了intents.message_content = True,而且bot.say()已经被弃用,换成了ctx.send()。
  • 冷却时间保留:手动给创建的Command对象设置冷却规则,和你原来用@commands.cooldown()装饰器的效果完全一致。

这样修改后,用户只要改custom_command变量的值,机器人就会使用对应的命令名啦~

内容的提问来源于stack exchange,提问作者eggsedan development

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:38:11