You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:36:01