所以,最近我尝试使用一个名为“消息备份!”的机器人。要保存每条消息,让我们说“常规”(不是转发消息,而是复制频道中所有以前的消息),然后您可以让机器人将每条消息粘贴到不同服务器中的“常规”频道,并使用显示的 webhook用户名和 pfp。但机器人经常遇到错误,并且冷却时间太长(对我来说)。
我的问题是,如何让机器人收集频道中的所有消息以及如何让机器人使用 webhook 重新发送所有这些消息(使用用户名和 pfp)?我真的不知道如何开始使用 webhook 东西。
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
}
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,
});
}
}