discord.py rewrite中如何检测用户是否已完成Membership Screening
discord.py 实现监听用户完成Membership Screening后执行操作的方案
核心逻辑说明
Discord的Membership Screening(入会筛选)的完成状态通过成员的pending属性标识:用户未完成筛选时pending = True,完成后自动变为False,状态变更时会触发on_member_update事件,我们可以通过监听这个事件实现需求。
前置要求
- 使用discord.py 1.5及以上的rewrite版本,旧版本不支持
pending属性 - 必须在Discord开发者后台的机器人设置页开启
Server Members Intent(服务器成员意图),同时代码中初始化Bot实例时显式开启成员意图 - Bot拥有对应操作的权限(比如分配身份组需要
管理角色权限,且Bot的角色排序高于要分配的角色)
代码示例
import discord from discord.ext import commands # 开启所需意图 intents = discord.Intents.default() intents.members = True # 必须开启成员意图,否则无法接收成员更新事件 bot = commands.Bot(command_prefix='!', intents=intents) @bot.event async def on_ready(): print(f'Bot已登录为 {bot.user}') @bot.event async def on_member_update(before: discord.Member, after: discord.Member): # 仅当成员从pending状态变为非pending状态时触发,即刚完成入会筛选 if before.pending and not after.pending: # 此处编写你需要执行的操作,以下是分配身份组的示例 # 替换为你服务器中对应身份组的ID target_role = after.guild.get_role(123456789012345678) if target_role: await after.add_roles(target_role) # 可选:发送欢迎消息 # await after.send("恭喜你完成入会筛选,已为你分配成员身份组!") bot.run('你的Bot Token')
常见问题说明
- 如果事件没有触发,优先检查成员意图是否同时在开发者后台和代码中都已开启
- 如果分配身份组失败,检查Bot的权限以及角色排序是否符合要求
- 若需要针对不同服务器有不同的触发逻辑,可以在事件内通过
after.guild.id判断服务器后执行对应操作
内容的提问来源于stack exchange,提问作者Jack Thorn
相关产品推荐
相关产品推荐

