如何改进反垃圾邮件功能 discord.py?

Posted

技术标签:

【中文标题】如何改进反垃圾邮件功能 discord.py?【英文标题】:How to improve antispam function discord.py? 【发布时间】:2021-08-17 23:11:42 【问题描述】:

我正在制作一个不和谐的机器人,并且我内置了反垃圾邮件功能,但我想改进它。我不希望此功能对某些角色做出反应,例如管理员或版主(因此我希望此功能不对某些角色做出反应,因此管理员可以发送垃圾邮件)。另外我有垃圾邮件频道,我不希望此功能起作用,我该怎么做?最后但并非最不重要的一点是:如何删除相同的(垃圾邮件)消息?因为我的机器人所做的是:它说“停止垃圾邮件”。但我想删除相同的消息。非常感谢!我希望你能帮助我!

代码:

    import os
    import discord
    import datetime
    
    intents = discord.Intents.all()
    bot = commands.Bot(command_prefix='$', intents=intents)
    
    time_window_milliseconds = 5000
    max_msg_per_window = 5
    author_msg_times = 
    
    @bot.event
    async def on_message(ctx): #spam allowed in channel and for admins? How to make?
    
      global author_msg_counts
    
      author_id = ctx.author.id
      curr_time = datetime.datetime.now().timestamp() * 1000
    
      if not author_msg_times.get(author_id, False):
          author_msg_times[author_id] = []
    
      author_msg_times[author_id].append(curr_time)
    
      expr_time = curr_time - time_window_milliseconds
    
      expired_msgs = [
          msg_time for msg_time in author_msg_times[author_id]
          if msg_time < expr_time
      ]
      for msg_time in expired_msgs:
          author_msg_times[author_id].remove(msg_time)
    
      if len(author_msg_times[author_id]) > max_msg_per_window:
        await ctx.delete(ctx)
        await ctx.send("Stop Spamming")
    
      else:
        print("You are good to go!")
              
    bot.run(os.getenv('token'))

【问题讨论】:

【参考方案1】:

关于角色的第一个问题,您应该在垃圾邮件检查开始时添加:

if ctx.author.guild_permissions.manage_messages:
    return

这将使其不会影响任何有权删除消息的成员(这将是版主或管理员)。

你也可以这样做

if ctx.channel.id == [id here]:
    return

将 [id here] 替换为您的垃圾邮件频道的 ID。 最后,将await ctx.send("Stop Spamming") 放在await ctx.delete(ctx) 之前,并确保您的机器人有权删除消息。

【讨论】:

以上是关于如何改进反垃圾邮件功能 discord.py?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止机器人发送垃圾邮件?不和谐.py

如何跟踪 discord.py 中发送的消息

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

Discord.py 需要超过 1 个 Int

如何改进我的队列系统 - Discord.py

垃圾邮件猛增6成,我们靠什么抵御垃圾邮件