Discord 机器人将消息从一台服务器复制到另一台服务器?

问题描述 投票:0回答:1

所以,最近我尝试使用一个名为“消息备份!”的机器人。要保存每条消息,让我们说“常规”(不是转发消息,而是复制频道中所有以前的消息),然后您可以让机器人将每条消息粘贴到不同服务器中的“常规”频道,并使用显示的 webhook用户名和 pfp。但机器人经常遇到错误,并且冷却时间太长(对我来说)。

我的问题是,如何让机器人收集频道中的所有消息以及如何让机器人使用 webhook 重新发送所有这些消息(使用用户名和 pfp)?我真的不知道如何开始使用 webhook 东西。

discord discord.js webhooks
1个回答
0
投票

Discord 允许您一次最多从一个频道获取 100 条消息。这是有详细记录的,您可以在here找到示例。如果您想保留消息的顺序,您很可能需要先获取所有消息,然后再开始使用 Webhook 将它们发布到其他地方。

Webhook 可以手动和编程方式创建/使用,但在这里您应该手动为目标通道创建一个 webhook。您可以在 discordjs.guide 上找到有关 Webhook 的不错的概述。

通过一些调整来调整之前链接的答案中的代码(例如“之前”id,以允许您中途重新启动机器人,正如您提到的一些错误和冷却问题),您最终可能会得到几个功能像这样:

const channelID = '<channel id>';

// Passing in the id of the last message fetched before a crash should start the bot back where it left off
async function fetchAllMessages(beforeId) {
    const channel = client.channels.cache.get(channelID);
    let messages = [];

    // Fetch parameters
    let fetchParams = { limit: 1 };
    if (beforeId) {
        fetchParams.before = beforeId;
    }

    // Create message pointer
    let message = await channel.messages
        .fetch(fetchParams)
        .then(messagePage => (messagePage.size === 1 ? messagePage.first() : null));

    while (message) {
        fetchParams = { limit: 100, before: message.id };
        await channel.messages
            .fetch(fetchParams)
            .then(messagePage => {
                messagePage.forEach(msg => messages.push(msg));

                // Update our message pointer to be the last message in the page of messages
                message = messagePage.size > 0 ? messagePage.last() : null;

                // Print out the ID of the last message fetched
                console.log(`Last message ID fetched: ${message ? message.id : 'No more messages'}`);
            });
    }

    return messages.reverse(); // Reverse messages, because we fetched them newest->oldest
}

下面的代码使用discord.js自动发送所有消息

WebhookClient

const webhookURL = '<webhook url>';
const webhookClient = new WebhookClient({ url: webhookURL });

async function cloneMessages(messages) {
    for (let msg of messages) { 
        const { content, author: { username, avatarURL } } = msg;
        await webhookClient.send(content, {
            username,
            avatarURL,
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.