为啥这不适用于我的 Discord 机器人?

Posted

技术标签:

【中文标题】为啥这不适用于我的 Discord 机器人?【英文标题】:Why is this not working for my Discord bot?为什么这不适用于我的 Discord 机器人? 【发布时间】:2021-12-12 08:11:55 【问题描述】:

我目前正在为我主持的服务器开发 Discord 机器人(并希望最终加入我们运行的项目的开发团队)。当我的代码看起来像这样时,它工作得很好:

import discord
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):
    if message.author == client.user:
        return

    if message.content.startswith('!hello'):
        await message.channel.send('Hello!')

但是我遇到了一个问题,那就是该命令区分大小写并允许任何内容跟随该命令。我尝试按照我在另一篇文章中找到的内容进行操作,并提出了以下建议:

import discord
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):
    if message.author == client.user:
        return

    if message.content.lower == "!hello":
        await message.channel.send("Hello!")

现在我这样做了,该命令不起作用。问题是字符串中的感叹号吗?这是我最好的猜测,但我知道什么?如果有一种方法可以更轻松地实现更多命令,我愿意重新开始代码,因为我还没有实现很多命令,但我需要在未来添加更多。如果这是一种相对简单的方法,同时做我想做的事情(响应开头有感叹号的命令,字母顺序正确,没有多余的字母,不注意大小写,用一条简单的消息)然后简单地解决此方法不起作用的问题是可以接受的。

【问题讨论】:

lower 是一种方法。你想用lower() 调用它。 (在调试此类问题时,请尝试打印有问题的变量以查看它们的值是否符合您的预期。)此外,请查看commands 模块,以更轻松地实现前缀命令。请参阅this question 关于不区分大小写的信息。 【参考方案1】:

正如 CrazyChucky 所说,您想要的是 lower()。关于命令的评论可能会对您有所帮助。如果您想使用命令实现相同的目的,它看起来像这样:

import discord
import os
from discord.ext import commands

client = commands.Bot(command_prefix='!')

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

@client.command()
async def hello(ctx):
        await ctx.send("Hello!")

这样您就可以预先定义所有命令都以! 开头,并且您可以轻松设置更多命令。而不是消息,您有一些称为 context 或 ctx 的东西,因为它总是被引用。 ctx.send 与写 ctx.channel.send 相同,因此您可以看到它与您之前使用的 message 之间的相似之处。

你提到你不想让任何人在命令之后写任何东西。这也实现了这一点,但是,如果您在任何时候想要有人跟进命令并提供一些附加信息,添加它很容易。只需将第二个参数添加到以后可以访问的函数中:

@client.command()
async def hello(ctx, args):
        await ctx.send(args)

如果用户随后使用 !hello world 调用命令,机器人会将 world 发送回频道。

【讨论】:

【参考方案2】:

lower 是一种方法。所以如果你想使用它,你应该使用lower()。所以你的代码应该是这样的:

import discord
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):
    if message.author == client.user:
        return

    if message.content.lower() == "!hello":
        await message.channel.send("Hello!")

希望这会有所帮助:))

【讨论】:

以上是关于为啥这不适用于我的 Discord 机器人?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 discord.js 机器人没有响应“;say (content)”

为啥我的 discord.py 机器人在 Heroku 上托管时没有声音?

为啥这个 Embed.set_footer 调用在我的 Discord 机器人中失败?

为啥我的 discord.py 机器人不响应 on_message 事件?

为啥我的 Heroku Discord 机器人无法连接到端口后崩溃? [复制]

为啥我的 Heroku discord bot 没有上线?