Почему не срабатывает условие !=?

Рейтинг: 0Ответов: 2Опубликовано: 21.07.2023

Написал код бота модератора для тг-канала, который должен удалять комментарии подписчиков, содержащие слово из словаря. При этом пропускать любые комментарии администратора, в т.ч. содержащие любое слово из словаря. В итоге удаляет все комментарии. id админа получаю из файла cfg.py. Подскажите, в чем ошибка кода?

@dp.message_handler()
async def mess_handler(message: types.Message):
    text = message.text.lower()
    while str(message.from_user.id) != cfg.ADMIN_ID:
        for word in cfg.WORDS:
            if word in text:
                await message.delete()

А в таком варианте кода, бот вообще не удаляет любые комментарии:

@dp.message_handler()
async def mess_handler(message: types.Message):
    text = message.text.lower()
    for word in cfg.WORDS:
        if word in text:
            if message.from_id != cfg.ADMIN_ID:
                pass
            else:
                await message.delete()

Такой вариант кода тоже не работает и комментарии не удаляет - TypeError: 'bool' object is not iterable:

@dp.message_handler()
async def mess_handler(message: types.Message):
    text = message.text.lower()
    for word in cfg.WORDS and str(message.from_user.id) != '@***':
        if word in text:
            await message.delete()

Ответы

▲ 0Принят

Могу предложить "грубый", но рабочий вариант:

mat = ['один', 'два', 'три', 'пять']

@dp.message_handler()
async def process_start(message: types.Message):
    if str(message.from_user.id) != cfg.ADMIN_ID and any(x in message.text.lower() for x in mat):
        await message.reply("Не матерись!!!")
        await message.delete()
    else:
        pass

"грубый" - потому, что могут быть ложные срабатывания, к примеру "двадцать", "опять". Нужно это учитывать при создании словаря с нецензурными словами. Но не стоит забывать про категорию пользователей, которые будут маскировать мат, печатая часть букв в английской раскладке, вместо О писать 0, добавлять спецсимволы и так далее. Поэтому это простой и грубый метод фильтрации мата

▲ 0

Если ошибка в сравнении в 1 варианте то просто перед сравнением напиши print(message.from_user.id, cfg.ADMIN_ID) просто их сравни глазами и на всякий посмотри что выводит print(type(message.from_user.id), type(cfg.ADMIN_ID)) (Проверка типа переменных) просто если где ошибка то только в сравнении. Да и while тебе зачем проверяй через if или бот отключится сразу ? Есть альтернатива либо

while True:
    if str(message.from_user.id) != cfg.ADMIN_ID:
        break
    for word in cfg.WORDS:
            if word in text:
                await message.delete()
            # Если надо добавь
            else:
                break

Или просто добавить

if str(message.from_user.id) != cfg.ADMIN_ID:
        break

Да и как ты открываешь файлы через open() ? Просто если первое сообщение было сделано не от админа то while не будет проверять ещё раз вроде как.