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
相关产品推荐
相关产品推荐

