如何用Discord.py实现机器人发送指定消息及自定义目标角色功能
修改Discord.py机器人实现指定角色推送自定义消息
你的现有代码存在几个问题:
word变量在使用后才定义,会触发NameError- 无法接收指令发起者输入的消息和指定角色
- 缺少权限校验和异常处理,容易报错
下面是修改后的完整代码,实现指定角色+自定义消息的推送功能:
import discord from discord.ext import commands bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.command(name="send_role_msg") @commands.has_permissions(administrator=True) # 仅管理员可使用,避免滥用 async def send_role_msg(ctx, target_role: discord.Role, *, message_content: str): # 遍历机器人加入的所有服务器 for guild in bot.guilds: # 在当前服务器中查找目标角色 role = discord.utils.find(lambda r: r.name == target_role.name, guild.roles) if not role: await ctx.send(f"服务器 {guild.name} 中未找到角色 {target_role.name}") continue # 给拥有该角色的成员发送私信 sent_count = 0 failed_count = 0 for member in guild.members: if role in member.roles: try: await member.send(message_content) sent_count += 1 except discord.Forbidden: failed_count += 1 print(f"无法给 {member.name} 发送消息:无权限") except Exception as e: failed_count += 1 print(f"给 {member.name} 发送消息时出错:{str(e)}") # 反馈当前服务器的发送结果 await ctx.send(f"服务器 {guild.name} 推送完成:成功 {sent_count} 人,失败 {failed_count} 人") bot.run("你的机器人Token")
关键改动说明
- 指令参数设计:
target_role: discord.Role:支持用户直接@目标角色,或输入角色名称,Discord.py会自动解析为角色对象*, message_content: str:*表示接收指令后剩余的所有文本作为消息内容,支持带空格的长消息
- 权限控制:添加
@commands.has_permissions(administrator=True),限制仅管理员可使用该指令,防止恶意滥用 - 异常处理:捕获
Forbidden(无权限发私信)等异常,避免机器人崩溃,并记录失败情况 - 结果反馈:给指令发起者返回每个服务器的推送统计,方便查看执行情况
- 变量逻辑修正:先获取用户输入的消息内容,再执行发送操作,解决原代码的变量未定义问题
使用示例
在Discord聊天中输入:
!send_role_msg @新成员 欢迎加入服务器!请查看公告频道的规则。
机器人会遍历所有加入的服务器,找到名为“新成员”的角色,给所有拥有该角色的成员发送指定消息,并反馈每个服务器的推送结果。
内容的提问来源于stack exchange,提问作者hijacked
相关产品推荐
相关产品推荐

