Discord bot开发:如何删除含特定词消息及退出服务器时对应发送的消息
Discord Bot 需求实现方案(以discord.py为例)
前置准备
首先需要提前存储「服务器ID」和「该服务器加入时你发的通知消息ID」的映射关系,是实现第二个功能的基础:
- 不需要持久化的话直接用内存字典存储即可
- 需要重启Bot后数据不丢失可以存到本地JSON文件或者轻量数据库SQLite中
功能一:删除包含特定关键词的消息
通过监听消息发送事件匹配关键词,命中后执行删除操作即可,Bot需要提前开启开发者后台的Message Content Intent权限,同时在对应服务器拥有「管理消息」权限:
# 替换为你需要屏蔽的关键词列表 BANNED_WORDS = ["违规词1", "违规词2"] @bot.event async def on_message(message): # 跳过Bot自己发送的消息,避免循环触发 if message.author == bot.user: return # 不区分大小写匹配关键词 for word in BANNED_WORDS: if word in message.content.lower(): await message.delete() # 可选:发送10秒后自动销毁的提示 await message.channel.send(f"{message.author.mention} 你的消息包含违禁关键词已被删除", delete_after=10) break # 必须保留这行,否则其他Bot指令会失效 await bot.process_commands(message)
功能二:退出服务器时删除对应加入通知消息
第一步:修改原有加入服务器的逻辑,存储映射关系
# 存储结构:{服务器ID: (通知所在频道ID, 通知消息ID)} guild_notice_map = {} # 替换为你自己的开发者服务器接收加服通知的频道ID DEV_NOTICE_CHANNEL_ID = 1234567890 @bot.event async def on_guild_join(guild): notice_channel = bot.get_channel(DEV_NOTICE_CHANNEL_ID) # 发送通知同时拿到消息对象 notice_msg = await notice_channel.send(f"Bot已加入新服务器:{guild.name},ID:{guild.id}") # 存入映射关系,用持久化存储的话这里同步写入文件/数据库 guild_notice_map[guild.id] = (DEV_NOTICE_CHANNEL_ID, notice_msg.id)
第二步:监听退出服务器事件,删除对应通知
@bot.event async def on_guild_remove(guild): if guild.id in guild_notice_map: channel_id, msg_id = guild_notice_map.pop(guild.id) notice_channel = bot.get_channel(channel_id) try: target_msg = await notice_channel.fetch_message(msg_id) await target_msg.delete() # 用持久化存储的话这里同步删除对应记录 except: # 捕获消息已被提前删除等异常,不抛出错误 pass
补充说明
如果使用其他Discord Bot框架(比如discord.js)逻辑完全一致,仅语法不同:
- 监听消息创建事件匹配关键词执行删除
- 监听服务器加入事件存储映射关系
- 监听服务器退出事件删除对应通知消息
内容的提问来源于stack exchange,提问作者Kaytitulaer2008
相关产品推荐
相关产品推荐

