Discord API及discord.py如何实现实时数据获取?
Discord.py 实时数据获取:用官方推送替代轮询
discord.py 从底层就基于 Discord 官方的 Gateway WebSocket 机制实现了实时数据推送,完全不需要用低效的 while True 轮询方式。以下是具体原理和用法:
核心机制:Discord Gateway WebSocket
Discord 的机器人 API 本身就设计为推送模式:
- 当你调用
bot.run(token)启动机器人时,discord.py 会自动与 Discord 服务器建立持久化的 WebSocket 连接 - 一旦 Discord 平台上发生事件(比如新消息发送、成员加入、频道更新、服务器状态变化等),Discord 服务器会主动将事件数据通过这个 WebSocket 推送给你的机器人
- 你只需要通过装饰器绑定对应的事件回调函数,就能直接处理这些实时推送的数据
简单示例:接收实时消息推送
下面是监听新消息的基础代码,事件由 Discord 主动推送,无需主动请求:
import discord from discord.ext import commands # 必须声明所需的 Intents(Discord 要求,需在开发者后台开启对应权限) intents = discord.Intents.default() intents.message_content = True # 开启消息内容权限 bot = commands.Bot(command_prefix='!', intents=intents) # 绑定消息事件回调:当有新消息时,Discord 主动推送数据触发此函数 @bot.event async def on_message(message): if message.author == bot.user: return # 忽略机器人自己发的消息 await message.channel.send(f"实时收到你的消息:{message.content}") bot.run('你的机器人TOKEN')
为什么不用轮询?
while True + requests.get 的轮询方式存在诸多问题:
- 效率极低:频繁的 HTTP 请求会浪费带宽和服务器资源
- 容易触发限流:Discord API 有严格的请求频率限制,轮询很容易超出限制导致机器人被暂时封禁
- 实时性差:轮询间隔短了耗资源,间隔长了会有明显延迟,远不如 WebSocket 推送的实时性
自定义 WebSocket 场景(不推荐)
如果你出于特殊需求想手动处理 WebSocket 连接(比如不依赖 discord.py 的高层封装),可以直接对接 Discord 的 Gateway API,自己实现连接握手、心跳维持、事件解析等逻辑,但这需要处理大量底层细节,discord.py 已经把这些工作都做好了,绝大多数场景下完全没必要重复造轮子。
内容的提问来源于stack exchange,提问作者Jacob B
相关产品推荐
相关产品推荐

