discord.py实现反广告链接并自动分配gg角色的功能开发求助
问题排查与修复方案
原代码存在的核心问题
- 重复注册
on_message事件:discord.py中同一个事件重复注册时只有最后一个会生效,且单独检测https完全多余,https本身包含http字符串,直接检测http即可覆盖两种链接场景 - 加角色逻辑位置错误、语法错误:你写的加角色代码既没有放在事件执行逻辑内,也误用了不存在的
ctx变量,add.roles是拼写错误,正确方法为add_roles,需要从消息对象中获取发送者成员对象和服务器角色 - 缺少边界校验:没有跳过机器人自身发送的消息,容易触发死循环,也没有校验机器人的操作权限,执行时很容易报错
修复后的完整实现代码
import discord from discord.ext import commands # 初始化客户端,必须开启对应权限意图 intents = discord.Intents.default() intents.message_content = True # 开启消息内容读取权限 intents.members = True # 开启成员管理权限 client = commands.Bot(command_prefix='!', intents=intents) # 广告链接检测事件 @client.event async def on_message(message): # 跳过机器人自身发送的消息,避免死循环 if message.author.bot: return # 检测消息中是否包含http/https链接 if 'http' in message.content.lower(): # 校验机器人是否有删除消息的权限 if not message.channel.permissions_for(message.guild.me).manage_messages: await message.channel.send("缺少删除消息的权限,无法执行反广告操作") await client.process_commands(message) return # 删除违规消息 await message.delete() # 获取黑名单gg角色 black_role = discord.utils.get(message.guild.roles, name='gg') if not black_role: await message.channel.send(f"{message.author.mention} 禁止发送链接,未找到名为gg的黑名单角色,请管理员检查配置") await client.process_commands(message) return # 校验机器人是否有分配角色的权限,且机器人角色等级高于gg角色 if not message.guild.me.guild_permissions.manage_roles or message.guild.me.top_role.position <= black_role.position: await message.channel.send(f"{message.author.mention} 禁止发送链接,缺少分配黑名单角色的权限,请管理员检查权限配置") await client.process_commands(message) return # 给违规用户分配黑名单角色 await message.author.add_roles(black_role) # 发送违规提示 await message.channel.send(f"{message.author.mention} 禁止发送广告链接,你已被加入黑名单") # 处理其他指令 await client.process_commands(message) # 启动机器人,替换为你自己的机器人Token client.run("你的机器人Token")
配置注意事项
- 需要到Discord开发者后台的机器人设置页面,开启
Message Content Intent和Server Members Intent两个权限开关,否则无法读取消息内容、无法正常分配角色 - 将机器人的角色拖动到服务器角色列表中
gg角色的上方,否则机器人没有权限给用户分配该角色 - 给机器人开启
删除消息、管理角色的基础权限
内容的提问来源于stack exchange,提问作者XDzx
相关产品推荐
相关产品推荐

