Содержание

Создание простого чат-бота в VK на Python 3 / Хабр

Создание основы для работы бота будет состоять из следующих этапов:


  1. Создание бота в ВК
  2. Генерирование API- ключа
  3. Создание программы бота через LongPoolVK

Для кого эта статья?

Статья рассчитана для начинающих программистов. Метод работы программы очень прост и любой, кто умеет разбираться в синтаксисе Питона и немного знающий ООП сможет его реализовать для своих нужд. Но в принципе даже не зная никаких принципов ООП, думаю можно научиться добавлять простые функции или хотя бы в крайнем случае использовать готовые исходники из GitHub.

Что есть в этой статье?

Создание основы бота. После этого его можно будет запрограммировать как-угодно. Автоматизировать какую-то рутину или использовать как собеседник.

Улучшенная (слегка усложненная версия бота). Я решил сначала представить простой процедурный код бота, а затем слегка усложнить его, добавив функции, значительно улучшающие работу бота.

Добавление функции передачи погоды. Научим бота говорить нам погоду.

Создание бота в ВК

Начнем мы с создания бота, а именно группу в ВК.

Для это нужно зайти в «группы» → «создать сообщество».

Выберите любой тип сообщества и введите название, тематику группы.

На открывшейся странице настроек, выберите «Работа с API»

Далее, необходимо создать API-ключ.

Затем выберите нужные вам параметры с доступом для вашего API-ключа.

Скорее всего, вам придётся подтверждать действие в ВК с помощью мобильного телефона. Затем скопируйте полученный API-ключ где-нибудь в файл. Он нам еще понадобится.

Затем нужно разрешить сообщения. Для этого переходим в «сообщения» и включаем их.

Приступим к программной части бота

Мы не будем реализовывать его через запросы к ВК, а если быть точнее, просто используем библиотеку VkLongPool, которая сделает это за нас.

Для этого необходима библиотека vk_api. Установим его через pip:

python -m pip install vk_api

Но лично я работаю с виртуальным окружением Anaconda. С этим зачастую возникают проблемы при первой работе. Обычно проблема в том, что система не распознают команду «python». А решается эта проблема путем добавления его в PATH.

Приступим к самому коду:

Импортируем нужные модули:

import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType

Затем код:

def write_msg(user_id, message):
    vk.method('messages.send', {'user_id': user_id, 'message': message})
# API-ключ созданный ранее
token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7"
# Авторизуемся как сообщество
vk = vk_api.VkApi(token=token)
# Работа с сообщениями
longpoll = VkLongPoll(vk)
# Основной цикл
for event in longpoll.listen():
    # Если пришло новое сообщение
    if event.
type == VkEventType.MESSAGE_NEW: # Если оно имеет метку для меня( то есть бота) if event.to_me: # Сообщение от пользователя request = event.text # Каменная логика ответа if request == "привет": write_msg(event.user_id, "Хай") elif request == "пока": write_msg(event.user_id, "Пока((") else: write_msg(event.user_id, "Не поняла вашего ответа...")

Функция write_msg получает id пользователя ВК <user_id>, которому оно отправит сообщение и собственно само сообщение .

def write_msg(user_id, message):
    vk.method('messages.send', {'user_id': user_id, 'message': message})

Авторизовавшись как сообщество и настроив longpool:

# API-ключ созданный ранее
token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7"
# Авторизуемся как сообщество
vk = vk_api.
VkApi(token=token) # Работа с сообщениями longpoll = VkLongPoll(vk) Войдем в основной цикл: # Основной цикл for event in longpoll.listen():

В нем мы циклически будем проверять на наличие event-ов. А получить тип event-а сможем с помощью event.type.

После этого получив сообщение от пользователя сможем отправить ему соответствующее письмо с помощью уже созданной функции write_msg.

Итак, мы создали очень простого бота в ВК с такой же простой реализацией. А логику бота можно программировать как душе угодно.

Листинг кода в GH

Теперь приступим к более реальному программированию

Создадим класс VkBot в файле vk_bot.py, который будет служить нам ботом.

class VkBot:
    def __init__(self, user_id):
    
        print("Создан объект бота!")
        self._USER_ID = user_id
        self._USERNAME = self._get_user_name_from_vk_id(user_id)
        
        self._COMMANDS = ["ПРИВЕТ", "ПОГОДА", "ВРЕМЯ", "ПОКА"]

