Задать вопрос
Hackerman1
@Hackerman1
17 лет, плохое зрение.

Как заставить бота игнорировать ссылки и пересылки?

Как мне заставить бота игнорировать такие сообщения как пересланное или кто то поделился или вовсе ссылки? вот код main.py:
import random

import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType

# --
from commander.commander import Commander
from vk_bot import VkBot
# --


def write_msg(user_id, message):
    vk.method('messages.send', {'user_id': user_id, 'message': message, 'random_id': random.randint(0, 2048)})


# API-ключ созданный ранее
token = "00daf022c6c519e8b2bd2cc80f23b873ef16f4287cd9a2a7ef53c9373285065ef9cbe7cca8e0ddbce27ab"

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

# Работа с сообщениями
longpoll = VkLongPoll(vk)

commander = Commander()
print("Server started")
for event in longpoll.listen():

    if event.type == VkEventType.MESSAGE_NEW:

        if event.to_me:

            print(f'New message from {event.user_id}', end='')

            bot = VkBot(event.user_id)

            if event.text[0] == "/":
                write_msg(event.user_id, commander.do(event.text[1::]))
            else:
                abc = bot.new_message(event.text)
                if len(abc) > 0:
                   write_msg(event.user_id, abc)


            print('Text: ', event.text)
            print("-------------------")

А вот код самого бота:
import bs4 as bs4
import requests
import os


class VkBot:

    def __init__(self, user_id):
        print("\nСоздан объект бота!")

        self._USER_ID = user_id
        self._USERNAME = self._get_user_name_from_vk_id(user_id)

        self._COMMANDS = ["ПРИВЕТ", "ПОКА", 'ВАСЯ ДАЙ ДЗ', 'ОТКЛЮЧИТЬ БОТА', 'ВЫРУБИТЬ БОТА ТОПОРОМ']

    def _get_user_name_from_vk_id(self, user_id):
        request = requests.get("https://vk.com/id"+str(user_id))
        bs = bs4.BeautifulSoup(request.text, "html.parser")

        user_name = self._clean_all_tag_from_str(bs.findAll("title")[0])

        return user_name.split()[0]

    def new_message(self, message):
        homework = ''

        # Привет
        if message.upper() == self._COMMANDS[0]:
            return f"Привет-привет, {self._USERNAME}! Вот кратенький список моих команд:  \nКоманда 'Вася дай дз' - Даёт тебе домашнее задание. \nКоманда 'Отключить бота' или 'Вырубить бота топорм' - Отключает бота(Только для администраторов!)"

        # Пока
        elif message.upper() == self._COMMANDS[1]:
            return f"Пока-пока, {self._USERNAME}!"

        # Домашнее задание
        elif message.upper() == self._COMMANDS[2]:
            try:
                with open('./Homework.txt', 'r', encoding='utf-8') as f:
                    homework = ''.join(f.readlines())
            except:
                raise Exception("Файл пустой")
                return f'Ошибка: Файл пустой. Бот оффлайн'
            return f'Держи братюня!\n' + homework

        # Отключение бота
        elif message.upper() == self._COMMANDS[3]:
            if self._USER_ID == 249356697:
                return f'Бот был выключен. Статус Бота: Оффлайн.'
                os.system('TASKKILL /F /IM python.exe')
            else:
                return f'Команда не выполнена! Вы не являетесь администратором! Наглость тут не любят!'

        elif message.upper() == self._COMMANDS[4]:
            if self._USER_ID == 249356697:
                return f'Бот был вырублен. Статус Бота: Оффлайн.'
                os.system('TASKKILL /F /IM python.exe')
            else:
                return f'Я тя ща сам топором зарублю!'
        else:
            return ''



    @staticmethod
    def _clean_all_tag_from_str(string_line):

        """
        Очистка строки stringLine от тэгов и их содержимых
        :param string_line: Очищаемая строка
        :return: очищенная строка
        """

        result = ""
        not_skip = True
        for i in list(string_line):
            if not_skip:
                if i == "<":
                    not_skip = False
                else:
                    result += i
            else:
                if i == ">":
                    not_skip = True

        return result
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
WolfInChains
@WolfInChains
Ну вот так можно устроить проверки, но лучше все-таки узнать в чем проблема и исправить, а не тупо игнорировать

проверка на ссылку
import re

myString = "This is a link https://vk.com" # тут подставляете строку из message
result = re.search("(?P<url>https?://[^\s]+)", myString).group("url")

if result:
    print(f"Обнаружена ссылка {result}. Игнорирую сообщение.")
if not result:
    # выполнение кода


проверка на пересланное сообщение
msg = vk.messages.getById(message_ids=string)['items'][0] # тут подставляете строку из message вместо string
    if 'reply_message' in msg:
        print(f"Обнаружено пересланное сообщение. Игнорирую.")
    else:
        # выполнение кода


проверка на репост
if len(event.attachments) >= 1:
    if 'wall' in event.attachments['attach1_type']:
        print(f"Обнаружен репост. Игнорирую.")
    else:
        # выполнение кода
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы