如何让discord.py机器人检测消息是否发送于指定服务器?
让聊天过滤功能仅在指定服务器生效的实现思路
嘿,这个需求很好解决,核心就是在过滤逻辑执行前先判断当前消息所在的服务器是否是你指定的目标服务器,我给你分步骤讲清楚:
1. 先拿到目标服务器的ID
首先你需要获取朋友服务器的唯一标识ID:
- 打开Discord的「设置」→「高级」,开启「开发者模式」
- 右键你朋友的服务器图标,选择「复制ID」,把这个ID存好备用
2. 在代码里定义允许的服务器列表
建议用**集合(Set)**来存储这些ID,因为集合的查找效率比普通列表高很多,以后要是想加更多服务器也方便。比如:
# 替换成你实际复制的服务器ID ALLOWED_GUILD_IDS = {"123456789012345678"}
3. 在过滤逻辑前添加服务器判断
不管你用的是Discord.py、discord.js还是其他机器人框架,思路都是一致的:在触发聊天过滤的事件(比如on_message或messageCreate)里,先获取当前消息所属的服务器ID,判断是否在允许列表里。如果不在,直接跳过过滤;如果在,再执行过滤逻辑。
举个Discord.py的完整示例:
import discord from discord.ext import commands bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) # 允许的服务器ID集合 ALLOWED_GUILD_IDS = {"123456789012345678"} @bot.event async def on_message(message): # 跳过私聊消息(如果不需要处理私聊的话) if not message.guild: await bot.process_commands(message) return # 把服务器ID转成字符串,避免类型不匹配问题 current_guild_id = str(message.guild.id) # 判断是否是目标服务器 if current_guild_id not in ALLOWED_GUILD_IDS: # 不是目标服务器,直接跳过过滤逻辑 await bot.process_commands(message) return # 这里是你的聊天过滤逻辑 forbidden_words = ["违规词1", "违规词2"] if any(word in message.content.lower() for word in forbidden_words): await message.delete() await message.channel.send(f"{message.author.mention} 请不要发送违规内容哦!") await bot.process_commands(message) bot.run("你的机器人Token")
如果用discord.js的话,代码大概是这样:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] }); // 允许的服务器ID集合 const ALLOWED_GUILD_IDS = new Set(["123456789012345678"]); client.on('messageCreate', (message) => { // 跳过私聊消息 if (!message.guild) return; // 判断服务器是否在允许列表里 if (!ALLOWED_GUILD_IDS.has(message.guild.id)) return; // 聊天过滤逻辑 const forbiddenWords = ["违规词1", "违规词2"]; if (forbiddenWords.some(word => message.content.toLowerCase().includes(word))) { message.delete(); message.channel.send(`${message.author} 请不要发送违规内容哦!`); } }); client.login('你的机器人Token');
额外小提示
- 以后要修改允许的服务器,直接更新
ALLOWED_GUILD_IDS集合就行,不用动过滤逻辑的代码 - 如果你不想把ID硬编码在代码里,可以用环境变量存储(比如用
dotenv库),更安全灵活,但个人小项目硬编码完全够用
内容的提问来源于stack exchange,提问作者nbrammer_
相关产品推荐
相关产品推荐

