【问题标题】:Fetch more than 100 messages获取超过 100 条消息
【发布时间】:2019-08-04 19:02:25
【问题描述】:

我正在尝试找出一种方法,使用循环来获取不和谐的旧消息,使用 fetchMesasges()before。我想使用循环获得超过 100 的限制,但我无法弄清楚,我能找到的每篇文章都只讨论如何使用循环删除超过 100 的限制,我只需要检索它们。

我是编码新手,尤其是 javascript,所以我希望有人可以帮助我朝着正确的方向发展。

这是我能够设法检索超过 100 回的消息的唯一方法(在多次尝试使用循环失败之后):

channel.fetchMessages({ limit: 100 })
    .then(msg => {
        let toBeArray = msg;
        let firstLastPost = toBeArray.last().id;

        receivedMessage.channel
            .fetchMessages({ limit: 100, before: firstLastPost })
            .then(msg => {
                let secondToBeArray = msg;
                let secondLastPost = secondToBeArray.last().id;

                receivedMessage.channel
                    .fetchMessages({ limit: 100, before: secondLastPost })
                    .then(msg => {
                        let thirdArray = msg;
                        let thirdLastPost = thirdArray.last().id;

                        receivedMessage.channel
                            .fetchMessages({ limit: 100, before: thirdLastPost })
                            .then(msg => {
                                let fourthArray = msg;
                            });
                    });
            });
    });

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    您可以做的是使用async/await function 和循环来发出顺序请求

    async function lots_of_messages_getter(channel, limit = 500) {
        const sum_messages = [];
        let last_id;
    
        while (true) {
            const options = { limit: 100 };
            if (last_id) {
                options.before = last_id;
            }
    
            const messages = await channel.fetchMessages(options);
            sum_messages.push(...messages.array());
            last_id = messages.last().id;
    
            if (messages.size != 100 || sum_messages >= limit) {
                break;
            }
        }
    
        return sum_messages;
    }
    

    【讨论】:

    • 这对我很有用。我仍然在遍历单独的数组时遇到了一些麻烦,因为 .push 为每获取的 100 个帖子创建了一个包含单独数组的数组。我正在尝试找到一种方法来使 concat 工作。无论如何,感谢您的反馈,它帮助了很多!
    • 阅读docs for .concat();
    • @D.Overton 我已更新示例以使用扩展运算符 (sum_messages.push(...messages.array());)
    • @Jason 我将阅读docs 以进一步熟悉它。但我认为这正是我所需要的。谢谢。
    • 我认为您在最后一个条件中缺少长度sum_messages.length >= limit
    【解决方案2】:

    这适用于我使用 discord.js v 11.5.1 和 TypeScript。它是Jason's post 的更新版本。

    我使用它的原因是:DiscordAPI 获取消息的限制最大为 100,并且已弃用的 TextChannel#fetchMessages() 方法不再存在。

    我将其更新为使用 TextChannel#messages 对象的 fetch(options?: ChannelLogsQueryOptions, cache?: boolean) 方法来获取 100 条或更少消息的集合。

    async function getMessages(channel: TextChannel, limit: number = 100): Promise<Message[]> {
      let out: Message[] = []
      if (limit <= 100) {
        let messages: Collection < string, Message > = await channel.messages.fetch({ limit: limit })
        out.push(...messages.array())
      } else {
        let rounds = (limit / 100) + (limit % 100 ? 1 : 0)
        let last_id: string = ""
        for (let x = 0; x < rounds; x++) {
          const options: ChannelLogsQueryOptions = {
            limit: 100
          }
          if (last_id.length > 0) {
            options.before = last_id
          }
          const messages: Collection < string, Message > = await channel.messages.fetch(options)
          out.push(...messages.array())
          last_id = messages.array()[(messages.array().length - 1)].id
        }
      }
      return out
    }

    【讨论】:

    • 我还稍微更新了 sn-p,添加了函数的返回类型并将其从公共方法更改为静态函数。
    猜你喜欢
    • 2021-05-22
    • 2023-03-15
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多