如何在私信机器人时检查用户在指定服务器的角色并发送消息?
嘿,这个问题我太懂了!因为私信会话里,message.author.roles根本拿不到用户在目标服务器的角色——毕竟私信不属于任何服务器,所以你原来的写法肯定失效。我给你拆解成两个核心问题来解决,直接上修改后的代码和详细解释:
一、解决私信中验证服务器角色的问题
在私信场景下,我们得先定位到你要验证角色的目标服务器,再从服务器里拉取用户的角色信息:
- 首先用服务器ID获取目标服务器实例(注意ID要传整数,别用字符串)
- 然后通过用户ID从服务器中拿到对应的成员对象,这个对象里的
roles才是用户在该服务器的真实角色列表 - 最后检查目标角色ID是否在这个列表里
二、实现向指定服务器发送消息
另外注意,discord.py早就弃用client.send_message方法了,现在改用channel.send()更规范,步骤很简单:
- 用频道ID获取目标频道实例
- 调用频道的
send()方法发送消息
修改后的完整代码
async def on_message(message): # 只处理私信消息(可选,根据你的需求调整) if isinstance(message.channel, discord.DMChannel): if '%attented' in message.content: # 定义目标服务器ID和角色ID(都用整数类型) target_guild_id = 123456789012345678 # 替换成你的服务器ID target_role_id = 561055432748302336 target_channel_id = 560679934209687552 # 要发送消息的频道ID # 获取目标服务器实例 target_guild = client.get_guild(target_guild_id) if not target_guild: await message.author.send("无法找到目标服务器,请检查服务器ID是否正确!") return # 获取用户在目标服务器的成员对象 guild_member = target_guild.get_member(message.author.id) if not guild_member: await message.author.send("你不在目标服务器中,无法执行该操作!") return # 验证用户是否拥有指定角色 if target_role_id in [role.id for role in guild_member.roles]: # 解析消息内容 msg_parts = message.content.split(' ') # 确保消息格式正确(防止用户输入错误) if len(msg_parts) < 3: await message.author.send("格式错误!请使用:%attented <截图链接> <活动名称>") return author = message.author # 获取目标频道并发送消息 target_channel = client.get_channel(target_channel_id) if not target_channel: await message.author.send("无法找到目标频道,请检查频道ID是否正确!") return # 构造消息内容 send_content = f"{str(author)} has attended a {msg_parts[2]}\nScreenshot: {msg_parts[1]}\n***To approve screenshot react with :HYPERS: to disapprove react with :FeelsBadMan:***" await target_channel.send(send_content) await message.author.send("消息已成功发送到目标服务器!") else: await message.author.send("你没有权限执行该操作!")
关键细节说明
- 所有ID(服务器、角色、频道)都要使用整数类型,别用字符串,discord.py v1.0+版本要求这样
- 增加了异常处理:比如找不到服务器、用户不在服务器、频道不存在、消息格式错误等情况,避免机器人崩溃
- 先判断是否是私信消息(
isinstance(message.channel, discord.DMChannel)),确保只有私信触发这个逻辑,防止服务器内的消息误触发
内容的提问来源于stack exchange,提问作者Jon Salman
相关产品推荐
相关产品推荐

