【问题标题】:How to create a randomized search query for a discord bot如何为不和谐机器人创建随机搜索查询
【发布时间】:2020-12-14 20:10:24
【问题描述】:

我想制作一个机器人命令,允许用户获取他们选择的随机图像。 (!image dog)

如何让用户输入他们想要搜索的图像?这是我目前所拥有的:

client.on("message", (message) => {
    let args = message.content.substring(prefix.length).split(" ");

    switch (args[0]) {
        case "dog":
            image(message);

            break;
    }
});

function image(message) {
    var options = {
        url: "http://results.dogpile.com/serp?qc=images&q=" + "dog",
        method: "GET",
        headers: {
            Accept: "text/html",
            "User-Agent": "Chrome",
        },
    };

    request(options, function (error, response, responseBody) {
        if (error) {
            return;
        }

        $ = cheerio.load(responseBody);

        var links = $(".image a.link");

        var urls = new Array(links.length).fill(0).map((v, i) => links.eq(i).attr("href"));

        console.log(urls);
        if (!urls.length) {
            return;
        }

        // Send result
        message.channel.send(urls[Math.floor(Math.random() * urls.length)]);
    });
}

【问题讨论】:

  • 你需要更具体。 “输入他们想要搜索的图像”是什么意思?您是说您希望您的用户能够执行!image cat 并获得猫的照片,而不是仅仅执行!image dog?或者您是说他们应该能够执行!image dog poodle 之类的操作并获得特定狗的图像结果?
  • 第一个,我希望用户能够搜索到他们想要的东西

标签: discord discord.js bots google-image-search


【解决方案1】:

您当前的代码正走在正确的轨道上,可以做您想做的事。您只需要正确使用您的 args 变量即可。

问题

首先,您需要将您的args 与您的命令分开。您在问题中提供的代码当前将命令本身(“图像”)计为第一个参数,将“狗”计为第二个参数,而“狗”应该是命令的第一个参数。所以我们需要将命令与 args 分开,我们可以使用 Array.shift() 轻松做到这一点,它会删除数组的第一个元素并返回它。

在您当前的代码中,您有一个 switch 语句检查消息中第一个参数 (args[0]) 的值,如果第一个参数是“狗”,则您正在搜索狗图像。但是您想要做的是您希望能够搜索的不仅仅是狗,而是用户想要的任何图像。这意味着您首先需要摆脱参数检查switch,因为现在它只允许用户搜索“狗”。

接下来,您需要意识到您想要搜索用户输入的任何图像。那么用户输入的值是什么?它包含在args[0] 中。因此,如果您希望能够搜索args[0] 是什么,而不是使用"http://results.dogpile.com/serp?qc=images&q=" + "dog",您需要改为使用"http://results.dogpile.com/serp?qc=images&q=" + args[0]。为此,您还需要为您的 image 方法提供对 args[0] 的访问权限,您可以通过将其作为方法的参数传入来实现。

解决方案

以下是这些简单修复在您的代码中的外观:

client.on("message", (message) => {
    let args = message.content.substring(prefix.length).split(" ");
    let command = args.shift(); //separates and removes command from args

    switch (command) {
        case "image":
            image(message, args[0]);

            break;
    }
});

function image(message, query) {
    //'query' now represents 'args[0]'

    var options = {
        url: "http://results.dogpile.com/serp?qc=images&q=" + query,
        method: "GET",
        headers: {
            Accept: "text/html",
            "User-Agent": "Chrome",
        },
    };

    request(options, function (error, response, responseBody) {
        if (error) {
            return;
        }

        $ = cheerio.load(responseBody);

        var links = $(".image a.link");

        var urls = new Array(links.length).fill(0).map((v, i) => links.eq(i).attr("href"));

        console.log(urls);
        if (!urls.length) {
            return;
        }

        // Send result
        message.channel.send(urls[Math.floor(Math.random() * urls.length)]);
    });
}

但是,请注意,这只会获取第一个参数并搜索它(它不会包含空格)。所以如果你做了!image furry cats,它只会查找“毛茸茸”的图像,而不是“毛茸茸的猫”。如果您想考虑空格,请使用所有 args 而不仅仅是 args[0]。为此,您可以将此代码中出现的所有 args[0] 替换为 args.join(" ")

如果我误解了您的问题,请告诉我。此答案仅基于您在问题和评论中提供的有限信息。

【讨论】:

  • 谢谢,它有效!对不起,如果我感到困惑,我是新手!
  • 没问题!当涉及到您的问题时,您通过为您的问题提供所有必要的代码并陈述您的问题做得很好。你也在你的评论中正确地澄清了。以后在提出此类问题时请务必更加具体,因为解释一般性问题的方法总是不止一种!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2020-12-28
  • 2021-08-07
  • 2021-03-11
  • 2021-06-02
  • 2020-01-10
  • 2021-03-05
相关资源
最近更新 更多