能否使用discord.py开发具备广告链接拦截、自动分配黑名单角色功能的机器人
可行性结论
该需求完全可以基于discord.py原生功能实现,所有核心操作都在discord.py的事件监听体系和权限API的覆盖范围内,无需依赖额外第三方服务。
前置准备
你需要提前完成两项配置,避免功能触发失败:
- 在Discord开发者后台的机器人设置页,开启
Server Members Intent和Message Content Intent两个权限选项 - 在Discord服务器中给机器人分配高于普通用户的角色,同时授予删除消息、分配角色两个核心权限;注意机器人的角色排序必须高于你预设的黑名单角色,否则无法给用户分配该角色。
核心实现思路
1. 定义基础规则
提前配置三个核心参数:
- 链接匹配正则:用于识别消息中的http/https链接,通用规则可参考
r'https?://\S+' - 域名白名单:整理服务器内允许发送的合法域名,避免误删正常内容
- 黑名单角色ID:在服务器内提前创建好黑名单角色,记录该角色的数字ID备用。
2. 监听消息事件
通过discord.py提供的on_message事件监听所有用户发送的消息,逻辑中要排除机器人自身发送的消息,避免循环触发规则。
3. 违规检测
对每一条收到的消息做内容匹配:
- 未检测到链接的消息直接跳过
- 检测到链接后提取域名,和白名单列表做比对,不在白名单内的链接判定为违规广告。
4. 执行处罚
判定为违规后依次执行操作:
- 调用
await message.delete()方法删除违规消息 - 调用
await message.author.add_roles(角色对象)方法给发送者添加预设的黑名单角色 - 可选扩展:给违规用户发送私信告知处罚原因,或在服务器日志频道同步违规记录。
简化示例代码
import discord import re # 自定义配置项,替换为你自己的实际参数 BANNED_ROLE_ID = 123456789012345678 WHITELIST_DOMAINS = ["discord.com", "github.com"] URL_PATTERN = re.compile(r'https?://(?:www\.)?([a-zA-Z0-9.-]+)/?\S*') # 声明机器人权限 intents = discord.Intents.default() intents.message_content = True intents.members = True client = discord.Client(intents=intents) @client.event async def on_message(message): # 忽略机器人自身发送的消息 if message.author.bot: return # 匹配消息中的所有链接 matched_domains = URL_PATTERN.findall(message.content) for domain in matched_domains: if domain not in WHITELIST_DOMAINS: # 删除违规消息 await message.delete() # 获取黑名单角色对象 banned_role = message.guild.get_role(BANNED_ROLE_ID) if banned_role: # 给用户添加黑名单角色 await message.author.add_roles(banned_role) break client.run("你的机器人Token")
优化方向
- 可增加误判申诉逻辑,给管理员发送审核通知,确认误判后自动移除用户的黑名单角色
- 可给链接检测增加权重规则,比如带邀请码、返利后缀的链接直接判定为广告,提高识别准确率
- 可增加操作频率限制,避免短时间内大量广告消息触发重复处罚逻辑。
内容的提问来源于stack exchange,提问作者XDzx
相关产品推荐
相关产品推荐

