脚本不过滤脏话不和谐py

时间:2019-11-02 19:13:36

标签: python discord.py

我正试图创建我的discord.py机器人,以删除带有脏话的邮件,然后发布公告,宣布该行为并滥用他的行为。我在.txt文件中加载了坏词列表,看起来像:“ Badword,badword2等”

我尝试了很多方法,但是我真的不知道该怎么做。

enter image description here

import discord
from discord.ext import commands,tasks
import datetime 
from itertools import cycle
import os

bot = commands.Bot(command_prefix = '/')

with open('badwords.txt','r') as file:
    bad_words = [bad_word.strip(', ').lower() for bad_word in file.read()]

@bot.event 
async def on_message(message):
     if any(bad_word in message.content.strip().lower() for bad_word in bad_words):
           await message.channel.send(f"{message.author.mention}, твое сообщение не прошло цензуру")
           await message.channel.purge(limit=1)
           await bot.process_commands(message)

该机器人称呼自己太多,看起来像是递归的! 他不仅会对坏话做出反应,还会对好话做出反应。

3 个答案:

答案 0 :(得分:0)

我想说的最好的解决方案是使用re

如果至少是为了清楚起见并且不删除其发送的消息,那么您可能只使用GuildChannel.purge时就使用message.delete,而bot.process_commands永远不会如果您使用该逻辑,除非有一个不好的词被调用,如果没有不好的词或将其放在方法的末尾,则调用它。

with open('badwords.txt','r') as f:
    bad_words = '|'.join(s for l in f for s in l.split(', '))
    bad_word_checker = re.compile(bad_words).search

@bot.event 
async def on_message(message)
    if bad_word_checker(message.content):
        await message.delete()
        await message.channel.send(...)
    else:
        await bot.process_commands(message)

答案 1 :(得分:0)

问题是

[bad_word.strip(', ').lower() for bad_word in file.read()]

file.read()读取一个字符串中的整个文件,对其进行迭代就意味着您要对字符串的字符进行迭代,因此对于列表理解,bad_words不包含单词而是包含字母。 在您显示的示例中,用户发送了一个字符的消息,因此,如果该字符在文件中至少出现一次,则您的漫游器会将其视为一个坏词。

确切的解决方案取决于您的badwords.txt格式,您说这是同一行中所有用','分隔的单词,那么这应该可行

bad_words = file.read().strip().lower().split(', ')

答案 2 :(得分:0)

所以我现在解决这个问题。就像 polku 所说的那样,这是一个迭代错误,那就是! 我还用了俄语单词,我猜他们在加密方面犯了错误(您可以通过 MIMEtext 解决它)。这是我的最终代码:

with open('badwords.txt') as file:
    file = file.read().split()


#----------------------------------EVENTS----------------------------------

@bot.event 
async def on_message(message):
    for badword in file:
        if badword in message.content.lower():
            await message.delete()
            await message.channel.send(f'{message.author.mention}! Your message has not passed moderation!')
        else:
            await bot.process_commands(message)