Y
Y
Yura Milevsky2020-12-02 11:51:32
Python
Yura Milevsky, 2020-12-02 11:51:32

How to make a bot ignore links and forwards?

How can I make the bot ignore messages like forwarded or someone shared or even links? here is main.py code:

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("-------------------")

And here is the code of the bot itself:
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

Answer the question

In order to leave comments, you need to log in

1 answer(s)
W
WolfInChains, 2020-12-02
@Hackerman1

Well, this is how you can arrange checks, but it’s better to find out what the problem is and fix it, and not stupidly ignore
the link check

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:
    # выполнение кода

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

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

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question