如何在Jupyter Notebook中交互式运行discord.py并获取消息列表?
Discord.py 在Jupyter Notebook中获取频道消息历史并返回变量的方案
你原来的写法存在两个核心问题:
@bot.command()是注册触发式命令,需要用户在对应Discord频道发送指令才会执行逻辑,无法主动在Jupyter中调用获取返回值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
相关产品推荐
相关产品推荐

