Discord.py如何加载机器人启动前的消息以检测编辑删除变动
消息日志机器人无法识别启动前消息变动的解决方案
问题根本原因
绝大多数机器人框架的消息编辑、删除事件,默认依赖本地内存缓存的消息数据触发:只有机器人启动后接收到的消息才会被存入缓存,当收到某条消息的变动通知时,框架会先检索缓存中是否存在对应原始消息,找不到就不会触发on_message_edited()、on_message_deleted()回调,所以你无法捕获启动前发送的消息的变动。
可行解决方案
方案1:启动时预拉取历史消息写入框架缓存(适配原有事件逻辑,改造成本低)
如果你用的是discord.py类的Python机器人框架,可以直接在启动完成后批量拉取近期历史消息,手动写入框架自带的消息缓存,原有事件代码不需要改动就能生效,参考示例代码:
# 初始化Bot实例时可以调整缓存上限,默认最多存1000条消息 bot = commands.Bot(command_prefix="!", intents=intents, max_messages=10000) @bot.event async def on_ready(): # 遍历所有有权限访问的文本频道 for guild in bot.guilds: for channel in guild.text_channels: # 拉取频道最近100条消息,limit可根据需求调整,设置为None会拉取全部可访问历史 async for message in channel.history(limit=100): # 手动将历史消息添加到框架缓存 bot._connection.messages.add(message)
注意:使用该方案需要先在对应平台的开发者后台开启消息内容权限,否则无法拉取到完整的消息内容。
方案2:自行存储历史消息+监听原生事件(稳定性更高,支持更长时间范围)
如果需要覆盖更久的历史消息,或者框架缓存容量有限,可以自行将拉取到的历史消息存入本地数据库/内存字典,同时监听框架提供的raw级别的变动事件:这类事件不需要校验本地缓存,只要平台推送了变动通知就会触发,返回消息ID后你直接匹配自己存储的历史数据即可完成日志记录。
以discord.py为例,对应事件为on_raw_message_edit()、on_raw_message_delete()。
注意限制
- 可拉取的历史消息范围受机器人权限限制,没有「查看消息历史」权限的频道无法拉取对应消息
- 多数聊天平台会限制历史消息拉取的频率和单次拉取数量,不建议频繁拉取全量历史,按需设置拉取的时间范围/消息数量即可,避免触发速率限制。
内容的提问来源于stack exchange,提问作者Seanthescienceguy
相关产品推荐
相关产品推荐

