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

Discord.py如何读取非所属服务器内指定ID频道的消息?

问题排查与实现方案

原有代码的错误点

  • 事件回调内写了while True死循环,会阻塞Discord事件循环,导致后续所有消息事件无法被触发
  • 未声明和开启消息内容意图(Message Content Intent),Discord API v10+默认禁止读取消息内容,需要额外配置
  • 无指定频道ID的判断逻辑,所有频道消息都会被捕获
  • 冗余的guild = discord.Guild代码无实际作用,仅将类赋值给变量,未获取到对应服务器实例

前置配置要求

你需要先到Discord开发者后台的Bot设置页,开启Message Content Intent权限,同时确保目标服务器的管理员邀请Bot进服时,给Bot授予了目标频道的查看频道、读取消息历史权限,即使你不是服务器所有者,只要Bot有对应权限就能正常读取消息。

可直接运行的实现代码

import discord

# 声明需要的权限意图
intents = discord.Intents.default()
intents.message_content = True  # 开启消息内容读取权限

client = discord.Client(intents=intents)
messages = []
# 替换为你要监听的目标频道ID,开启Discord开发者模式后右键频道可复制ID
TARGET_CHANNEL_ID = 123456789012345678

print("Bot started")

@client.event
async def on_message(message):
    # 过滤非目标频道的消息
    if message.channel.id != TARGET_CHANNEL_ID:
        return
    # 过滤无文本内容的消息(仅贴纸、附件的消息)
    if message.content.strip() == "":
        return
    messages.append(message.content)
    # 收到新消息后按需打印即可,不要写死循环阻塞进程
    print(f"新捕获消息: {message.content}")
    print(f"当前累计消息数: {len(messages)}")

# 替换为你的Bot Token
client.run('TOKENHERE')

补充说明

  • 如果需要同时监听多个频道,可将TARGET_CHANNEL_ID改为ID列表,判断逻辑改为if message.channel.id not in TARGET_CHANNEL_ID: return即可
  • 如果需要存储消息的发送人、发送时间等附加信息,可直接存储message对象而非仅存message.content

内容的提问来源于stack exchange,提问作者barroso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:39:03