如何获取某个用户发送的最后 1000 条消息?

Posted

技术标签:

【中文标题】如何获取某个用户发送的最后 1000 条消息?【英文标题】:How can I get the last 1000 messages sent by a certain user? 【发布时间】:2022-01-22 08:42:10 【问题描述】:

我已尝试channel.fetchMessages(),但限制为 100 条消息。它适用于应该使用机器学习模拟用户的机器人。

【问题讨论】:

再重复 fetch 调用 99 次? @evolutionxbox 这是 API 垃圾邮件,它只会不断收到相同的消息 要获得大量消息,您确实只是在遵守速率限制的情况下一次又一次地获取消息。而且您不能只从单个用户那里获取消息,您只需获取频道中的所有消息并过滤掉那些不是来自您想要的用户的消息。实际上,您只想获取通道中的所有消息一次,并将它们存储在您将从中提取的数据库中。 fetchMessages 方法只给出最后 100 条消息,我认为您将其与“如何删除最后 1000 次”混为一谈,在这种情况下它会起作用,因为最后 100 条消息将不断变化 只需获取您获取的最后一条消息的 ID 并将其设置为新 ChannelLogsQueryOptions 对象的 before 属性,然后将其提供给 MessageManager.fetch()。 Documentation. 【参考方案1】:

返回消息的限制为100,默认为50。详情见实际API docs。

默认情况下,您会收到 最新 条消息,但您可以在 fetching messages 时指定额外的 query criteria。您需要重复获取请求,每次调整查询条件,以便连续收集较旧的消息。每次请求后,您都可以分析到目前为止收集的内容,以确定是否需要继续获取。

当心rate limits。

【讨论】:

【参考方案2】:

考虑到@jsejcksn 提到的速率限制以及如何获取频道消息,这里是它的工作实现:

Example Implementation                                                                                 Run in Fusebit
let messagesCounter = 0;
const channel = await findChannel(discordClient);
// Channel messages are limited up to 100 messages per request.
const channelMessages = await getMessages(discordClient, channel.id);
// Accumulate fetched messages
let fetchedMessages = channelMessages;
// Fetch discord until you get MAX_NUMBER_OF_MESSAGES (1000)
let newMessages = channelMessages;
// If messages are returned, keep getting more until having 1000 messages
while (newMessages.length && messagesCounter < MAX_NUMBER_OF_MESSAGES) 
  // Keep a counter to prevent an infinite loop
  messagesCounter += channelMessages.length;
  // Using the before filter, you can get oldest messages by using the last returned message
  const oldestMessage = newMessages[channelMessages.length - 1];
  newMessages = await getMessages(discordClient, channel.id, oldestMessage.id);
  fetchedMessages = fetchedMessages.concat(newMessages);

// Return all the channel messages (up to 1000 messages!)
ctx.body = `There are $fetchedMessages.length messages in the $DISCORD_CHANNEL_NAME channel`;

根据返回的消息,您可以轻松地按用户 id 过滤

【讨论】:

以上是关于如何获取某个用户发送的最后 1000 条消息?的主要内容,如果未能解决你的问题,请参考以下文章

当用户不在聊天中时如何显示发送的最后一条消息?

如何将每个用户的最后一条消息显示给用户对话以保留聊天记录?

如何获取当前用户和其他人之间的最后一条消息?

如何使用 xmppframework 在 XMPP 中检索我自己发送的最后一条消息?

如何在Paho中获取最后五条消息?

如何使用 smack 和 openfire 获取 IOS 中每个聊天会话的最后一条消息?