You need to enable JavaScript to run this app. Discord.py机器人on_member_join事件添加ctx实现新成员专属频道创建问题
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py机器人on_member_join事件添加ctx实现新成员专属频道创建问题

问题核心

on_member_join是事件监听器,不存在ctx(命令上下文)对象,你不需要尝试获取ctx,所有需要的对象都可以通过事件传入的member参数直接获取,原有逻辑里对ctx的调用全部可以替换。

修正后可运行代码

import discord
from discord.ext import commands

class JoinCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_member_join(self, member : discord.Member):
        guild = member.guild
        # 预先配置频道权限规则
        overwrites = {
            # 全体默认角色禁止查看和发言
            guild.default_role: discord.PermissionOverwrite(read_messages=False, send_messages=False),
            # 新加入成员开放查看和发言权限
            member: discord.PermissionOverwrite(read_messages=True, send_messages=True),
            # 给机器人自身配置操作权限,避免后续无法管理频道
            guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True, manage_channels=True)
        }
        # 创建频道时直接传入权限配置,避免创建后权限未生效的空档
        new_channel = await guild.create_text_channel(name=member.name, overwrites=overwrites)
        # 向新频道发送消息,不需要调用ctx.send
        await new_channel.send(f"欢迎 {member.mention} 加入服务器,这是你的专属频道。")

说明

  • 你原有代码中所有ctx相关的调用都不是必须的:
    • 服务器默认角色直接用guild.default_role获取即可,不需要从ctx取值
    • 需要授权的用户就是事件传入的member参数本身
    • create_text_channel执行后会返回创建好的频道对象,直接用该对象操作即可,不需要从ctx获取频道
  • 提前在create_text_channel中传入overwrites参数,可以避免频道创建后、权限修改前的空档期被其他用户看到内容。
  • 后续要做定时自动删除功能,只需要把返回的new_channel.id存储到你用的数据库/缓存中,到约定时间获取对应频道执行删除操作即可。

必要前置检查

  • 必须在Discord开发者平台的机器人设置页开启Server Members Intent,否则on_member_join事件不会触发
  • 机器人在服务器中需要拥有「管理频道」「管理权限」的权限,否则无法完成频道创建和权限配置操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:54:01