Энерго-генератор вариантов

О чем речь

У нас в ИГЭУ, уж не знаю, как на других факультетах, но на ИВТФ преподаватели очень любят раздавать задания на лабораторные работы или семинары используя для выбора вариантов интересную формулу: берем остаток от деления номера зачетной книжки на количество вариантов в конкретном задании и прибавляем единицу. В принципе, операция совсем не сложная! Однако очень уж лениво нам, программистам, заставлять считать не всемогущую электронную вычислительную машину, а свой персональный биологический калькулятор. Так, на первой же лабораторной работе мной прямо на телефоне был написан простенький python-скрипт, который позволял оперативно и без лишних трудозатрат произвести это сложнейшее вычисление. Скрипт настолько понравился моим одногруппникам и ребятам с потока, что почти сразу же возникла Идея, реализацию которой смею сегодня Вам представить.

Что за Идея

Все просто, я взял написаный мной скрипт и при помощи vk-api смастерил из него милого бота, которого можно попросить посчитать вариант личным сообщением, либо для этой же цели упомянуть в беседе, предварительно, конечно же, туда его добавив.

Как пользоваться

  1. Добавляемся в сообщество бота Варибот (https://vk.com/varibotispu)
  2. Пишем сообществу личное сообщение с просьбой, например: "Вариант 16349 из 14" или "варик 15234 от 11"
  3. Получаем ответ от бота с нашим вариантом и радуемся жизни!

Альтернативно личному сообщению можно добавить бота в беседу (для этого необходимо воспользоваться соответствующей кнопкой в меню сообщества) и отправлять ему сообщения прямо там, не забывая электронный мозг упоминать, например: "@varibotispu вар 17450 из 11"

Et voila! Освобождено огромное количество времени! Успехов в учебе!

Как оно работает

Не хочу в этой статье углубляться в основы языка python, но больше и рассказывать то не о чем! Поэтому процесс создания бота опишу следующим образом:

  1. Создаем исполняемый файл бота bot.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from time import time
import re

vk_session = vk_api.VkApi(token='здесь_токен_api_от_сообщества')

vk = vk_session.get_api()

msgpattern = re.compile("(.*)[Вв]ар.{0,8} (.*) .+ (.*)")

while True:
    longpoll = VkBotLongPoll(vk_session, '194381587')
    try:
        for event in longpoll.listen():
            if event.type == VkBotEventType.MESSAGE_NEW:
                print(event.obj.message['text'])
                if msgpattern.match(event.obj.message['text']):
                    data = msgpattern.findall(event.obj.message['text'])[0]
                    var = int(data[1]) % int(data[2]) + 1
                    vk.messages.send(
                        peer_id=event.obj.message['peer_id'],
                        message='Ваш вариант: %d. Успехов в учебе!' % (var),
                        random_id=time()
                    )
    except requests.exceptions.ReadTimeout as timeout:
        continue

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

  1. Создаем Docker-контейнер для нашего бота - так будет проще запустить его на любом сервере

Для этих целей просто упакуем скрипт нашего бота в папку src, а в корне проекта создадим Dockerfile, он для такого проекта получается крайне простой:

1
2
3
4
FROM python:3.7.3-slim
RUN pip install vk_api
ADD src .
CMD ["python", "bot.py"]

Не забываем собрать контейнер и дать ему имя. В моем случае это ivbignal/varicounter:latest.

docker build --rm -f "Dockerfile" -t ivbignal/varicounter:latest "."
  1. Создаем скрипт запуска контейнера

Я делаю это исключительно для удобства, разумеется можно запускать контейнер командой напрямую!

1
2
#!/usr/bin/fish
sudo docker run --restart always --name bot_varicounter --rm -d ivbignal/varicounter:latest

Как видно, я использую параметр --restart always - это заставит Docker daemon автоматически перезапускать контейнер, если он был остановлен не пользователем. Таким образом, при возникновении любых ошибок и вылете приложение будет автоматически перезапущено. Разумеется, это не является надежным и грамотным способом добиться бесперебойной работы приложения, но для маленького бота служащего одной-единственной функции самое то!

blogroll

social