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

如何通过用户名断开用户连接?求技术实现帮助

通过用户名断开Discord用户连接的实现方案

嘿,我刚好折腾过类似的需求,给你捋捋具体怎么实现——看你提到了@client.event,应该是用Discord.py开发Bot对吧?

首先得明确:Discord.py里没有直接通过用户名调用Disconnect()的方法,得先找到对应用户的成员对象,再执行断开/踢人操作。下面分两种场景给你代码示例:

一、自动触发的事件场景(比如用户上线时检查并断开)

如果你想要在某个事件触发时(比如用户上线)自动匹配用户名并断开,代码可以这么写:

import discord
from discord.ext import commands

# 必须开启成员意图,不然Bot拿不到服务器成员列表
intents = discord.Intents.default()
intents.members = True
intents.presences = True  # 监听用户状态变化需要这个

client = commands.Bot(command_prefix='!', intents=intents)

@client.event
async def on_member_update(before, after):
    # 目标用户名(建议加上#xxxx的 discriminator,避免重名误操作)
    target_full_username = "username#1234"
    
    # 当用户状态变为在线时检查匹配
    if str(after) == target_full_username and before.status != after.status:
        try:
            # 这里是断开语音连接,如果要踢人出服务器,换成 await after.kick(reason="触发自动断开")
            await after.disconnect(reason="触发自动断开条件")
            print(f"已成功断开用户 {after.display_name} 的语音连接")
        except discord.Forbidden:
            print("Bot没有权限执行这个操作,请检查权限设置")
        except discord.HTTPException as e:
            print(f"操作失败:{str(e)}")

# 启动Bot
client.run("你的Bot Token")

二、管理员手动触发的命令场景

如果需要管理员手动输入用户名来断开用户,写个命令更实用:

# 接上面的代码,添加这个命令
@client.command()
@commands.has_permissions(kick_members=True)  # 限制只有有踢人权限的管理员能调用
async def disconnect_user(ctx, username: str, discriminator: str = None):
    # 查找目标成员
    if discriminator:
        # 精确匹配用户名+ discriminator
        target_member = discord.utils.get(ctx.guild.members, name=username, discriminator=discriminator)
    else:
        # 模糊匹配用户名(不推荐,容易重名误操作)
        target_member = discord.utils.find(lambda m: m.name.lower() == username.lower(), ctx.guild.members)
    
    if not target_member:
        await ctx.send(f"找不到用户 {username},建议带上#xxxx的后缀")
        return
    
    try:
        # 断开语音连接
        await target_member.disconnect(reason=f"管理员 {ctx.author.display_name} 发起操作")
        await ctx.send(f"已断开 {target_member.display_name} 的语音连接")
        # 如果要踢人出服务器,换成下面这行:
        # await target_member.kick(reason=f"管理员 {ctx.author.display_name} 发起踢人")
        # await ctx.send(f"已将 {target_member.display_name} 踢出服务器")
    except discord.Forbidden:
        await ctx.send("我没有权限执行这个操作,请给我分配管理成员或踢人权限")
    except discord.HTTPException as e:
        await ctx.send(f"操作失败:{str(e)}")

关键注意事项

  • 必须开启成员意图:在Discord开发者后台的Bot页面,找到"Privileged Gateway Intents",开启"Server Members Intent"和"Presence Intent",不然Bot获取不到成员列表。
  • 权限要求:Bot需要有管理成员或踢人的服务器权限,否则会触发Forbidden错误。
  • 避免重名误操作:Discord允许同名用户,一定要优先用用户名#xxxx的完整格式匹配,不要只匹配用户名。
  • 区分操作类型:disconnect()是断开语音连接,kick()是踢出服务器,根据你的需求选对应的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:14:46