Discord JS bot 如何从 API 获取递归异步函数

Posted

技术标签:

【中文标题】Discord JS bot 如何从 API 获取递归异步函数【英文标题】:Discord JS bot how to make a recursive async function fetching from API 【发布时间】:2021-12-23 21:41:54 【问题描述】:

我正在尝试制作一个不和谐的机器人。我希望它每 X 秒获取一次 API 并检查创建的新主题。

API JSON 仅包含一个对象,即网站上的最新帖子。我希望机器人每 X 秒获取一次,并且如果找到的最新帖子具有更大的 uid 以在频道中发送消息。如果不是什么都不做。 uid 是一个数字。

尝试使用 setInterval 函数,但无法使其工作,因为它给出了等待需要在***异步函数中的错误。

我还硬编码了最新的帖子 uid“latest_post”,我看到它工作的方式是,如果来自 API 的 post_id 高于硬编码的,然后硬编码的一个接收新的值。然而,latest_post 的值保持不变,因为函数再次执行并且 lates_post 每次都被硬编码。试图在函数外部声明它,但结果是未定义的。

这是我目前的几乎可以工作代码

client.on('messageCreate', async (message) => 
    if (!message.content.startsWith(prefix) || message.author.bot) return;    
    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();
    if (command === 'new') 
        var latest_post = 12345; // hardcoded latest post uid 
      try 
        const response = await fetch('API HERE').then(r => r.text()); 
        const body = JSON.parse(response);
        const obj = body.data;
        const objId = obj[0].post_id; 
        const objAuthor = obj[0].author;
        const objTitle = obj[0].title;    

        if (objTopic > latest_post) 

          client.channels.cache.get("CHANNEL ID").send(`Found a new post by $objAuthor`);              
        var latest_post = objId; // if it fetches a post with a higher uid then latest_post receives the value of that higher uid
         else 

          var d = new Date();
          var n = d.toLocaleTimeString();
          console.log(`No new posts yet at $n`); //logs "No new posts yet at 1:30 PM"
        

       catch (error) 
        message.channel.send('Oops, there was an error fetching the API');
        console.log(error);
      
    
  );

谁能指导我如何将其转换为每 X 秒自动运行的递归函数。 谢谢!

【问题讨论】:

你可以尝试使用现有的库 socket io 来轮询 nodejs 或类似的东西 I want it to fetch an API every X seconds - 我不会推荐它。这可能会让您受到限速。我确信有一种方法可以在不不断获取的情况下聆听它 我认识 API 专家,所以 ratelimit 应该不是问题。不过感谢您的提醒:) 【参考方案1】:

经过一些迭代后,它以我想要的方式工作。将代码留在下面,希望对您有所帮助!

  let refreshint = 10 * 1000;  //10 seconds
  var API = "API_HERE";

  client.on('ready', async (message) => 
  console.log('Bot is connected...');

  var latest_post = 12345 // hardcoded latest post uid 
  setInterval(async function()

      try 
        const response = await fetch('API').then(r => r.text()); 
        const body = JSON.parse(response);
        const obj = body.data;
        const objId = obj[0].post_id; 
        const objAuthor = obj[0].author;
        const objTitle = obj[0].title;

        if (objTopic > latest_post)              

          client.channels.cache.get("CHANNEL ID").send(`Found a new post by $objAuthor`); 

         console.log(`Found a new post by $objAuthor`);
            function change_value(latest_post)
            return latest_post;
            
          latest_post = change_value(topicId);

         else 
          var d = new Date();
          var n = d.toLocaleTimeString();
          console.log(`No new thread yet at $n`);
        

       catch (error) 
        message.channels.cache.get('channel ID here').send('Oops, there was an error fetching the API');
        console.log(error);
      

  , refreshint) );

【讨论】:

以上是关于Discord JS bot 如何从 API 获取递归异步函数的主要内容,如果未能解决你的问题,请参考以下文章

Discord bot 无法访问 Google Sheets 获取错误请求缺少有效的 API 密钥

从 discord.js 中的消息中获取 Emoji url

从数组中获取项目并将其删除,直到 Discord JS bot 的数组为空

如何使用 discord Bot 类获取给定 discord id 的用户信息?

Discord bot 从用户消息中获取照片

(Discord.js) Bot 删除所有发布的 URL