You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用discord.py API实现!move命令移至afk频道:参数问题求助

用discord.py实现!move命令将用户移至AFK语音频道

嘿,我来帮你把这个功能搞定!你已经知道要用discord.py移动用户,但对参数有点懵对吧?其实核心逻辑很清晰,我一步步给你拆解:

首先,你需要明确几个关键点:

  • 移动用户的核心方法是Member对象的move_to(),它必须传入一个VoiceChannel对象,不能直接传频道名称字符串哦。
  • 要让命令不区分大小写,在初始化Bot的时候设置case_insensitive=True就可以了。
  • 必须开启对应的Intents权限,不然机器人拿不到用户的语音状态和消息内容。

完整代码示例

下面是能直接运行的代码,我加了详细注释:

import discord
from discord.ext import commands

# 配置Intents,v2.x版本的discord.py必须显式开启这些
intents = discord.Intents.default()
intents.message_content = True  # 允许机器人读取消息内容
intents.voice_states = True     # 允许机器人获取语音状态

# 初始化Bot,设置命令前缀为!,并且命令不区分大小写
bot = commands.Bot(command_prefix="!", intents=intents, case_insensitive=True)

@bot.event
async def on_ready():
    print(f"机器人已登录:{bot.user.name}")

@bot.command()
async def move(ctx):
    # 第一步:检查发送命令的用户是否在语音频道里
    if not ctx.author.voice:
        await ctx.send("你得先加入某个语音频道才能被移动呀!")
        return
    
    # 第二步:找到服务器里名为"afk"的语音频道
    afk_channel = discord.utils.get(ctx.guild.voice_channels, name="afk")
    if not afk_channel:
        await ctx.send("服务器里找不到名为afk的语音频道哦,请检查频道名称是否正确!")
        return
    
    # 第三步:尝试移动用户,捕获可能的权限问题
    try:
        await ctx.author.move_to(afk_channel)
        await ctx.send(f"搞定啦!已把你移至「{afk_channel.name}」频道~")
    except discord.Forbidden:
        await ctx.send("哎呀,我没有权限移动你!请管理员给我开启「移动成员」的权限,还要确保我能访问AFK频道哦。")
    except Exception as err:
        await ctx.send(f"移动时出了点小问题:{str(err)}")

# 替换成你的机器人TOKEN
bot.run("YOUR_BOT_TOKEN_HERE")

关键参数&注意事项

  • move_to()的必填参数是channel:也就是你要移到的那个VoiceChannel对象,我们用discord.utils.get()从服务器的语音频道列表里匹配名称拿到它。
  • 命令不区分大小写:通过Bot初始化时的case_insensitive=True实现,这样用户发!MOVE!Move!move都会触发这个命令。
  • 权限问题:机器人需要有「移动成员」的服务器权限,同时AFK频道要允许机器人连接和移动成员进入,不然会抛出Forbidden错误。
  • 多同名频道处理:如果服务器里有多个叫afk的语音频道,discord.utils.get()会返回第一个匹配的。想要精准定位的话,可以改用频道ID查找:discord.utils.get(ctx.guild.voice_channels, id=1234567890)(把数字换成你的AFK频道ID)。

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

火山引擎 最新活动