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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:22:09