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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:18:15