Discord Bot - 从网站下载 JSON 文件并提取其中的某些元素

Posted

技术标签:

【中文标题】Discord Bot - 从网站下载 JSON 文件并提取其中的某些元素【英文标题】:Discord Bot - Downloading JSON file from a website and extract certain elements of it 【发布时间】:2020-12-12 19:48:32 【问题描述】:

我正在编写一个命令,该命令将每天自动从链接中获取一个文件并提取其中的两个元素并将其作为消息发送到频道中。

我的问题是我在下载文件时遇到了问题。我一直在尝试几种不同的功能来获取文件,但到目前为止没有任何效果。我附上了我在下面尝试过的功能之一。

async function getQuote () 
        const url = "https://quotes.rest/qod?category=inspire";
        const path = Path.resolve(__dirname, 'temp', 'qod.json')
        const writer = fs.CreateWriteStream(path)

        const response = await axios(
            url,
            method: 'GET',
            responseType: 'stream'
        )

        response.data.pipe(writer)

        getQuote();

        return new Promise((resolve, reject) => 
            writer.on('finish', resolve)
            writer.on('error', reject)
        )
        


            fs.readFile('./temp/qod.json', 'utf8', function (err, data) 
                if (err) throw err;
                var obj = JSON.parse(data);
                msg.channel.send(data);
    )

我在这里尝试使用的文件如下所示:


    "success": 
        "total": 1
    ,
    "contents": 
        "quotes": [
            
                "quote": "What you do speaks so loudly that I cannot hear what you say.",
                "length": "61",
                "author": "Ralph Waldo Emerson",
                "tags": [
                    "action",
                    "inspire",
                    "leadership",
                    "management",
                    "tod"
                ],
                "category": "inspire",
                "language": "en",
                "date": "2020-08-23",
                "permalink": "https://theysaidso.com/quote/ralph-waldo-emerson-what-you-do-speaks-so-loudly-that-i-cannot-hear-what-you-say",
                "id": "eZ0NtMPtGp8c5eQJOBfJmweF",
                "background": "https://theysaidso.com/img/qod/qod-inspire.jpg",
                "title": "Inspiring Quote of the day"
            
        ]
    ,
    "baseurl": "https://theysaidso.com",
    "copyright": 
        "year": 2022,
        "url": "https://theysaidso.com"
    

想下载为json文件,但访问链接时,列为xml文档。

我将如何下载并从中提取两行?如果您想知道,这两行是引用和作者行。

谢谢!

【问题讨论】:

【参考方案1】:

我建议简单地读取对象的引用,然后使用插值创建一个字符串并将其发送到不和谐通道:

async function getQuote () 
    const url = "https://quotes.rest/qod?category=inspire";

    console.log("getQuote: Reading quote...");

    // Get the response as an object
    const response = await axios(
        url,
        method: 'GET'
    )

    // Use destructuring to get the quote and author
    let  quote, author  = response.data.contents.quotes[0];
    
    // Format our quote
    let data = `$quote - $author`;
    
    // Add a console.log for debugging purposes..
    console.log("getQuote: Sending quote:", data);

    // Send the quote on the channel
    msg.channel.send(data);

今天的报价将如下所示:

限制就像你自己的思想创造的海市蜃楼。当您意识到限制不存在时,您周围的人也会感受到它并允许您进入他们的空间。 - 斯蒂芬理查兹

【讨论】:

感谢您的提示!我试过了,但它没有返回任何结果。尝试在两个不同的系统上运行机器人,结果相同。它检测到该命令被调用但它不调用该函数。我没有收到任何错误,所以我不知道是什么原因造成的。 哦,太好了,感谢您尝试...可能值得添加一个或两个 console.log 以查看发生了什么。 好主意,我试试看! 我尝试在整个文档中添加一些 console.log 元素,但它没有吐出任何东西。我还检查了对该文件的所有引用,一切似乎都很好。你知道这可能是什么问题吗? 我知道我做错了什么。我做了这个函数,但我没有调用它。直到我在函数之外创建了一个 console.log 元素之前,我才弄清楚这一点。非常感谢您的帮助,它确实有效!【参考方案2】:

