2017-09-26 4 views
1

이것은 처음으로 로봇을 코딩 한 것이므로 Discord에 대한 나의 Wikipedia 봇에 도움이 필요합니다. 그것은 위키피디아 API로 작성되었습니다.Wikipedia 검색 불화 봇 명령

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 변수가 함수 여야합니다. 파이썬의 기본 사항 중 일부를 파악하지 못한 것처럼 보입니다. 그렇다면 함수 here 또는 here에 대해 읽는 것이 좋습니다. 함수는 하나 이상의 인수를 취하여 값을 반환 할 수 있습니다. 귀하의 경우에는 정의하려는 용어와 함께 인수를 전달해야하며 반환 값은 정의입니다. 이에 대한 snytax은 같은 것입니다 : 당신이 새로 생성 함수를 호출하려는 client.send_message 기능에서

def wiki_summary(arg): 

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

을, 당신은 인수가 당신에게 위키 피 디아를 원하는 용어로 대체 client.send_message(message.channel, wiki_summary(arg),이 작업을 수행 할 수 있습니다 밝히다. "! define"뒤에 메시지의 모든 단어가 표시됩니다. 이를 수행하는 가장 간단한 방법은 .split() (Docs)을 사용하는 것입니다.이 방법은 문자열을 하위 문자열로 분리하고 기본 구분 기호는 공백이며 모든 하위 문자열을 포함하는 목록을 만듭니다. 첫 번째 단어 ("! define") 뒤에 오는 단어를 모두 얻으려면 list indices ([start : end])을 사용하여 list [1 :]을 사용하는 목록의 첫 번째 객체를 제외한 모든 것을 선택하면 다음과 같이 선택이 시작됩니다. 1을 목록 화하고 목록의 끝에서 끝냅니다. 것, 아론에 의해 제안,

@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) 

개선점 : 그런 다음, 당신의 wikipedia 함수에서 인수 이러한 중요한 단어를 전달과 같이 할

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

: 코드에서이 같이 보입니다 "! Define"또는 "! DeFInE"를 입력해도 문제가되지 않는다는 것을 의미하므로 "! define"은 대소 문자를 구분하지 않아야합니다. 둘 다 봇에 의해 허용됩니다. 이렇게하려면 .lower() (또는 다른 통합 대문자 사용)을 사용할 수 있습니다. 이렇게하면 문자열의 모든 문자가 소문자가됩니다. 이를 사용하려면 사용자 메시지의 첫 번째 단어가 소문자로 "! define"(소문자)과 같은지 확인합니다. 그래서 같이 :

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

몇 가지 먼저 우리가 단어의 목록을 얻을 수있는 메시지를 .split() 한 번 여기에서 일어나고, 그 다음 다음, 0의 목록 indice와 함께 첫 번째 단어에 액세스가 소문자로 만들고, 마지막으로 "! 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'와 혼동 될 가능성이 훨씬 적습니다. 그렇지 않으면 내가 입력 한 답변의 모든 점을 명중했습니다. 또 다른 추천은''message.content.lower(). startswith ('! define')'를 호출하여 사용자가 명령을 호출 할 때 대문자 사용에 대해 너무 걱정하지 않아도된다는 것입니다 (유머와 타이핑 오류 모두 봇이 쉽게 수정할 수 있음). 상단에'단어'를 선언하고,'words [0] .lower() == '를 정의하면!'' – Aaron3468

+0

네 말이 맞아, 고맙게, 내 대답을 편집 할게. 답변을 훔쳐서 죄송합니다. –

+0

하하, 걱정할 필요가 없습니다. 우리 모두는 서로를 도우려고 여기에 있으며, 반복자는 시간의 시험을 견디는 답과 비교하여 중요하지 않습니다. – Aaron3468