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

discord.py temprole命令无响应问题求助(编程新手)

问题排查与修复方案

核心错误:重复创建客户端实例

你同时初始化了bot(commands.Bot,用于命令系统)和client(discord.Client,基础客户端),但最终启动的是client,而所有命令都注册在bot上,这导致命令完全无法被触发,自然没有任何反馈。

修复步骤

1. 移除冗余客户端实例,统一使用commands.Bot

删除代码中这一行:

client = discord.Client(intents=intents)

将启动代码改为:

bot.run('My Token Is Here')

2. 正确配置Intents给bot

原代码中bot初始化时用了默认Intents,未开启message_content(接收消息内容的权限),需要把配置好的intents传给bot:
修改bot初始化代码为:

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="$", intents=intents)

3. 优化命令参数逻辑(可选但更符合使用习惯)

当前命令参数顺序为role_time→member→role,不符合常规使用逻辑,建议调整为member→role→role_time,同时利用你定义的time_convert支持多时间单位(如10min、2h):

@bot.command()
async def temprole(ctx, member: discord.Member, role: discord.Role, role_time: str):
    # 处理时间单位转换
    try:
        num = int(role_time[:-3])
        unit = role_time[-3:]
        if unit not in time_convert:
            raise ValueError
        total_seconds = num * time_convert[unit]
    except:
        await ctx.send("时间格式错误,请输入类似 `10sec`(秒)、`5min`(分钟)、`2h`(小时)、`1d`(天)的格式")
        return

    await member.add_roles(role)
    await ctx.send(f"已给{member.mention}添加{role.mention},有效期{role_time}")

    await asyncio.sleep(total_seconds)
    await member.remove_roles(role)
    await ctx.send(f"{member.mention}的{role.mention}已过期并移除")

4. 补充Bot就绪提示(方便调试)

添加就绪事件,确认Bot正常启动:

@bot.event
async def on_ready():
    print(f"已登录为{bot.user},可以使用命令了")

完整修复后的代码

import discord
from discord.ext import commands
import asyncio

# 配置Intents
intents = discord.Intents.default()
intents.message_content = True
intents.members = True  # 如需获取成员信息,需开启此权限

bot = commands.Bot(command_prefix="$", intents=intents)

time_convert = {"sec":1, "min":60, "h":3600,"d":86400}

@bot.event
async def on_ready():
    print(f"已登录为{bot.user},可以使用命令了")

@bot.command()
async def temprole(ctx, member: discord.Member, role: discord.Role, role_time: str):
    # 处理时间输入
    try:
        num = int(role_time[:-3])
        unit = role_time[-3:]
        if unit not in time_convert:
            raise ValueError
        total_seconds = num * time_convert[unit]
    except:
        await ctx.send("时间格式错误,请输入类似 `10sec`(秒)、`5min`(分钟)、`2h`(小时)、`1d`(天)的格式")
        return

    # 添加临时角色
    await member.add_roles(role)
    await ctx.send(f"✅ 已给 {member.mention} 添加 {role.mention},有效期:{role_time}")

    # 等待时间后移除角色
    await asyncio.sleep(total_seconds)
    await member.remove_roles(role)
    await ctx.send(f"⏰ {member.mention} 的 {role.mention} 已过期,已自动移除")

# 启动Bot
bot.run('你的Bot令牌')

额外注意事项

  • 确保在Discord开发者平台为Bot开启Message Content Intent和Server Members Intent(如需处理成员)
  • 命令使用示例:$temprole @张三 @临时VIP 2h
  • 确保Bot的角色位置高于要添加的目标角色,且拥有管理角色的权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:35:25