2017-09-26 125 views
1

这是我第一次编码一个机器人,我需要帮助我的维基百科僵尸不一致。它是用维基百科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后面的单词。

谢谢!

回答

2

据我所见,这是代码有多个问题。首先,你的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) 

的改进,由亚伦的建议,将要让“!define”不区分大小写,这意味着用户键入“!Define”或“!DeFInE”并不重要,两者都会被bot接受。要做到这一点,我们可以使用.lower()(或任何其他统一的大写函数)。这使得字符串中的所有字符都为小写。为了使用它,我们将检查小写用户消息的第一个单词是否与“!define”(小写)相同。像这样:

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

有几件事情在发生一次在这里,我们首先.split()消息得到的单词的列表,然后为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)) 
+0

为了清楚起见,我会将'wikipedia'函数重命名为其他内容。 'wiki_summary(search_term)'不太可能与模块的wikipedia'混淆。否则,您可以点击我输入的答案中的所有要点。另一个建议是调用'if message.content.lower()。startswith('!define')'以确保用户在调用该命令时不需要担心大写字母(包括幽默和捕获打字错误这对机器人来说很容易修正)。也可以在顶部声明'单词',然后是'if words [0] .lower()=='define!' – Aaron3468

+0

你说得对,我会相应地编辑我的答案,谢谢。 对不起,您的答案被盗。 –

+0

哈哈,不用担心。我们都在这里帮助彼此,而且代表比较经得起时间考验的答案并不重要。 – Aaron3468