看起来您正在尝试将结果写入文件,然后从效率不高的文件中读取。这是一种更简单的方法。

async function getQuote() 
  const url = "https://quotes.rest/qod?category=inspire";

  const response = await axios(url);
  const result = response.data;

  /* 
  result = 
  
    "success": 
      "total": 1
    ,
    "contents": 
      "quotes": [
        
          "quote": "Limitations are like mirages created by your own mind. When you realise that limitation do not exist, those around you will also feel it and allow you inside their space. ",
          "length": "171",
          "author": "Stephen Richards",
          "tags": [
            "inspire",
            "motivational",
            "positive-thinking",
            "self-empowerment",
            "self-help",
            "self-improvement",
            "wealth",
            "wealth-creation"
          ],
          "category": "inspire",
          "language": "en",
          "date": "2020-08-24",
          "permalink": "https://theysaidso.com/quote/stephen-richards-limitations-are-like-mirages-created-by-your-own-mind-when-you",
          "id": "OLSVpLiSwrWplvCcFgPPiweF",
          "background": "https://theysaidso.com/img/qod/qod-inspire.jpg",
          "title": "Inspiring Quote of the day"
        
      ]
    ,
    "baseurl": "https://theysaidso.com",
    "copyright": 
      "year": 2022,
      "url": "https://theysaidso.com"
    
   
  */

  //this is an array of quote objects
  const quotes = result.contents.quotes;

  //extracting first quote object from the array
  const quoteObject = quotes[0];

  //extracting quote text and author from quote object
  const quote = quoteObject.quote;
  const author = quoteObject.author;
  
  //the >>> will make it look like a quote in discord.
  console.log(`>>> $quote\n- $author`);
  
  //send the formatted quote to the channel
  msg.channel.send(`>>> $quote\n- $author`);


  //if for some reason you want to save the result to a file
  fs.writeFile(filePath, result, function(err) 
    if (err) throw err;
    console.log('Saved!');
  );


getQuote();
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

【讨论】:

我要做的是从每次运行命令时都必须下载的文件中获取作者和引用。原因是该命令用于从指定的 URL 获取当天的报价。不幸的是,您提供的代码似乎只是永久使用该引用,这并不是我想要的。我将机器人托管在 AWS 服务器上,我真的不想通过远程桌面继续,添加新报价并重新启动机器人只是为了能够发送新的每日报价。 来自端点的响应不是硬编码的;这是非常动态的。您可以通过运行代码 sn-p(单击“运行代码片段”)并检查记录的报价来测试这一点。如果您在同一天多次运行该命令,它会给您相同的结果。第二天你会得到不同的报价。至于写这个评论,这是你运行代码sn-p时得到的引用:I keep asking myself these three questions ... What do you have? What do you want? What will you give up? - Jack Ma【参考方案3】:

我复制你的代码并运行我的本地机器,一切都很好。

限制就像是你自己的思想创造的海市蜃楼。当您意识到限制不存在时,您周围的人也会感受到它并允许您进入他们的空间。 - 斯蒂芬理查兹

【讨论】:

以上是关于Discord Bot - 从网站下载 JSON 文件并提取其中的某些元素的主要内容,如果未能解决你的问题,请参考以下文章

在 Discord Bot MAker 中从 JSON 解析数据

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

Discord money bot 将用户 ID 保存在 json 文件中。当 Not 重新启动时,它会为每个人创建一个新的(但相同的)ID

带有 json 数据库的 Python discord bot 命令

我需要我的 Discord Bot 处理外部网站的 GET 和 POST 请求

使用 Codeforces API 通过 discord bot (discord.py) 获取有关用户在 CF 问题上的所有 AC 的信息 - python 中的 json 文件处理错误