【问题标题】:Why is an error occurring in my bot? How can I solve it?为什么我的机器人出现错误?我该如何解决?
【发布时间】:2021-05-21 00:44:04
【问题描述】:

我有一个制作测验机器人的项目(我自己给的)。我非常喜欢口袋妖怪,所以我正在努力。 pokedex 是我创建的一个库,其中包含每个 pokemon 的名称。我已经包括了以后的时间。总之,

    import random
    import pokedex
    import discord
    import pandas as pd
    import time
    import os
    
    client=discord.Client()
      
    
    @client.event
    async def on_ready():
      print("We have logged in as {0.user}".format(client))
    
    @client.event
    async def on_message(message):
      msg=message.content
      if message.author==client.user:
        return 
    
      if msg.startswith("-q jname"):
        await message.channel.send("Unscramble these letters to create a name of a pokemon:")
        s=random.choice(pokedex.poke)["name"]
        await message.channel.send(''.join(random.sample(s,len(s))))
        p=""
        for i in s:
          if i=="(":
            p=p+i
          elif i==")":
            p=p+i
          else:
            p=p+"-"
          await message.channel.send(p)
          if(msg==s):
            await message.channel.send("Correct Answer")
          else:
            await message.channel.send("Wrong! The correct Answer is:")
            await message.channel.send(s)
    client.run(os.getenv("Token"))

这是我的代码。现在显然我遇到的错误是测验机器人认为该命令是问题的答案。请告诉我如何解决这个问题。

这是错误的外观:(机器人重复错误答案消息,并将命令作为答案)

【问题讨论】:

  • 能否请您告诉我们确切的错误代码以及它在哪一行?
  • 确定让我添加它

标签: python discord.py bots


【解决方案1】:

看看discord.py rewrite | How to wait for author message?

问题是,您正在检查消息是否以“-q jname”开头,然后在该命令中检查消息是否正确。当然“-q jname”是不正确的,所以你需要等待用户发送另一条消息,然后使用该消息进行检查。

import random
import pokedex
import discord
import pandas as pd
import time
import os

client=discord.Client()
  

@client.event
async def on_ready():
  print("We have logged in as {0.user}".format(client))

@client.event
async def on_message(message):
  msg=message.content
  if message.author==client.user:
    return 

  if msg.startswith("-q jname"):
    def check(author)
        if message.author != author:
            return False
        else:
            return True
    await message.channel.send("Unscramble these letters to create a name of a pokemon:")
    s=random.choice(pokedex.poke)["name"]
    await message.channel.send(''.join(random.sample(s,len(s))))
    msg = await client.wait_for('message', check=check(message.author),    timeout=30).content
    p=""
    for i in s:
      if i=="(":
        p=p+i
      elif i==")":
        p=p+i
      else:
        p=p+"-"
      await message.channel.send(p)
      if(msg==s):
        await message.channel.send("Correct Answer")
      else:
        await message.channel.send("Wrong! The correct Answer is:")
        await message.channel.send(s)
client.run(os.getenv("Token"))

【讨论】:

  • msg = await client.wait_for('message', check=check, ti​​meout=30),那么你需要检查msg而不是原始消息。另外,定义一个类似于我在答案开头添加的链接中的检查功能。
  • 即使我写了正确答案,但现在不是正确答案或错误答案
  • @KunshTyagi 用我添加的新代码再试一次,现在它将 msg 设置为 message.content
  • 它仍然无法正常工作,它没有正确答案并且没有响应
【解决方案2】:

首先建立在 Oblique 对 bot.wait_for 的回答之上,您的代码在 for 循环中具有发送函数,并且每次迭代都会发送一条消息。

我在下面附上了我编辑的代码。使用 ID 也是一种很好的做法,因此如果两个频道(或用户)具有相同的名称,则不会导致任何错误

import random
import pokedex
import discord
import pandas as pd
import time
import os

client = discord.Client()

@client.event
async def on_ready():
  print("We have logged in as {0.user}".format(client))

@client.event
async def on_message(message):
  msg = message.content
  if message.author.id == client.user.id:
    return 

  if msg.startswith("-q jname"):
    def check(check_message)
      if message.author.id != check_message.author.id:
        return False
      return True

    await message.channel.send("Unscramble these letters to create a name of a pokemon:")

    pokemon = random.choice(pokedex.poke)["name"]
    await message.channel.send(''.join(random.sample(pokemon, len(pokemon))))

    try:
      msg = await client.wait_for('message', check=check, timeout=30)
    except:
      pass
      
    if msg.content.lower() == pokemon:
      await message.channel.send("Correct Answer")
    else:
      await message.channel.send("Wrong! The correct Answer is:")
      await message.channel.send(pokemon)

client.run(os.getenv("Token"))

【讨论】:

  • 倾斜的代码和你我的都发送如下错误信息:imgur.com/a/uxy5yNo我不明白为什么?
  • 哦,这很简单,就是说当超时时间达到 30 秒时,就会引发该错误。一个简单的尝试就可以解决这个问题
  • 我还注意到检查有点不对,但修复了它
  • @KunshTyagi 如果此答案有效,您能否将其标记为已完成?
猜你喜欢
  • 2019-12-22
  • 2021-09-28
  • 1970-01-01
  • 2020-03-30
  • 2019-06-28
  • 1970-01-01
  • 2020-09-14
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多