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

如何在Jupyter Notebook中交互式运行discord.py并获取消息列表?

Discord.py 在Jupyter Notebook中获取频道消息历史并返回变量的方案

你原来的写法存在两个核心问题:

  1. @bot.command() 是注册触发式命令,需要用户在对应Discord频道发送指令才会执行逻辑,无法主动在Jupyter中调用获取返回值
  2. client.run() 是阻塞方法,执行后会持续占用线程保持机器人运行,Jupyter单元格会一直处于运行中状态,无法继续执行后续代码也拿不到返回值

正确实现步骤

前置准备

  • 已经在Discord开发者后台创建机器人,获取到机器人令牌(Token)
  • 已开启机器人的「消息内容意图」(Message Content Intent)开关
  • 机器人已加入目标服务器,且拥有对应频道的「读取消息历史」权限
  • 提前安装依赖:pip install discord.py nest_asyncio

代码实现

首先执行初始化代码块:

import discord
import nest_asyncio
# 解决Jupyter默认事件循环不支持嵌套运行的问题
nest_asyncio.apply()

# 配置客户端权限
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

# 替换为你自己的机器人令牌和目标频道ID
BOT_TOKEN = "你的机器人令牌"
TARGET_CHANNEL_ID = 1234567890 # 替换为实际频道ID,为整数类型不要加引号

然后执行获取消息的代码块,返回的列表可以直接赋值给Jupyter变量供后续使用:

async def fetch_history(limit=100):
    # 登录机器人
    await client.login(BOT_TOKEN)
    # 获取目标频道对象
    channel = await client.fetch_channel(TARGET_CHANNEL_ID)
    message_list = []
    # 遍历消息历史
    async for message in channel.history(limit=limit):
        # 可根据需求自定义存储的字段,也可以直接存储完整的message对象
        message_list.append({
            "作者": str(message.author),
            "内容": message.content,
            "发送时间": message.created_at,
            "消息ID": message.id
        })
    # 关闭机器人连接,避免残留
    await client.close()
    return message_list

# Jupyter原生支持直接await异步函数,返回值直接存入变量
message_list = await fetch_history(limit=100)

执行完成后,你可以直接在后续单元格中操作message_list变量,比如打印数量、遍历筛选内容等。


注意事项

  • 不要泄露你的机器人令牌,避免被恶意使用
  • 如果需要多次拉取消息,可将登录、登出逻辑拆分,避免重复建立连接
  • 若仅需要处理纯文本内容,建议只存储需要的字段,减少内存占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:54:04