@PelasikNice
Новичок в python

Реакция на «плохое сообщение». Как настроить?

Здравствуйте, есть маленькая проблема. Я хочу сделать реакцию на мат. Если пользователь пишет "мат", то бот отвечает ему. Но, если пользователь пишет "любой текст мат", то бот просто игнорирует это сообщение. Строчка 85-86: elif response in rar: #0
send_message(vk, 'user_id', event.user_id, message='Не говори так, ведь можешь получить бан!')

5f0617f35140b029428026.jpeg
import sys
sys.path.insert(0, '../')

from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
import vk_api
from datetime import datetime
import random
import os
import time

# DEFAULT, NEGATIVE, POSITIVE, PRIMARY
# API-ключ созданный ранее
token = "СЕКРЕТ"

# Авторизуемся как сообщество
vk = vk_api.VkApi(token=token)

longpoll = VkLongPoll(vk)

#список
rar = ["мат", "мат2", "мат3"]

def create_keyboard(response):
    keyboard = VkKeyboard(one_time=False)

    if response == 'помощь':

        keyboard.add_button('Привет', color=VkKeyboardColor.POSITIVE)
        keyboard.add_button('Кто я?', color=VkKeyboardColor.DEFAULT)
        keyboard.add_button('Как дела?', color=VkKeyboardColor.DEFAULT)

        keyboard.add_line()

        keyboard.add_button('Завещание', color=VkKeyboardColor.PRIMARY)
        keyboard.add_button('Конфуций', color=VkKeyboardColor.PRIMARY)
        keyboard.add_button('Тест', color=VkKeyboardColor.PRIMARY)

        keyboard.add_line()  # Переход на вторую строку
        keyboard.add_button('Закрыть', color=VkKeyboardColor.NEGATIVE)

        keyboard.add_line()
        keyboard.add_button('Iphone 10 XS MAX', color=VkKeyboardColor.PRIMARY)
        keyboard.add_button('Пока', color=VkKeyboardColor.NEGATIVE)
        keyboard.add_button('Взлом пентагона', color=VkKeyboardColor.PRIMARY)

        keyboard.add_line()
        keyboard.add_button('Сотрудничество', color=VkKeyboardColor.POSITIVE)
        keyboard.add_button('Помощь', color=VkKeyboardColor.POSITIVE)
        keyboard.add_button('Состав', color=VkKeyboardColor.POSITIVE)


    elif response == 'привет':
        keyboard.add_button('Помощь', color=VkKeyboardColor.POSITIVE)

    elif response == 'тест':
        keyboard.add_button('Я человек', color=VkKeyboardColor.POSITIVE)
        keyboard.add_button('Я пришелец', color=VkKeyboardColor.POSITIVE)
        keyboard.add_button('Я инопришеленец', color=VkKeyboardColor.POSITIVE)

    elif response == 'закрыть':
        print('закрываем клавиатуру')
        return keyboard.get_empty_keyboard()

    keyboard = keyboard.get_keyboard()
    return keyboard


def send_message(vk, id_type, id, message=None, keyboard=None, rar=None):
    vk.method('messages.send',{id_type: id, 'message': message, 'random_id': random.randint(-2147483648, +2147483648), 'keyboard': keyboard, 'rar' : rar})

