Создание простого чат-бота в VK на Python 3 / Хабр
Создание основы для работы бота будет состоять из следующих этапов:
- Создание бота в ВК
- Генерирование API- ключа
- Создание программы бота через 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. Введение в Java
Язык программирования Java
Первая программа на Java в Windows
Первая программа в IntelliJ IDEA
Первая программа в NetBeans
Первая программа в Eclipse
Глава 2. Основы программирования на Java
Структура программы
Переменные и константы
Типы данных
Консольный ввод/вывод в Java
Арифметические операции
Поразрядные операции
Условные выражения
Операции присваивания и приоритет операций
Преобразования базовых типов данных
Условные конструкции
Циклы
Массивы
Методы
Параметры методов
Оператор return. Результат метода
Перегрузка методов
Рекурсивные функции
Введение в обработку исключений
Глава 3. Классы. Объектно-ориентированное программирование
Классы и объекты
Пакеты
Модификаторы доступа и инкапсуляция
Статические члены и модификатор static
Объекты как параметры методов
Внутренние и вложенные классы
Наследование
Абстрактные классы
Иерархия наследования и преобразование типов
Интерфейсы
Интерфейсы в механизме обратного вызова
Перечисления enum
Класс Object и его методы
Обобщения (Generics)
Ограничения обобщений
Наследование и обобщения
Ссылочные типы и клонирование объектов
Records
Глава 4. Обработка исключений
Оператор throws
Классы исключений
Создание своих классов исключений
Глава 5. Коллекции
Типы коллекций. Интерфейс Collection
Класс ArrayList и интерфейс List
Очереди и класс ArrayDeque
Класс LinkedList
Интерфейс Set и класс HashSet
SortedSet, NavigableSet, TreeSet
Интерфейсы Comparable и Comporator. Сортировка
Интерфейс Map и класс HashMap
Интерфейсы SortedMap и NavigableMap. Класс TreeMap
Итераторы
Глава 6. Потоки ввода-вывода. Работа с файлами
Потоки ввода-вывода
Чтение и запись файлов. FileInputStream и FileOutputStream
Закрытие потоков
Классы ByteArrayInputStream и ByteArrayOutputStream
Буферизованные потоки BufferedInputStream и BufferedOutputStream
Форматируемый вывод. PrintStream и PrintWriter
Классы DataOutputStream и DataInputStream
Чтение и запись текстовых файлов
Буферизация символьных потоков. BufferedReader и BufferedWriter
Сериализация объектов
Класс File. Работа с файлами и каталогами
Работа с ZIP-архивами
Класс Console
Глава 7. Работа со строками
Введение в строки. Класс String
Основные операции со строками
StringBuffer и StringBuilder
Регулярные выражения
Глава 8. Лямбда-выражения
Введение в лямбда-выражения
Лямбды как параметры и результаты методов
Встроенные функциональные интерфейсы
Глава 9. Многопоточное программирование
Класс Thread
Создание и выполнение потоков
Завершение и прерывание потока
Синхронизация потоков. Оператор synchronized
Взаимодействие потоков. Методы wait и notify
Семафоры
Обмен между потоками. Класс Exchanger
Класс Phaser
Блокировки. ReentrantLock
Условия в блокировках
Глава 10. Stream API
Введение в Stream API
Создание потока данных
Фильтрация, перебор элементов и отображение
Сортировка
Получение подпотока и объединение потоков
Методы skip и limit
Операции сведения
Метод reduce
Тип Optional
Метод collect
Группировка
Параллельные потоки
Параллельные операции над массивами
Глава 11. Модульность
Создание модуля
Зависимые модули
Взаимодействие между модулями
Глава 12. Дополнительные классы
Математические вычисления и класс Math
Большие числа BigInteger и BigDecimal
Работа с датами. LocalDate
YooMoney:
410011174743222
Перевод на карту
Номер карты:
4048415020898850
ОБУЧЕНИЕ ВКонтакте
Примеры видеоуроков
ИКСЕ КЛАСС 10
ИКСЕ КЛАСС 9
JEE-MAIN/MHT-CET
IB МАТЕМАТИКА
Изучайте математику и естествознание в упрощенной форме и оценивайте хорошо
профессора Викаса Луллы и его команды
ICSE КЛАСС IX И X
- Математика
- Физика
- Химия
- Биология
- Физика
- Химия
- Биология
JEE-MAIN/MHT-CET/BITSAT
- Физика
- Математика
- Химия
- Математика
- Физика
- Химия
- Биология
- Математика
ХИТАРТ ДЭНД IGCSE MATH GRADE
Спешите
Количество мест ограничено
Позвоните профессору Викасу сейчас 9833677915
ПРИСОЕДИНЯЙТЕСЬ К ОБУЧЕНИЯМ VK ЦИФРОВОЙ КЛАСС
- Современный цифровой офлайн-класс
- Упрощенные заметки в классе доступны онлайн после лекции.
- Хорошо продуманная и структурированная лекция.
- Подробные решения всех проблем с оборудованием, доступные в Интернете.
- Решение вопросов один на один.
- Максимум 10 студентов в группе.
Весь учебный план преподается очень опытным профессором Викасом и его многоопытной и любознательной командой учителей
Эффективная подготовка, разумно использующая Ваше время, ни одна минута не потрачена впустую. Больше времени для самостоятельных занятий
Решение вопросов один на один
ОРИЕНТИРОВАННЫЕ НА ЭКЗАМЕН сложные концепции преподаются простыми для понимания способами ПОМОЩЬ ПРИМЕРОВ ОТ повседневная жизнь
Интерактивные МЕТОДЫ ОБУЧЕНИЯ
Мы предлагаем пробные уроки для студентов, чтобы узнать, подходит ли наш стиль преподавания для их стиля обучения.
Так что больше не сомневайтесь и нажмите на кнопку ниже, чтобы записаться на БЕСПЛАТНЫЙ пробный урок !
Ждем вас на наших уроках
В.К. | МОЙ ГЕРОЙ
Снупи из Тайнаня
|
Его подпись |
Введение:
Обладая богатым творческим талантом и типом личности искренних художников, В.К. начал учиться игре на фортепиано в возрасте четырех лет и сочинять музыку, когда ему было тринадцать. Кажется, ему суждено отправиться по музыкальной дороге.
Музыкальный продюсер широко известен своим поразительно абсолютным слухом и сильным музыкальным чутьем. Этот известный музыкальный интернет-продюсер искренне выражает звуки повседневной жизни через фортепиано и музыку.
Проработав несколько альбомов поп-музыки, В.К. решает сообщить миру свою собственную музыку. Этот душераздирающий биографический альбом дарит нам не только незабываемые фортепианные мелодии, но и совершенно новый опыт, которого вы еще не испытывали.
|
«Любовь и бесконечность» |
О своей карьере:
В.К. выпустил свой первый фортепианный альбом ─ «mirror night» в 2009 году. Сразу же он стал номером один в крупнейшем цифровом музыкальном чарте в китайском регионе, обогнав первое место Кевина Керна.
После разрушительного действия тайфуна Моракот В.К. выпустил свою последнюю фортепианную музыку ─ «Love & Infinity», чтобы призвать тайваньцев помочь тем, кто в ней нуждается. Этот альбом вызвал популярный отклик.
Он внес значительный вклад в развитие Тайваня. Благодаря музыке и Интернету он очень известен во всем мире, являясь хорошим примером тайваньской художественной музыкальной культуры.
Первоначально созданные для телевизионных рекламных роликов MOS burger «Матча латте», «Чистый белый» и «Дыхание моря» являются шедеврами В.К. и все его песни задают тренд.
|
«Зеркальная ночь» |
Песня в альбоме «Зеркальная ночь»:
1. «Багровая сакура»: сочетание китайского стиля с японским роком, произведенное с высочайшими техническими характеристиками, приведет китайскую музыкальную индустрию к новому поколению.
2. «Pure White»: он имитирует особый стиль пения японского одаренного фолк-певца Хадзиме Титосэ с помощью клавиатуры, но он открывает свой эксклюзивный стиль вместо того, чтобы копировать черты Хадзиме Титосэ.
3. «Мелодия эльфов»: описывает группу изолированных эльфов. Эта песня, вдохновленная знаменитым японским аниме-фильмом «Навсикая из долины ветров», раскрывает хорошую технику В.К. по переработке старой песни в совершенно новый стиль.
4. «Сезон ванильных пузырей»: можно сказать, что хитовая случайная музыка на веб-сайте сообщества «Негодяй» вскоре заняла первое место в рейтинге пользователей. Он описывает чистые и меланхоличные любовные истории в белоснежном рождественском сезоне.
5. «Отражение»: С выходом этого В.К. выражает свою музыкальную философию, которая приводит его к созданию невероятных музыкальных элементов, которые очень заманчивы.