И добавим туда метод с помощью которого можно получить имя пользователя через vk id.

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]

Это делается с помощью beatifulsoup4.

Устанавливаем если его нет:

python -m pip install bs4

На него есть достаточное количество статей, которые стоит изучить. С помощью него же создадим еще несколько методов:

# Получение времени:
def _get_time(self):
    request = requests.get("https://my-calend.ru/date-and-time-today")
    b = bs4.BeautifulSoup(request.text, "html.parser")
    return self._clean_all_tag_from_str(str(b.select(".page")[0].findAll("h3")[1])).split()[1]
# Получение погоды
def _get_weather(city: str = "санкт-петербург") -> list:
    request = requests.get("https://sinoptik.
com.ru/погода-" + city) b = bs4.BeautifulSoup(request.text, "html.parser") p3 = b.select('.temperature .p3') weather1 = p3[0].getText() p4 = b.select('.temperature .p4') weather2 = p4[0].getText() p5 = b.select('.temperature .p5') weather3 = p5[0].getText() p6 = b.select('.temperature .p6') weather4 = p6[0].getText() result = '' result = result + ('Утром :' + weather1 + ' ' + weather2) + '\n' result = result + ('Днём :' + weather3 + ' ' + weather4) + '\n' temp = b.select('.rSide .description') weather = temp[0].getText() result = result + weather.strip() return result # Метод для очистки от ненужных тэгов @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

Измените параметр _get_weather на нужный город, в последствии этот метод можно будет вызывать с указанием города, а по умолчанию будет ваше указанное значение.

С помощью этих методов мы сможем получить время и погоду. Эти методы вырезаны из моего основного проекта бота. Следует организовать их в отдельных пакетах и классах, применяя наследование. Но ради примера работы, я решил вместить все это в один класс бота, что конечно плохо.

Создадим основной метод new_message, который будет обрабатывать сообщение пользователя и возвращать ответ:

def new_message(self, message):
    # Привет
    if message.upper() == self._COMMANDS[0]:
        return f"Привет-привет, {self._USERNAME}!"
    
    # Погода
    elif message.upper() == self._COMMANDS[1]:
        return self._get_weather()
    
    # Время
    elif message.upper() == self._COMMANDS[2]:
        return self._get_time()
    
    # Пока
    elif message.upper() == self._COMMANDS[3]:
        return f"Пока-пока, {self._USERNAME}!"
    
    else:
        return "Не понимаю о чем вы..."

Теперь вернемся к запускаемому файлу:

Импортируем класс нашего бота:

from vk_bot import VkBot

Изменим основной наш цикл:

print("Server started")
for event in longpoll.
listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: print('New message:') print(f'For me by: {event.user_id}', end='') bot = VkBot(event.user_id) write_msg(event.user_id, bot.new_message(event.text)) print('Text: ', event.text)

То есть теперь мы будем передавать полученное сообщение объекту бота, который вернет нам нужный ответ.

Это усложнение программы просто необходимо, если вы хотите дальше улучшить функционал бота:

Создайте отдельные пакеты и классы для каждой функции _get_time и _get_weather. Организуйте наследование с общего класса. И каждую новую функцию определяйте в отдельных классах, лучше всего, конечно, еще и разделить на пакеты.

Добавьте словарь с ключом идентификатора пользователя и значением объекта бота. Таким образом, не придется каждый раз в цикле создавать объект бота. К тому же, это обеспечит пользование несколькими пользователями сразу в сложных конструкциях.

Таким образом, выбрав хорошую архитектуру кода, вы сможете создать многофункционального бота.

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

Вы же можете редактировать бота под себя.

Бот из статьи

Основной проект бота (улучшенный) на GH

Буду рад вашим идеям. По любым вопросам пишите.

Язык программирования Java

Язык программирования Java

Последнее обновление: 23.03.2023

  1. Глава 1. Введение в Java

    1. Язык программирования Java

    2. Первая программа на Java в Windows

    3. Первая программа в IntelliJ IDEA

    4. Первая программа в NetBeans

    5. Первая программа в Eclipse

  2. Глава 2. Основы программирования на Java

    1. Структура программы

    2. Переменные и константы

    3. Типы данных

    4. Консольный ввод/вывод в Java

    5. Арифметические операции

    6. Поразрядные операции

    7. Условные выражения

    8. Операции присваивания и приоритет операций

    9. Преобразования базовых типов данных

    10. Условные конструкции

    11. Циклы

    12. Массивы

    13. Методы

    14. Параметры методов

    15. Оператор return. Результат метода

    16. Перегрузка методов

    17. Рекурсивные функции

    18. Введение в обработку исключений

  3. Глава 3. Классы. Объектно-ориентированное программирование

    1. Классы и объекты

    2. Пакеты

    3. Модификаторы доступа и инкапсуляция

    4. Статические члены и модификатор static

    5. Объекты как параметры методов

    6. Внутренние и вложенные классы

    7. Наследование

    8. Абстрактные классы

    9. Иерархия наследования и преобразование типов

    10. Интерфейсы

    11. Интерфейсы в механизме обратного вызова

    12. Перечисления enum

    13. Класс Object и его методы

    14. Обобщения (Generics)

    15. Ограничения обобщений

    16. Наследование и обобщения

    17. Ссылочные типы и клонирование объектов

    18. Records

  4. Глава 4. Обработка исключений

    1. Оператор throws

    2. Классы исключений

    3. Создание своих классов исключений

  5. Глава 5. Коллекции

    1. Типы коллекций. Интерфейс Collection

    2. Класс ArrayList и интерфейс List

    3. Очереди и класс ArrayDeque

    4. Класс LinkedList

    5. Интерфейс Set и класс HashSet

    6. SortedSet, NavigableSet, TreeSet

    7. Интерфейсы Comparable и Comporator. Сортировка

    8. Интерфейс Map и класс HashMap

    9. Интерфейсы SortedMap и NavigableMap. Класс TreeMap

    10. Итераторы

  6. Глава 6. Потоки ввода-вывода. Работа с файлами

    1. Потоки ввода-вывода

    2. Чтение и запись файлов. FileInputStream и FileOutputStream

    3. Закрытие потоков

    4. Классы ByteArrayInputStream и ByteArrayOutputStream

    5. Буферизованные потоки BufferedInputStream и BufferedOutputStream

    6. Форматируемый вывод. PrintStream и PrintWriter

    7. Классы DataOutputStream и DataInputStream

    8. Чтение и запись текстовых файлов

    9. Буферизация символьных потоков. BufferedReader и BufferedWriter

    10. Сериализация объектов

    11. Класс File. Работа с файлами и каталогами

    12. Работа с ZIP-архивами

    13. Класс Console

  7. Глава 7. Работа со строками

    1. Введение в строки. Класс String

    2. Основные операции со строками

    3. StringBuffer и StringBuilder

    4. Регулярные выражения

  8. Глава 8. Лямбда-выражения

    1. Введение в лямбда-выражения

    2. Лямбды как параметры и результаты методов

    3. Встроенные функциональные интерфейсы

  9. Глава 9. Многопоточное программирование

    1. Класс Thread

    2. Создание и выполнение потоков

    3. Завершение и прерывание потока

    4. Синхронизация потоков. Оператор synchronized

    5. Взаимодействие потоков. Методы wait и notify

    6. Семафоры

    7. Обмен между потоками. Класс Exchanger

    8. Класс Phaser

    9. Блокировки. ReentrantLock

    10. Условия в блокировках

  10. Глава 10. Stream API

    1. Введение в Stream API

    2. Создание потока данных

    3. Фильтрация, перебор элементов и отображение

    4. Сортировка

    5. Получение подпотока и объединение потоков

    6. Методы skip и limit

    7. Операции сведения

    8. Метод reduce

    9. Тип Optional

    10. Метод collect

    11. Группировка

    12. Параллельные потоки

    13. Параллельные операции над массивами

  11. Глава 11. Модульность

    1. Создание модуля

    2. Зависимые модули

    3. Взаимодействие между модулями

  12. Глава 12. Дополнительные классы

    1. Математические вычисления и класс Math

    2. Большие числа BigInteger и BigDecimal

    3. Работа с датами. LocalDate

YooMoney:

410011174743222

Перевод на карту

Номер карты:

4048415020898850

ОБУЧЕНИЕ ВКонтакте

Примеры видеоуроков

ИКСЕ КЛАСС 10

ИКСЕ КЛАСС 9

JEE-MAIN/MHT-CET

IB МАТЕМАТИКА

Изучайте математику и естествознание в упрощенной форме и оценивайте хорошо

профессора Викаса Луллы и его команды

ICSE КЛАСС IX И X