for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW:
        print('Сообщение пришло в: ' + str(datetime.strftime(datetime.now(), "%H:%M:%S")))
        print('Текст сообщения: ' + str(event.text))
        print('Сообщение от пользователя: ' + str(event.user_id))
        response = event.text.lower()
        keyboard = create_keyboard(response)

        if event.from_user and not event.from_me:
            if response == "начать": #НАЧАТЬ
                send_message(vk, 'user_id', event.user_id, message= 'Приветствую тебя! Напиши "Помощь" чтобы узнать команды бота!')
            elif response == "Беседа": #0
                send_message(vk, 'user_id', event.user_id, message='Чтобы вступить туда, напиши об это @pelasiknice или @sozdatelbota')
            elif response in rar: #0
                send_message(vk, 'user_id', event.user_id, message='Не говори так, ведь можешь получить бан!')
            elif response == "привет": #1
                send_message(vk, 'user_id', event.user_id, message='Нажми на кнопку, чтобы получить список команд!',keyboard=keyboard)
            elif response == "помощь": #2
                send_message(vk, 'user_id', event.user_id, message= 'Список команд бота: \n \n 1)Привет - Я приветствую тебя \n 2)Помощь - список команд \n 3)Конфуций - говорю мудрую фразу \n 4)Кто я? - скажу кто ты \n 5)Как дела? - скажу как у меня дела \n 6)Состав - всё администраторы сообщества \n 7)iphone 10 xs max - Дам тебе Айфон \n 8)Тест - Задам вопросы \n 9) Сотрудничество - назову администраторов \n 10)Завещание - пусто \n 11)Пока - прощаюсь с тобой \n 12)Взлом пентагона - взломаю любую вещь \n 13)Закрыть - закрывает клавиатуру', keyboard=keyboard)
            elif response == "конфуций": #3
                send_message(vk, 'user_id', event.user_id, message='Делай мемы, и они попадут в эту группу!')
            elif response == "кто я?": #4
                send_message(vk, 'user_id', event.user_id, message='Ты человек, но это не точно❤')
            elif response == "как дела?": #5
                send_message(vk, 'user_id', event.user_id, message='Нормас, а у тебя вижу так себе . Напиши что-то боту, чтобы скучно не было')
            elif response == "состав": #6
                send_message(vk, 'user_id', event.user_id, message='Программист: @pelasiknice \n Помощник: @fl1xer339')
            elif response == "iphone 10 xs max": #7
                send_message(vk, 'user_id', event.user_id, message='А тебе не жирно сразу айфон?')
            elif response == "тест": #8
                send_message(vk, 'user_id', event.user_id, message='Кто ты? \n 1) Я человек \n 2) Я пришелец \n 3) Я инопришеленец☢',keyboard=keyboard)
            elif response == "сотрудничество": #9
                send_message(vk, 'user_id', event.user_id, message='Пиши им: @pelasiknice или @fl1xer339')
            elif response == "завещание":  #10
                send_message(vk, 'user_id', event.user_id, message='А, точно. Я же никому ничего не завещал:)')
            elif response == "пока": #11
                send_message(vk, 'user_id', event.user_id, message='Пока:( Возвращайся поскорее!')
            elif response == "взлом пентагона":  # 9
                send_message(vk, 'user_id', event.user_id, message='Ваша жЕпа успешно взломана')
            elif response == "я человек": #Я ЧЕЛОВЕК
                send_message(vk, 'user_id', event.user_id, message='Хорошо, ты нормальный. Проход открыт! (пиши команду: Помощь)')
            elif response == "я пришелец":  # Я ПРИШЕЛЕЦ
                send_message(vk, 'user_id', event.user_id, message='Так, проход запрещён. Возвращайся назад в ☢зону 51☢! (пиши команду: Помощь)')
            elif response == "я инопришеленец":  # Я ПРИШЕЛЕЦ
                send_message(vk, 'user_id', event.user_id, message='Стоп, кто? Кхм, думал тебя пытать. А так проходи, проходи... (пиши команду: Помощь)')



            elif response=='закрыть':
                send_message(vk, 'user_id', event.user_id, message='Закрываю клавиатуру',keyboard=keyboard)
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Вы проверяете вхождение предложения в списке слов. Нужно разбить ваш текст на слова, и проверить на вхождение каждое слово, приведя его к нижнему регистру.

elif response in rar: #0
Заменяете на:
elif [word for word in response.split() if word.lower() in rar]:

либо этот вариант:
elif any(word in rar for word in response.lower().split()):


Принцип работы первого варианта: response разбивается на слова по пробелу, каждое слово приводится в нижний регистр и проверяется на наличие в списке rar если слово есть в списке - дописывается в наш новый список. Если список пустой (ни одного слова из предложения не было в списке для фильтра), то bool() от такого списка вернет False и конструкция не выполнится. Если в списке есть хоть одно слово - вернется True

Конечно, это все обходится банальным дописыванием цифры\буквы\символа к слову. Для проверки с учитыванием этого нужно будет написать немного другой код, да и ложных срабатываний при частичной проверке не избежать. Допустим, можно сделать так:
elif any(word in response.lower() for word in rar):

Теперь даже "Это МаТное слово" будет является тригером, даже при условии, что в rar по сути и нет такого слово "матное", есть лишь его часть
rar = ["мат", "мат2", "мат3"]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Lynatik001
регулярные выражения тебе в руки. они по любому все розрулят)

а еще бы предложил я хранить все события "response == "я инопришеленец":" в бд, гу и ответ на его тоже там. а то елементарный бот, а уже столько мусора. а дальше то что)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы