循环浏览字典时的 Discord Py bot 垃圾邮件通道

Posted

技术标签:

【中文标题】循环浏览字典时的 Discord Py bot 垃圾邮件通道【英文标题】:Discord Py bot spams channel when looping through a dictionary 【发布时间】:2018-08-08 20:31:34 【问题描述】:
import asyncio
import random
import discord

memes = 
    'r/dank_memes': 'imgur_url':'https://imgur.com/r/dankmemes/', 'trigger': 'get dank', 'memes':['get dank meme', 'sample meme'],
    'r/cats': 'imgur_url':'https://imgur.com/r/cats/', 'trigger': 'meow', 'memes':['cat meme', 'i love cats'],
    

@client.event
async def on_message(message):
    message.content = message.content.lower()

    for name, trigger in memes.items():
        if trigger['trigger'] in message.content:
            #print(random.choice(memes[name]['memes'])) # This works fine
            await client.send_message(message.channel, random.choice(memes[name]['memes']))

我正在制作一个不和谐的机器人,它会在我的频道中说出某个关键字时发布我在网上抓取的随机模因。

我的问题是,当我在 discord 中输入“get dank”时,机器人会发送大量表情包:

get dank meme
get dank meme
dank 2
get dank meme

但是当我输入“meow”或 memes 字典中的任何最后一个值时,它可以正常工作并且只发送一个图像。

我发现这与来自 asyncio 的 await 有关,因为当我使用 print() 时,它只会将其发送一次到控制台。看来await 是必需的,因为没有它,脚本不会做任何事情。在 for 循环中使用 break 也无济于事。

有没有办法让循环在找到关键字后停止,或者只发送一张图片并使用await

【问题讨论】:

【参考方案1】:

问题可能是您的模因样本之一get dank meme 包含触发器本身。一个新的on_message 将其捡起,并以一个新的模因作为响应,该模因可以再次包含触发器,依此类推。 print 不会发生这种情况,因为 print 不会传输到频道,因此无法触发 meme 响应。

要解决这个问题,要么小心避免在你的 meme 响应中触发触发器,要么包含忽略来自机器人本身的触发器的代码。

【讨论】:

这很有意义。我应该知道的。非常感谢! @Xaztek 大多数人解决这个问题的方法是包含if message.author == client.user: return 检查

以上是关于循环浏览字典时的 Discord Py bot 垃圾邮件通道的主要内容,如果未能解决你的问题,请参考以下文章

在for循环中发送多条消息discord python bot

Discord.py 循环播放音频源

Discord.py 机器人歌曲排队:voice_client.play() 在开始时播放所有循环

@bot.event 在一个 cog discord.py

discord.py 'Bot' 对象没有属性 'send_message'

Discord bot 运行命令两次 discord.py