shablbot


Nameshablbot JSON
Version 2.0.4 PyPI version JSON
download
home_pagehttps://github.com/Blackgard/shablbot
SummaryБот написанный на Python для социальной сети Вконтакте, работающий через VkBotLongPull
upload_time2023-01-05 17:38:51
maintainer
docs_urlNone
authorAlexandr Drachenin
requires_python>=3.8
licenseMIT
keywords python bot vk template
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center">
 <img src="./images/shablbot.png" alt="logo shablbot">
</p>
<div align="center">

[![Build](https://img.shields.io/azure-devops/build/sasna142/026fd26f-bb59-48fd-bb91-6d9ebe113f87/2)]() [![License](https://img.shields.io/github/license/blackgard/shablbot)]()

</div>

---------------------------------

🤖 Бот написанный на Python для социальной сети Вконтакте, работающий через VkBotLongPull.

## 💭 О проекте <a name="#about"></a>

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

## 🎈 Установка <a name="#install"></a>

Можете воспользоваться командой [pip](https://pypi.org/project/pip/):
```cmd
 pip install shablbot
```
Или же использовать [poetry](https://python-poetry.org/):
```poetry
 poetry add shablbot
```

## :dizzy: Инициализация <a name="init"></a>

Чтобы начать работу с ботом необходимо выполнить инициализацию компонентов бота:

Для этого нужно выполнить команду:

windows
```cmd
 C:\shablbot> py -m shablbot --init
```

linux
```bash
 blackgard@bar:~/shablbot$ python3 -m shablbot --init
```

После чего будет в папке, откуда был вызван скрипт будет созданы каталоги с следующей структурой:
```
📦*yourfolder*
 ┣ 📂commands
 ┃  ┣ 📂private
 ┃  ┃  ┗ 🐍 show_id_active_chats.py
 ┃  ┣ 📂public
 ┃  ┃  ┣ 🐍 chat_bot_off.py
 ┃  ┃  ┣ 🐍 chat_bot_on.py
 ┃  ┃  ┗ 🐍 chat_show_statistics.py
 ┣ 📂keyboards
 ┃  ┣ 📜 clear.json
 ┃  ┗ 📜 default.json
 ┣ 📂modules
 ┃ ┗ 📂games
 ┃    ┗ 🐍 flip_and_roll.py
 ┣ 📂phrases
 ┃  ┣ 📜 _default.json
 ┃  ┣ 📜 bye.json
 ┃  ┗ 📜 hello.json
 ┣ 📂settings
 ┃  ┣ 🐍 settings_model.py
 ┃  ┗ 🐍 settings.py
 ┗ 🐍 manager.py
```
<div align="center"><font size="2" style="text-align:center">Более подробно про каждый из каталогов будет рассказано далее</font></div>
<br>

После этого можно перейти к настройке бота.

## ⏳ Стартовая настройка <a name="start_setting"></a>
Настройка бота производится с помощью редактирования файла <b>[settings.py](#init)</b>, находящегося в папке settings, созданной на шаге выше.

Обязательные поля для работы бота:
1. **TOKEN** - ключ доступа к сообществу вконтакте, ключ должен быть с правами к сообщениям сообщества. [Как получить токен для бота?](#how_get_bot_token)
```python
  TOKEN = os.getenv("TOKEN") # "1234566789908798689764867293876243987" (str)
```
2. **BOT_CHAT_ID** - id страницы вконтакте сообщества, от лица которого будет работать бот.
```python
  BOT_CHAT_ID = os.getenv("BOT_CHAT_ID") # 123456789 (int)
```
3. **DEFAULT_REACTION_TEMPLATES** - слова на которые бот будет всегда как-либо реагировать.
```python
  DEFAULT_REACTION_TEMPLATES = (r"бот",) # (tuple)
```
4. **ADMIN_ID** - id страницы вконтакте человека, от лица которого будет происходить администрирование бота.
```python
  ADMIN_ID = os.getenv("ADMIN_ID") # 123456789 (int)
```
Остальные параметры для начального запуска бота менять не нужно.

🔔 *Советую для хранения токена и id-ов использовать .env файл. К примеру используйте [python-dotenv](https://pypi.org/project/python-dotenv/).*

## 🚀 Запуск бота

Для запуска бота мы используем файл [manager.py](#init), созданный на первом шаге.

windows
```cmd
  C:\shablbot> py manager.py --run
```

linux
```bash
  blackgard@bar:~/shablbot$ python3 manager.py --run
```

Если вы все правильно сделали, то в консоли увидите следующее сообщение:
```console
  2099-99-99 at -1:99:99 | INFO | ------- Бот запущен / Bot is runing -------
```

## :card_file_box: Модульность бота <a name="bot_modules"></a>
1. [Модуль команды](#bot_modules_commands)
2. [Модуль клавиатуры](#bot_modules_keyboards)
3. [Модуль пользовательских модулей](#bot_modules_modules)
4. [Модуль фраз](#bot_modules_phrases)
5. [Модуль настроек](#bot_modules_settings)


То, как бот обрабатывает команды и сообщения от Вас спрятано. По этому Вам доступны 5 типов модулей, для расширения и настройки бота:

### commands <a name="bot_modules_commands"></a>
Модуль отвечающий за команды управления ботом. Нужен для администрирования. Делятся на два типа:
1. <b>private</b> - доступные только администратору бота
2. <b>public</b> - доступные всем пользователям

> :bell: Команды нужно подключать в настройках бота. Переменная <b>ACTIVE_COMMANDS</b>.

Для добавления новой команды вам нужно создай файл в папке private/public с \*название_команды\*.py.

В созданном файле нужно создать переменную command_settings с следующей структурой:

```py
command_settings = {
    # Код команды. Должен быть уникальным.
    "code": "bot_off",
    # Название команды. Публичная переменная.
    "name": "Выключить бота",
    # Слова, на которые бот будет реагировать.
    # Может быть регулярным выражением.
    "templates": ["выкл бот", "бот выкл"],
    # Ответ бота, на результат выполненной команды.
    "answer": "Теперь бот не читает сообщения в чате",
    # Описание команды. Публичная переменная.
    "description": "Команда для выключения бота в чате (Внутри чата)",
    # Метод обработки templates. Если normal, то сравнивает как слова.
    # Если regular, то сравнивает как регулярные выражения.
    "method": "normal",
    # Какие переменные нужны для выполнения команды.
    # Доступные значения = processed_chat, chats, commands;
    "need": ["processed_chat",],
    # Входная точка для выполнения команды.
    # Может быть любой функцией.
    "entry_point": command
}
```

Функция выключения бота в чате:

```py
def command(processed_chat: Chat) -> None:
    processed_chat.turn_off()
```

### keyboards <a name="bot_modules_keyboards"></a>
Модуль отвечающий за варианты клавиатуры бота. Нужен для настройки сообщений, если вы хотите использовать клавиатуру в сообщениях бота.

[Про клавиатуру Vk подробнее читать тут](https://vk.com/dev/bots_docs_3)

> :bell: Клавиатуры нужно подключать в настройках бота. Переменная <b>KEYBOARDS</b>.

> :warning: *Обязательно для работы бота нужны, "clear.json" и "default.json"*

### modules <a name="bot_modules_modules"></a>
Модуль отвечающий за пользовательские модули для бота. К таким модулям можно отнести:
- Игры
- Утилиты (Погода, время, конвертирование валюты)

> :bell: Модули нужно подключать в настройках бота. Переменная <b>ACTIVE_MODULES</b>.

> :warning: *Данный блок еще не совершенен, т.к. всегда требует возврата строки как ответа, в будущем будет как ответ отправлять все типы данных*

Для создания модуля Вам необходимо создать файл с названием модуля и добавить туда переменную settings с следующей структурой:

```py
settings = {
    # Название модуля.
    "name": "Flip and roll game",
    # Версия модуля.
    "version": "1.0.0",
    # Автор модуля.
    "author": "Narteno",
    # Дата создания модуля.
    "date_created": "12.11.2019",
    # Входная точка обработки модуля.
    "entry_point": activate_module,
    # Обрабатывающие запросы функции модуля.
    # В себя включают название функции, описание
    # и входную точку. Нужен для более гибкой настройки.
    "func": {
        "roll": {"name": "roll", "description": "", "entry_point": roll},
        "flip": {"name": "flip", "description": "", "entry_point": flip},
    },
    # Фразы для реакции. Разделяются по функциям модуля.
    "templates": {"flip": [r"флип"], "roll": [r"ролл"]},
}
```

Входная точка модуля должна иметь такую структуру, но не ограничена этим:

```py
def activate_module(func) -> str:
    """Входная точка модуля"""
    active_func = settings["func"].get(func)["entry_point"]

    # Если переменная ответа будет в значении None.
    # То бот не отправит сообщение пользователю.
    answer_module = None
    if active_func:
        answer_module = active_func()

    return answer_module
```

[Подробнее о структуре кастомных модулей смотрите тут flip_and_roll.py](/shablbot/init/modules/games/flip_and_roll.py)

### phrases <a name="bot_modules_phrases"></a>
Модуль отвечающий за фразы, на которые бот реагирует. Содержит в себе файлы <b>.json</b> формата.

> :bell: Все фразы из папки подгружаются автоматически. Вы можете исключить ненужные фразы используя в настройках переменную <b>EXCLUDED_PHRASES</b>.

json файл должен содержать следующую структуру:

> :warning: *Значения с пометкой "_comment" в реальном файле не должны пристутствовать.*

```json
{
    "#group_comment#":"Стандартная группа. нельзя удалять"
    "group": "default",

    "#words_comment#":"Список слов входящих в группу"
    "words": {
        "#main_comment#":"Название слова, на которое бот реагирует. Может содержать любые символы. Для файла _default.json 'main' обязательное системное значение"
        "main": {
            "#templates_comment#":"Фразы для реакции"
            "templates": [ "бот" ],
            "#answer_comment#":"Варианты ответа разбитые по редкости"
            "answer": {
                "common": ["Я бот"],
                "uncommon": ["Я почти бот"],
                "rare": ["Я точно бот"],
                "legendary": ["А может быть это ты бот?"]
            },
            "#templates_comment#":"Ключ клавиатуры, которую нужно отправить для данного слова."
            "keyboard": "default"
        },
    }
}
```

### settings <a name="bot_modules_settings"></a>
Модуль отвечающий за настройки бота. Все настройки производятся в файле settings.py. В файле для каждой переменной имеются комментарии, поясняющие, что в них хранится.

## 💻 Пример работы

Бот по имени "Ходор" - [клик-клик (вк)](https://vk.com/hodor_designer)

## 🧰 CLI Shablbot

Для бота разработано CLI. Доступные методы:

```console
(env) C:\Users\user\Desktop\shablbot>py manager.py --help
usage: python manage.py  [-h] [-r] [-i] [-c]

🤖 Бот написанный на Python для социальной сети Вконтакте, работающий через VkBotLongPull

optional arguments:
  -h, --help       show this help message and exit
  -r, --run-bot    Запустить сервер для работы бота
  -i, --init       Инициировать каталоги для работы бота [ "commands", "keyboards", "modules", "phrases", "settings", "manager.py" ]
  -c, --check-bot  Проверить работоспособность бота без запуска сервера

(c) Alex Drachenin
```

Для старта работы с ботом вы можете воспользоваться методом "--init" таким образом:
```console
(env) C:\Users\user\Desktop\shablbot>py -m shablbot --init

Каталог 'commands' инициирован!
Каталог 'keyboards' инициирован!
Каталог 'modules' инициирован!
Каталог 'phrases' инициирован!
Каталог 'settings' инициирован!
Файл manager.py инициирован!

```


## ❔ Как получить токен для работы бота? <a name="how_get_bot_token"></a>

Для начала нам нужно создать сообщество. Для этого переходим в вк в вкладку "<b>Сообщества</b>" и нажимаем кнопку "<b>Создать сообщество</b>".

Там вы заполняете всю необходимую вам информацию, со всем соглашаетесь и попадаете на страницу группы. Там нам нужно найти вкладку "<b>Управление</b>". В меню справа найдите "<b>Настройки</b>"->"<b>Работа с API</b>".

На той странице будет 3 вкладки. Из них нам нужны только 1 и 3:

1. Нажимаем кнопку "<b>Создать ключ</b>", выбираем все необходимые нам доступы (желательно все) и нажимаем "<b>Создать</b>". Данный ключ нужен для переменной [TOKEN](#start_setting) в настройках бота.
2. Не нужна, пропускаем ее.
3. На данной вкладке вам нужно выбрать версию API, бот тестировался на самом последней версии в момент написания (5.131), советую выбирать самую свежую. Так же вам нужно установить "<b>Long Poll API</b>" в значение "<b>Включено</b>". После этого переходим на вкладку "<b>Тип событий</b>" и выбираем нужные вам значения. Минимальные для работы бота:
   1. Входящее сообщение
   2. Исходящее сообщение

После этого ваш бот готов к работе, можете начинать его тестировать, удачи!

## ✍️ Автор
* [@alex_blackgard](https://vk.com/alexblackgard) - создатель бота и человек, который будет рад любой помощи в доработке бота  🐙💭🌎

<div align="center">

[![vk](./images/vk.svg)](https://vk.com/alexblackgard) [![instagram](./images/instagram.svg)](https://www.instagram.com/alexandr_blackgard/) [![github](./images/github.svg)](https://github.com/Blackgard)

</div>

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Blackgard/shablbot",
    "name": "shablbot",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "python,bot,vk,template",
    "author": "Alexandr Drachenin",
    "author_email": "alexdrachenin98@gmail.com",
    "download_url": "https://github.com/Blackgard/shablbot/tarball/v2.0.4",
    "platform": null,
    "description": "<p align=\"center\">\r\n <img src=\"./images/shablbot.png\" alt=\"logo shablbot\">\r\n</p>\r\n<div align=\"center\">\r\n\r\n[![Build](https://img.shields.io/azure-devops/build/sasna142/026fd26f-bb59-48fd-bb91-6d9ebe113f87/2)]() [![License](https://img.shields.io/github/license/blackgard/shablbot)]()\r\n\r\n</div>\r\n\r\n---------------------------------\r\n\r\n\ud83e\udd16 \u0411\u043e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Python \u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0412\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 VkBotLongPull.\r\n\r\n## \ud83d\udcad \u041e \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a name=\"#about\"></a>\r\n\r\n\u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0441 \u0446\u0435\u043b\u044c\u044e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043b\u043e/\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u0411\u043e\u0442 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f.\r\n\r\n## \ud83c\udf88 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <a name=\"#install\"></a>\r\n\r\n\u041c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 [pip](https://pypi.org/project/pip/):\r\n```cmd\r\n pip install shablbot\r\n```\r\n\u0418\u043b\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c [poetry](https://python-poetry.org/):\r\n```poetry\r\n poetry add shablbot\r\n```\r\n\r\n## :dizzy: \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <a name=\"init\"></a>\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u043e\u0442\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0431\u043e\u0442\u0430:\r\n\r\n\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:\r\n\r\nwindows\r\n```cmd\r\n C:\\shablbot> py -m shablbot --init\r\n```\r\n\r\nlinux\r\n```bash\r\n blackgard@bar:~/shablbot$ python3 -m shablbot --init\r\n```\r\n\r\n\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439:\r\n```\r\n\ud83d\udce6*yourfolder*\r\n \u2523 \ud83d\udcc2commands\r\n \u2503  \u2523 \ud83d\udcc2private\r\n \u2503  \u2503  \u2517 \ud83d\udc0d show_id_active_chats.py\r\n \u2503  \u2523 \ud83d\udcc2public\r\n \u2503  \u2503  \u2523 \ud83d\udc0d chat_bot_off.py\r\n \u2503  \u2503  \u2523 \ud83d\udc0d chat_bot_on.py\r\n \u2503  \u2503  \u2517 \ud83d\udc0d chat_show_statistics.py\r\n \u2523 \ud83d\udcc2keyboards\r\n \u2503  \u2523 \ud83d\udcdc clear.json\r\n \u2503  \u2517 \ud83d\udcdc default.json\r\n \u2523 \ud83d\udcc2modules\r\n \u2503 \u2517 \ud83d\udcc2games\r\n \u2503    \u2517 \ud83d\udc0d flip_and_roll.py\r\n \u2523 \ud83d\udcc2phrases\r\n \u2503  \u2523 \ud83d\udcdc _default.json\r\n \u2503  \u2523 \ud83d\udcdc bye.json\r\n \u2503  \u2517 \ud83d\udcdc hello.json\r\n \u2523 \ud83d\udcc2settings\r\n \u2503  \u2523 \ud83d\udc0d settings_model.py\r\n \u2503  \u2517 \ud83d\udc0d settings.py\r\n \u2517 \ud83d\udc0d manager.py\r\n```\r\n<div align=\"center\"><font size=\"2\" style=\"text-align:center\">\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0430\u043b\u0435\u0435</font></div>\r\n<br>\r\n\r\n\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0431\u043e\u0442\u0430.\r\n\r\n## \u23f3 \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <a name=\"start_setting\"></a>\r\n\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 <b>[settings.py](#init)</b>, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 settings, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0448\u0430\u0433\u0435 \u0432\u044b\u0448\u0435.\r\n\r\n\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430:\r\n1. **TOKEN** - \u043a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 \u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435, \u043a\u043b\u044e\u0447 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. [\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0431\u043e\u0442\u0430?](#how_get_bot_token)\r\n```python\r\n  TOKEN = os.getenv(\"TOKEN\") # \"1234566789908798689764867293876243987\" (str)\r\n```\r\n2. **BOT_CHAT_ID** - id \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043e\u0442 \u043b\u0438\u0446\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u0442.\r\n```python\r\n  BOT_CHAT_ID = os.getenv(\"BOT_CHAT_ID\") # 123456789 (int)\r\n```\r\n3. **DEFAULT_REACTION_TEMPLATES** - \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0430\u043a-\u043b\u0438\u0431\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\r\n```python\r\n  DEFAULT_REACTION_TEMPLATES = (r\"\u0431\u043e\u0442\",) # (tuple)\r\n```\r\n4. **ADMIN_ID** - id \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043e\u0442 \u043b\u0438\u0446\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430.\r\n```python\r\n  ADMIN_ID = os.getenv(\"ADMIN_ID\") # 123456789 (int)\r\n```\r\n\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u0442\u0430 \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.\r\n\r\n\ud83d\udd14 *\u0421\u043e\u0432\u0435\u0442\u0443\u044e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 id-\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c .env \u0444\u0430\u0439\u043b. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [python-dotenv](https://pypi.org/project/python-dotenv/).*\r\n\r\n## \ud83d\ude80 \u0417\u0430\u043f\u0443\u0441\u043a \u0431\u043e\u0442\u0430\r\n\r\n\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0430\u0439\u043b [manager.py](#init), \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435.\r\n\r\nwindows\r\n```cmd\r\n  C:\\shablbot> py manager.py --run\r\n```\r\n\r\nlinux\r\n```bash\r\n  blackgard@bar:~/shablbot$ python3 manager.py --run\r\n```\r\n\r\n\u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:\r\n```console\r\n  2099-99-99 at -1:99:99 | INFO | ------- \u0411\u043e\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d / Bot is runing -------\r\n```\r\n\r\n## :card_file_box: \u041c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u043e\u0442\u0430 <a name=\"bot_modules\"></a>\r\n1. [\u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b](#bot_modules_commands)\r\n2. [\u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b](#bot_modules_keyboards)\r\n3. [\u041c\u043e\u0434\u0443\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439](#bot_modules_modules)\r\n4. [\u041c\u043e\u0434\u0443\u043b\u044c \u0444\u0440\u0430\u0437](#bot_modules_phrases)\r\n5. [\u041c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a](#bot_modules_settings)\r\n\r\n\r\n\u0422\u043e, \u043a\u0430\u043a \u0431\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0412\u0430\u0441 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043e. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0412\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b 5 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u043e\u0442\u0430:\r\n\r\n### commands <a name=\"bot_modules_commands\"></a>\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u043c. \u041d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430:\r\n1. <b>private</b> - \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0431\u043e\u0442\u0430\r\n2. <b>public</b> - \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\r\n\r\n> :bell: \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0431\u043e\u0442\u0430. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <b>ACTIVE_COMMANDS</b>.\r\n\r\n\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0439 \u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043f\u043a\u0435 private/public \u0441 \\*\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435_\u043a\u043e\u043c\u0430\u043d\u0434\u044b\\*.py.\r\n\r\n\u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e command_settings \u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439:\r\n\r\n```py\r\ncommand_settings = {\r\n    # \u041a\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0414\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c.\r\n    \"code\": \"bot_off\",\r\n    # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.\r\n    \"name\": \"\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u043e\u0442\u0430\",\r\n    # \u0421\u043b\u043e\u0432\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\r\n    # \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c.\r\n    \"templates\": [\"\u0432\u044b\u043a\u043b \u0431\u043e\u0442\", \"\u0431\u043e\u0442 \u0432\u044b\u043a\u043b\"],\r\n    # \u041e\u0442\u0432\u0435\u0442 \u0431\u043e\u0442\u0430, \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.\r\n    \"answer\": \"\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u0442 \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442\u0435\",\r\n    # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.\r\n    \"description\": \"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u0430 \u0432 \u0447\u0430\u0442\u0435 (\u0412\u043d\u0443\u0442\u0440\u0438 \u0447\u0430\u0442\u0430)\",\r\n    # \u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 templates. \u0415\u0441\u043b\u0438 normal, \u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u043b\u043e\u0432\u0430.\r\n    # \u0415\u0441\u043b\u0438 regular, \u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f.\r\n    \"method\": \"normal\",\r\n    # \u041a\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b.\r\n    # \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f = processed_chat, chats, commands;\r\n    \"need\": [\"processed_chat\",],\r\n    # \u0412\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b.\r\n    # \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439.\r\n    \"entry_point\": command\r\n}\r\n```\r\n\r\n\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u0430 \u0432 \u0447\u0430\u0442\u0435:\r\n\r\n```py\r\ndef command(processed_chat: Chat) -> None:\r\n    processed_chat.turn_off()\r\n```\r\n\r\n### keyboards <a name=\"bot_modules_keyboards\"></a>\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0431\u043e\u0442\u0430. \u041d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 \u0431\u043e\u0442\u0430.\r\n\r\n[\u041f\u0440\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 Vk \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442](https://vk.com/dev/bots_docs_3)\r\n\r\n> :bell: \u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0431\u043e\u0442\u0430. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <b>KEYBOARDS</b>.\r\n\r\n> :warning: *\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 \u043d\u0443\u0436\u043d\u044b, \"clear.json\" \u0438 \"default.json\"*\r\n\r\n### modules <a name=\"bot_modules_modules\"></a>\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f \u0431\u043e\u0442\u0430. \u041a \u0442\u0430\u043a\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438:\r\n- \u0418\u0433\u0440\u044b\r\n- \u0423\u0442\u0438\u043b\u0438\u0442\u044b (\u041f\u043e\u0433\u043e\u0434\u0430, \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u043b\u044e\u0442\u044b)\r\n\r\n> :bell: \u041c\u043e\u0434\u0443\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0431\u043e\u0442\u0430. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <b>ACTIVE_MODULES</b>.\r\n\r\n> :warning: *\u0414\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0435\u043d, \u0442.\u043a. \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u0430\u043a \u043e\u0442\u0432\u0435\u0442\u0430, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u043e\u0442\u0432\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445*\r\n\r\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e settings \u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439:\r\n\r\n```py\r\nsettings = {\r\n    # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    \"name\": \"Flip and roll game\",\r\n    # \u0412\u0435\u0440\u0441\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    \"version\": \"1.0.0\",\r\n    # \u0410\u0432\u0442\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    \"author\": \"Narteno\",\r\n    # \u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    \"date_created\": \"12.11.2019\",\r\n    # \u0412\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    \"entry_point\": activate_module,\r\n    # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    # \u0412 \u0441\u0435\u0431\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\r\n    # \u0438 \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443. \u041d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.\r\n    \"func\": {\r\n        \"roll\": {\"name\": \"roll\", \"description\": \"\", \"entry_point\": roll},\r\n        \"flip\": {\"name\": \"flip\", \"description\": \"\", \"entry_point\": flip},\r\n    },\r\n    # \u0424\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438. \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u043c\u043e\u0434\u0443\u043b\u044f.\r\n    \"templates\": {\"flip\": [r\"\u0444\u043b\u0438\u043f\"], \"roll\": [r\"\u0440\u043e\u043b\u043b\"]},\r\n}\r\n```\r\n\r\n\u0412\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043d\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u044d\u0442\u0438\u043c:\r\n\r\n```py\r\ndef activate_module(func) -> str:\r\n    \"\"\"\u0412\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f\"\"\"\r\n    active_func = settings[\"func\"].get(func)[\"entry_point\"]\r\n\r\n    # \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 None.\r\n    # \u0422\u043e \u0431\u043e\u0442 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.\r\n    answer_module = None\r\n    if active_func:\r\n        answer_module = active_func()\r\n\r\n    return answer_module\r\n```\r\n\r\n[\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0442\u0443\u0442 flip_and_roll.py](/shablbot/init/modules/games/flip_and_roll.py)\r\n\r\n### phrases <a name=\"bot_modules_phrases\"></a>\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0444\u0440\u0430\u0437\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0444\u0430\u0439\u043b\u044b <b>.json</b> \u0444\u043e\u0440\u043c\u0430\u0442\u0430.\r\n\r\n> :bell: \u0412\u0441\u0435 \u0444\u0440\u0430\u0437\u044b \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0440\u0430\u0437\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <b>EXCLUDED_PHRASES</b>.\r\n\r\njson \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:\r\n\r\n> :warning: *\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 \"_comment\" \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.*\r\n\r\n```json\r\n{\r\n    \"#group_comment#\":\"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430. \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u044f\u0442\u044c\"\r\n    \"group\": \"default\",\r\n\r\n    \"#words_comment#\":\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443\"\r\n    \"words\": {\r\n        \"#main_comment#\":\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0432\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u043e\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442. \u041c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u0414\u043b\u044f \u0444\u0430\u0439\u043b\u0430 _default.json 'main' \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"\r\n        \"main\": {\r\n            \"#templates_comment#\":\"\u0424\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438\"\r\n            \"templates\": [ \"\u0431\u043e\u0442\" ],\r\n            \"#answer_comment#\":\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0435 \u043f\u043e \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u0438\"\r\n            \"answer\": {\r\n                \"common\": [\"\u042f \u0431\u043e\u0442\"],\r\n                \"uncommon\": [\"\u042f \u043f\u043e\u0447\u0442\u0438 \u0431\u043e\u0442\"],\r\n                \"rare\": [\"\u042f \u0442\u043e\u0447\u043d\u043e \u0431\u043e\u0442\"],\r\n                \"legendary\": [\"\u0410 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u0442\u044b \u0431\u043e\u0442?\"]\r\n            },\r\n            \"#templates_comment#\":\"\u041a\u043b\u044e\u0447 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430.\"\r\n            \"keyboard\": \"default\"\r\n        },\r\n    }\r\n}\r\n```\r\n\r\n### settings <a name=\"bot_modules_settings\"></a>\r\n\u041c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u043e\u0442\u0430. \u0412\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 settings.py. \u0412 \u0444\u0430\u0439\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043f\u043e\u044f\u0441\u043d\u044f\u044e\u0449\u0438\u0435, \u0447\u0442\u043e \u0432 \u043d\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f.\r\n\r\n## \ud83d\udcbb \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b\r\n\r\n\u0411\u043e\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \"\u0425\u043e\u0434\u043e\u0440\" - [\u043a\u043b\u0438\u043a-\u043a\u043b\u0438\u043a (\u0432\u043a)](https://vk.com/hodor_designer)\r\n\r\n## \ud83e\uddf0 CLI Shablbot\r\n\r\n\u0414\u043b\u044f \u0431\u043e\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e CLI. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:\r\n\r\n```console\r\n(env) C:\\Users\\user\\Desktop\\shablbot>py manager.py --help\r\nusage: python manage.py  [-h] [-r] [-i] [-c]\r\n\r\n\ud83e\udd16 \u0411\u043e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Python \u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0412\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 VkBotLongPull\r\n\r\noptional arguments:\r\n  -h, --help       show this help message and exit\r\n  -r, --run-bot    \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430\r\n  -i, --init       \u0418\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430 [ \"commands\", \"keyboards\", \"modules\", \"phrases\", \"settings\", \"manager.py\" ]\r\n  -c, --check-bot  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0431\u043e\u0442\u0430 \u0431\u0435\u0437 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\r\n\r\n(c) Alex Drachenin\r\n```\r\n\r\n\u0414\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u0442\u043e\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \"--init\" \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:\r\n```console\r\n(env) C:\\Users\\user\\Desktop\\shablbot>py -m shablbot --init\r\n\r\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 'commands' \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d!\r\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 'keyboards' \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d!\r\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 'modules' \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d!\r\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 'phrases' \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d!\r\n\u041a\u0430\u0442\u0430\u043b\u043e\u0433 'settings' \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d!\r\n\u0424\u0430\u0439\u043b manager.py \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d!\r\n\r\n```\r\n\r\n\r\n## \u2754 \u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430? <a name=\"how_get_bot_token\"></a>\r\n\r\n\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0432\u043a \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \"<b>\u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430</b>\" \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"<b>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e</b>\".\r\n\r\n\u0422\u0430\u043c \u0432\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u0432\u0441\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0432\u0430\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0441\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044c \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0433\u0440\u0443\u043f\u043f\u044b. \u0422\u0430\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \"<b>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435</b>\". \u0412 \u043c\u0435\u043d\u044e \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \"<b>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438</b>\"->\"<b>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 API</b>\".\r\n\r\n\u041d\u0430 \u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 3 \u0432\u043a\u043b\u0430\u0434\u043a\u0438. \u0418\u0437 \u043d\u0438\u0445 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0438 3:\r\n\r\n1. \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \"<b>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447</b>\", \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u044b (\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0435) \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \"<b>\u0421\u043e\u0437\u0434\u0430\u0442\u044c</b>\". \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 [TOKEN](#start_setting) \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0431\u043e\u0442\u0430.\r\n2. \u041d\u0435 \u043d\u0443\u0436\u043d\u0430, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0435.\r\n3. \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e API, \u0431\u043e\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f (5.131), \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u0443\u044e \u0441\u0432\u0435\u0436\u0443\u044e. \u0422\u0430\u043a \u0436\u0435 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \"<b>Long Poll API</b>\" \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"<b>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e</b>\". \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \"<b>\u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u0439</b>\" \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0432\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430:\r\n   1. \u0412\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\r\n   2. \u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\r\n\r\n\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u0448 \u0431\u043e\u0442 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435, \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443\u0434\u0430\u0447\u0438!\r\n\r\n## \u270d\ufe0f \u0410\u0432\u0442\u043e\u0440\r\n* [@alex_blackgard](https://vk.com/alexblackgard) - \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u0431\u043e\u0442\u0430 \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0434 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u0442\u0430  \ud83d\udc19\ud83d\udcad\ud83c\udf0e\r\n\r\n<div align=\"center\">\r\n\r\n[![vk](./images/vk.svg)](https://vk.com/alexblackgard) [![instagram](./images/instagram.svg)](https://www.instagram.com/alexandr_blackgard/) [![github](./images/github.svg)](https://github.com/Blackgard)\r\n\r\n</div>\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u0411\u043e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Python \u0434\u043b\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0412\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 VkBotLongPull",
    "version": "2.0.4",
    "split_keywords": [
        "python",
        "bot",
        "vk",
        "template"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0d2a668cf9dab772af88b650366e1e3e9b0f642895eabd96fe9cfc6d13768dcd",
                "md5": "21ed77fdda384576d4f6bc80274b148f",
                "sha256": "b015506f3bd6375f20b82ea55785580865e680f2db66a291bc026c99ea0a99b8"
            },
            "downloads": -1,
            "filename": "shablbot-2.0.4-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "21ed77fdda384576d4f6bc80274b148f",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": ">=3.8",
            "size": 42965,
            "upload_time": "2023-01-05T17:38:51",
            "upload_time_iso_8601": "2023-01-05T17:38:51.263934Z",
            "url": "https://files.pythonhosted.org/packages/0d/2a/668cf9dab772af88b650366e1e3e9b0f642895eabd96fe9cfc6d13768dcd/shablbot-2.0.4-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-01-05 17:38:51",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "Blackgard",
    "github_project": "shablbot",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "shablbot"
}
        
Elapsed time: 0.06980s