Discord API读取频道历史消息返回401未授权错误求助
问题原因
你现在遇到401的核心问题是授权模式选错了:
- 你用的
client_credentials是OAuth2的客户端凭证模式,这个模式仅用于应用自身查询公开基础信息,天生不具备访问服务器、频道内私有资源的权限,不管配置多少scope都无法调用频道消息接口。你能成功调用/users/@me只是因为该接口对客户端凭证模式开放了基础的应用身份查询能力,和频道资源的权限要求完全不互通。 - 你当前配置的
identify connectionsscope本身也没有读取频道消息的权限,就算换对授权流,也需要单独申请消息读取相关的权限。
长期稳定替代方案
最合规、最稳定的方案是使用Bot(机器人)账号,不要用浏览器提取的个人用户Token,也不要继续尝试客户端凭证模式:
- 直接在开发者后台为你的应用创建Bot账号,将Bot拉入目标频道,给Bot分配「查看频道」「读取消息历史」的权限即可。
- Bot的Token只要你不手动重置就长期有效,完全符合Discord的使用规则,不会出现临时失效、风控封号的问题,是官方推荐的接口调用方式。
- 浏览器提取的个人用户Token本身违反平台服务条款,不仅有效期短,还会触发风控导致账号被封,不建议长期使用。
DiscordPy 实现方案
首先安装依赖:pip install discord.py
前置配置:在开发者后台的Bot设置页,打开「Privileged Gateway Intents」分类下的「Message Content Intent」开关,否则无法读取消息内容。
最小实现代码:
import discord from discord import Intents # 配置所需权限 intents = Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) # 替换为你的目标频道数字ID TARGET_CHANNEL_ID = 000000000000000000 @client.event async def on_ready(): print(f"登录成功,身份:{client.user}") target_channel = client.get_channel(TARGET_CHANNEL_ID) # limit=None 表示拉取频道全部历史消息,discord.py会自动处理接口限速 async for message in target_channel.history(limit=None): print(f"[{message.created_at}] {message.author.name}: {message.content}") # 拉取完成后关闭连接 await client.close() # 替换为你自己的Bot Token client.run("你的Bot Token")
注意:不要尝试用个人用户Token运行discord.py,这类自机器人行为属于违规操作,会直接导致个人账号被封禁。
内容的提问来源于stack exchange,提问作者M80
相关产品推荐
相关产品推荐

