维基百科搜索discord bot命令

这是我第一次编写机器人编码,我需要帮助我在Discord上使用我的维基百科机器人 . 它是用维基百科api编写的 .

wikipedia = wikipedia.summary('', sentences=1, chars=100, 
auto_suggest=True, redirect=True)

@client.event
async def on_message(message):
    if message.content.startswith('!define'):
       await client.send_message(message.channel, wikipedia)

如何让机器人识别第一行的搜索?我希望命令搜索!define之后放置的单词 .

谢谢!

回答(1)

2 years ago

据我所知,这是代码有多个问题 . 首先,你的 wikipedia 变量需要是一个函数,好像你可能没有掌握python的一些基础知识,如果是这种情况,我建议你阅读函数herehere . 函数可以使用一个或多个参数并返回一个值 . 在您的情况下,您可能希望传递带有要定义的术语的参数,并且返回的值将是定义 . snytax就是这样的:

def wiki_summary(arg):

    definition = wikipedia.summary(arg, sentences=1, chars=100, 
    auto_suggest=True, redirect=True)
    return definition

在您的client.send_message函数中,您可以调用新创建的函数,可以使用 client.send_message(message.channel, wiki_summary(arg) 执行此操作,其中arg将替换为您希望维基百科定义的术语 . 在您的情况下,这将是"!define"之后的消息中的所有单词 . 最简单的方法是使用 .split()Docs),这将字符串分隔为子字符串,默认的分隔符是空格,并创建包含所有子字符串的列表 . 要获取第一个单词("!define")之后的所有单词,您可以使用list indices([start:end]),选择除列表[1:]列表中第一个对象之外的所有单词,这将启动列表1中的选择在列表的末尾结束它 . 在代码中,这看起来像这样:

words = message.content.split()
important_words = words[1:]

然后,您希望将这些重要的单词作为arg传递到 wikipedia 函数中,如下所示:

@client.event
async def on_message(message):
    if message.content.startswith('!define'):
       words = message.content.split()
       important_words = words[1:]
       await client.send_message(message.channel, wiki_summary(important_words)

如Aaron所建议的那样,改进将是"!define"不区分大小写,这意味着用户输入"!Define"或"!DeFInE"并不重要,两者都将被机器人接受 . 为此,我们可以使用 .lower() (或任何其他统一的大写功能) . 这使得字符串中的所有字符都为小写 . 要使用它,我们将检查用户消息的第一个单词是否与"!define"(小写)相同 . 像这样:

if message.content.split()[0].lower() == "!define"

这里有一些事情一次发生,首先我们要获取单词列表的消息,然后使用列表indice为0访问第一个单词,然后将其设为小写,最后我们将它与您的"!define"关键字进行比较 .

由于这会检查消息中的第一个单词是否为"!define",因此我们可以用此替换 .startswith() 函数 . 因此:

@client.event
async def on_message(message):
words = message.content.split()
    if words[0].lower() == "!define":
       important_words = words[1:]
       await client.send_message(message.channel, wiki_summary(important_words))