discord.py bot重复消息

时间:2020-09-29 10:58:04

标签: discord discord.py

嗨,我正在尝试制作一个discord.py机器人,以便我可以拥有一个gif聊天频道,但是当有人在该频道中键入消息时,我的机器人就会开始重复他的消息,如果您知道,请帮忙。

我的代码:

@client.event
async def on_message(message):
    with open("gif_chater.json", "r+") as file:
        data=json.load(file)
        if str(message.channel.id) in data:
            if message.content.startswith("https://tenor.com/"):
                print("wOw")
            if not message.content.startswith("https://tenor.com/") and not message.author.id == "760083241133932544":
                await message.channel.send("lol pls use gifs in this channel : )")
                await message.delete()
                exit

2 个答案:

答案 0 :(得分:1)

可能是您多次运行了机器人。做ps -ef | grep {filename}来查看正在运行的进程,然后通过运行kill {process id}杀死它。

答案 1 :(得分:0)

on_message事件

问题在于,机器人不断对其自身做出响应,这是因为on_message事件不仅在用户发送消息时触发,还在机器人发送消息时触发。这样,一旦它告诉用户他们只必须发布男高音gif,它就会对自己的消息做出反应并进入无限循环,并发布和删除其响应。

防止机器人对其自身做出反应

为防止漫游器响应其自身的消息,您应在事件like in the discord.py docs开始时添加一个检查:

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

此外,ID检查在末尾

代码中决定发送消息之前的最后一个条件是检查Messenger的ID(not message.author.id == "760083241133932544")。我不知道这是否是为了避免删除您或漫游器的消息,但是无论如何,检查本身都是错误的。 message.author.id返回一个整数,但随后将其与字符串进行比较,由于类型冲突,它将始终返回False。

要解决此问题,请删除引号not message.author.id == 760083241133932544,将ID更改为整数。同样,您应该使用不等于运算符!=而不是not来提高可读性:message.author.id != 760083241133932544

此外,由于您已经检查了消息是否以网站链接开头,因此您可以使用elif语句来代替检查条件,因为else/elif保证先前的条件为假(又名,该消息不是以网站链接开头):

if message.content.startswith("https://tenor.com/"):
    print("wOw")
elif message.author.id != 760083241133932544:
    await message.channel.send("lol pls use gifs in this channel : )")
    await message.delete()

修复后的问题

有了新的更改,您的函数可能看起来像这样:

@client.event
async def on_message(message):
    # Don't respond to the bot's own messages
    if message.author == client.user:
        return

    with open("gif_chater.json") as file:
        data = json.load(file)

    if str(message.channel.id) in data:
        if message.content.startswith("https://tenor.com/"):
            print("wOw")
        elif message.author.id != 760083241133932544:
            await message.channel.send("lol pls use gifs in this channel : )")
            await message.delete()