Discord.py如何实现私有频道指定关键词消息抓取转发
核心问题定位
你之前写的代码无法生效,是几个硬伤导致的:
- 匹配逻辑错误:
message.content == "car"只会匹配**整条消息内容完全等于"car"**的场景,只要消息里多任何其他字符(比如"i have a car")都不会触发判断 - 未做消息来源限制:代码没有校验消息是不是来自你要抓取的私有频道,会监听到所有机器人有权限访问的频道消息
- 缺少无限循环防护:没有跳过机器人自身发送的消息,一旦机器人发的内容命中关键词,会反复触发事件刷屏
- 未开启必要权限:Discord 2022年后的版本要求显式开启消息内容读取权限,不管代码写的对不对,不开权限就读不到消息文本
- 缺少命令兼容逻辑:如果后续给机器人加其他前缀命令,不加处理逻辑会导致所有命令失效
前置准备工作
在改代码之前先把这几件事做完,不然代码跑不起来:
- 把你的机器人同时拉入「要抓取内容的私有源频道」和「接收转发内容的自有目标频道」,给机器人分配读取消息历史、发送消息、嵌入链接、上传文件的频道权限
- 打开Discord开发者后台,进入你的机器人应用页,在Bot设置栏找到Privileged Gateway Intents分区,打开Message Content Intent开关并保存
- 复制两个频道的ID:在Discord开开发者模式后,右键对应频道选择「复制ID」即可,分别记为源频道ID、目标频道ID
- 复制你的机器人Token,同样在开发者后台Bot页可以拿到,注意这个Token不要泄露给别人
修正后可直接运行的代码
把下面的代码复制下来,修改开头配置块里的三个参数即可,不需要改其他逻辑:
import discord from discord.ext import commands # -------------------------- 只需要改这里的配置就行 -------------------------- BOT_TOKEN = "替换成你自己的机器人Token" SOURCE_CHANNEL_ID = 123456789 # 替换成你要抓取的私有频道ID,纯数字 TARGET_CHANNEL_ID = 987654321 # 替换成你要接收转发的目标频道ID,纯数字 KEYWORDS = ["car"] # 要匹配的关键词,要加多个就往列表里补,比如["car", "motorcycle", "truck"] # --------------------------------------------------------------------------- # 初始化机器人权限配置 intents = discord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix="!", intents=intents) @bot.event async def on_ready(): # 机器人登录成功后在控制台打印提示 print(f"机器人已上线,当前登录账号:{bot.user}") @bot.event async def on_message(message): # 跳过所有机器人发送的消息,防止无限触发循环 if message.author.bot: return # 不是来自指定抓取源频道的消息,直接走正常命令处理逻辑后退出 if message.channel.id != SOURCE_CHANNEL_ID: await bot.process_commands(message) return # 关键词匹配:不区分大小写,只要消息包含任意一个预设关键词就算命中 is_keyword_matched = any(keyword.lower() in message.content.lower() for keyword in KEYWORDS) if is_keyword_matched: target_channel = bot.get_channel(TARGET_CHANNEL_ID) # 组装转发内容,格式可以自己调整 forward_text = ( f"**命中关键词消息提醒**\n" f"发送人:{message.author.global_name if message.author.global_name else message.author.name}\n" f"原消息跳转:{message.jump_url}\n" f"消息内容:\n{message.content}" ) # 连带原消息的图片、文件一起转发 attach_files = [await attachment.to_file() for attachment in message.attachments] await target_channel.send(content=forward_text, files=attach_files) # 兼容机器人其他命令的处理 await bot.process_commands(message) if __name__ == "__main__": bot.run(BOT_TOKEN)
常见问题排查
- 运行时报intents相关错误:回头检查开发者后台的Message Content Intent开关是否打开,代码里
intents.message_content = True是否保留 - 触发转发时提示NoneType没有send方法:检查两个频道ID是否填对,机器人是否已经被拉入对应频道,频道权限是否配置正确
- 关键词匹配漏判:代码已经做了大小写不敏感处理,只要消息文本里包含完整关键词字符串就会命中,不要改回
==的全等于判断 - 机器人上线后不停重复发消息:检查是否漏了
if message.author.bot: return的判断逻辑,这行必须保留 - 原消息的图片/文件没转过去:检查机器人有没有在频道里分配上传文件的权限,代码里转发附件的逻辑不要随便删
内容的提问来源于stack exchange,提问作者StormaS
相关产品推荐
相关产品推荐

