2017-09-26 35 views
1

これは私の初めてのボットのコーディングで、DiscordのWikipediaボットのヘルプが必要です。これはwikipedia apiで書かれています。Wikipedia検索discord botコマンド

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の基本を把握できないように思えます。その場合は、関数hereまたはhereについて読むことをお勧めします。関数は1つまたは複数の引数をとり、値を返すことができます。あなたの場合、あなたが定義したい用語を引数に渡して、返された値が定義になります。あなたはその後、新しく作成した関数を呼び出すしたいあなたclient.send_message機能では、あなたがargはあなたがウィキペディアをしたい用語に置き換えられclient.send_message(message.channel, wiki_summary(arg)、でこれを行うことができます

def wiki_summary(arg): 

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

:このためsnytaxは次のようなものになるだろう定義する。 あなたの場合、これは "!define"の後のメッセージのすべての単語になります。これを行う最も簡単な方法は、.split()Docs)を使用することです。これは文字列を部分文字列に区切り、デフォルトの区切り文字はスペースであり、すべての部分文字列を含むリストを作成します。最初の単語( "!define")の後のすべての単語を取得するには、list indices([開始:終了])を使用してリスト[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'とはるかに混同されにくいです。さもなければ、私が入力していた答えのすべての点に当たった。もう一つの勧告は、コマンドを呼び出すときに大文字化について心配する必要がないことを確実にするために 'if message.content.lower()。startswith( '!define')を呼び出すことです(ユーモアとタイピングエラーボットが修正するのは簡単です)。一番上に 'words 'を宣言し、' words [0] .lower()=='を定義すると!'' – Aaron3468

+0

あなたが正しいです、私はそれに応じて、私の答えを編集します。 あなたの答えを盗んで申し訳ありません。 –

+0

母親、心配しないでください。私たちは皆、お互いに助け合うためにここにおり、担当者は時間の試練に耐える答えと比べて重要ではありません。 – Aaron3468

関連する問題