Skip to content

Commit bf4d81a

Browse files
feat: initial commit
0 parents  commit bf4d81a

File tree

11 files changed

+590
-0
lines changed

11 files changed

+590
-0
lines changed

.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
BASE_URL=https://platform-api.max.ru
2+
TOKEN=YOUR_BOT_TOKEN

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 GREEN-API
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
# MAX BOT API Demo chatbot (Python)
2+
3+
Пример чат-бота, написанного на **Python** с использованием **SDK** [maxbot-chatbot-python](https://github.com/green-api/maxbot-chatbot-python) и [maxbot-api-client-python](https://github.com/green-api/maxbot-api-client-python) от [GREEN-API](https://green-api.com/max-bot-api).
4+
5+
Этот чат-бот демонстрирует возможности **MAX BOT API** по отправке текстовых сообщений, медиафайлов (картинки, аудио, видео, PDF), геолокаций и контактов с использованием системы сцен и интерактивных кнопок.
6+
7+
## Содержание
8+
9+
* [Установка](#установка)
10+
* [Запуск чат-бота](#запуск-чат-бота)
11+
* [Настройка чат-бота](#настройка-чат-бота)
12+
* [Использование](#использование)
13+
* [Структура кода](#структура-кода)
14+
* [Управление сообщениями](#управление-сообщениями)
15+
* [Лицензия](#лицензия)
16+
17+
## Установка
18+
19+
**Убедитесь, что у вас установлен Python версии 3.12 или выше:**
20+
21+
```bash
22+
python --version
23+
```
24+
25+
**Установите библиотеку:**
26+
27+
```bash
28+
git clone https://github.com/green-api/maxbot-demo-chatbot-python
29+
```
30+
31+
Откройте проект в любой IDE.
32+
Среда для запуска чат-бота готова, теперь необходимо произвести настройку и запустить чат-бот.
33+
34+
## Запуск чат-бота
35+
36+
**Параметры конфигурации:**
37+
38+
- `BASE_URL` - Базовый URL-адрес серверов платформы MaxBot. Все методы API будут отправляться по этому корневому адресу. Актуальный адрес указан в [официальной документации](https://dev.max.ru/docs-api).
39+
- `TOKEN` - Уникальный секретный ключ авторизации (API-ключ) вашего бота. Получить его можно в личном кабинете после [регистрации или создании бота](https://green-api.com/max-bot-api/docs/before-start/) на платформе [business.max.ru](https://business.max.ru/).
40+
- `ratelimiter` - Встроенный ограничитель частоты запросов. Он контролирует количество исходящих запросов в секунду (RPS), защищая бота от блокировки со стороны сервера за превышение лимитов. Рекомендуемое значение — не менее 25.
41+
- `timeout` - Максимальное время ожидания ответа от сервера (в секундах). Если сервер не ответит в течение этого времени, запрос будет завершен с ошибкой. Оптимальное значение — 30 секунд.
42+
43+
1. Создайте файл `.env` в корневой директории проекта.
44+
2. Добавьте в него ваши данные:
45+
46+
```bash
47+
BASE_URL=https://platform-api.max.ru
48+
TOKEN=1A2B3C4D5E6F7G8H9I0J9K8L7M6N5O4P3Q3R2S1T2U3V4W5X6Y7Z
49+
```
50+
> Значение `ratelimiter` и `timeout` можно изменить в файле [main.py](./main.py) перед его запуском.
51+
52+
3. Запустите бота командой:
53+
54+
```bash
55+
python main.py
56+
```
57+
58+
Программа инициализирует клиент, настроит **менеджер состояний** и запустит `polling` для получения уведомлений в реальном времени. Для остановки нажмите `Ctrl + C`.
59+
60+
## Настройка чат-бота
61+
62+
Вы можете изменить медиафайлы, которые бот отправляет пользователям. Ссылки на файлы находятся в файле [`scenes/endpoints.py`](./scenes/endpoints.py).
63+
64+
Например, для изменения PDF-файла найдите следующий блок:
65+
66+
```python
67+
elif text_lower in ["2", "/file"]:
68+
await n.reply_with_media(
69+
t(lang, "send_file_message") + t(lang, "links.send_file_documentation"),
70+
"markdown",
71+
"https://storage.yandexcloud.net/your-link/file.pdf",
72+
self.get_control_buttons(lang)
73+
)
74+
```
75+
76+
Замените URL `"https://storage.yandexcloud.net/your-link/file.pdf"` на прямую ссылку вашего файла.
77+
78+
## Использование
79+
80+
Если предыдущие шаги были выполнены, ваш бот будет готов к приему сообщений.
81+
82+
Напишите боту любое текстовое сообщение (например, `/start`). Чат-бот поддерживает 2 языка, поэтому сначала он предложит выбрать язык с помощью клавиатуры:
83+
84+
```text
85+
Please select your language:
86+
Пожалуйста, выберите язык:
87+
[English] [Русский]
88+
```
89+
90+
Выбрав русский язык, вы получите приветствие с картинкой и главным меню в виде кнопок:
91+
92+
```text
93+
Добро пожаловать в MAX BOT API чат-бот, {Имя_Пользователя}!
94+
95+
GREEN-API предоставляет отправку данных следующих видов.
96+
Выберите цифру или нажмите кнопку!
97+
98+
1. Текст 📩
99+
2. Файл 📋
100+
3. Картинка 🖼
101+
4. Аудио 🎵
102+
5. Видео 📽
103+
6. Контакт 📱
104+
7. Геолокация 🌎
105+
8. О боте 🦎
106+
107+
Чтобы вернуться в начало, напишите *стоп* или *0*
108+
```
109+
110+
Нажимая на кнопки (или отправляя соответствующие цифры), бот будет присылать вам демонстрационные сообщения с использованием различных методов **MAX API** (фотографии, голосовые сообщения, файлы) и прикреплять ссылки на официальную документацию.
111+
112+
## Структура кода
113+
114+
Основной файл чат-бота — это [`main.py`](./main.py). В нем находится функция `main`, с которой начинается выполнение программы.
115+
116+
Данный бот использует **паттерн сцен** для организации кода. Логика разделена на **фрагменты** (сцены), каждая из которых соответствует определенному состоянию диалога:
117+
118+
* [`scenes/start.py`](./scenes/start.py) — приветственная сцена. Отвечает за выбор языка и инициализацию данных пользователя.
119+
* [`scenes/main_menu.py`](./scenes/main_menu.py) — формирует главное меню, отправляет приветственное изображение и переключает контекст на рабочие эндпоинты.
120+
* [`scenes/endpoints.py`](./scenes/endpoints.py) — содержит логику обработки всех функциональных кнопок (отправка текста, медиа, контактов).
121+
122+
Тексты сообщений вынесены отдельно и хранятся в файле [`assets/strings.yaml`](./assets/strings.yaml). Для получения нужной строки в зависимости от языка используется утилита перевода [`utils/yml_reader.py`](./utils/yml_reader.py).
123+
124+
## Управление сообщениями
125+
126+
Все взаимодействия реализованы через **MAX API** с использованием **Python-библиотек**:
127+
128+
* [maxbot-api-client-python](https://github.com/green-api/maxbot-api-client-python) — базовый клиент для работы с API.
129+
* [maxbot-chatbot-python](https://github.com/green-api/maxbot-chatbot-python) — фреймворк для создания ботов со сценами, состояниями и удобными обертками.
130+
131+
Отправка сообщений максимально упрощена благодаря методам объекта `Notification`. Например, отправка локации:
132+
133+
```python
134+
notification.reply_with_location(
135+
lat=51.5074,
136+
lon=-0.1278
137+
)
138+
```
139+
140+
Или отправка медиафайла:
141+
142+
```python
143+
notification.reply_with_media(
144+
text="Look at this!",
145+
format_type="markdown",
146+
file_source="https://example.com/image.jpg"
147+
)
148+
```
149+
150+
Все доступные методы **API** описаны в [официальной документации](https://green-api.com/max-bot-api/docs/).
151+
Полную документацию по **MAX API** можно найти на официальном портале разработчиков: [dev.max.ru/docs-api](https://dev.max.ru/docs-api).

assets/strings.yaml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
select_language: "1 - English \n2 - Русский"
2+
specify_language: "Please choose a language for further conversation\n1 - English \n2 - Русский"
3+
please_use_text: "Please enter a text message for further conversation with bot\n"
4+
welcome_message:
5+
ru: "Добро пожаловать в MAX BOT API чат-бот, "
6+
en: "Welcome to the MAX BOT API chatbot, "
7+
stop_message:
8+
ru: "Спасибо за использование чат-бота MAX BOT API, "
9+
en: "Thank you for using the MAX BOT API chatbot, "
10+
menu:
11+
ru: "\n\nMAX BOT API предоставляет отправку данных следующих видов. \nВыберите цифру или нажмите кнопку!\n\n1. Текст 📩\n2. Файл 📋\n3. Картинка 🖼\n4. Аудио 🎵\n5. Видео 📽\n6. Контакт 📱\n7. Геолокация 🌎\n8. О боте 🦎\n\nЧтобы вернуться в начало, напишите *стоп* или *0*"
12+
en: "\n\nMAX BOT API provides sending the following types of data. \nSelect a number or press a button!\n\n1. Text 📩\n2. File 📋\n3. Image 🖼\n4. Audio 🎵\n5. Video 📽\n6. Contact 📱\n7. Geolocation 🌎\n8. About 🦎\n\nTo restart, type *stop* or *0*"
13+
about_chatbot:
14+
ru: "**Python MAX BOT API чат-бот** предназначен для демонстрации возможностей MAX BOT API.\n\nКод открыт, на его основе Вы легко сможете написать своего бота."
15+
en: "**Python MAX BOT API chatbot** is designed to demonstrate the capabilities of the MAX BOT API.\n\nThe code is open source, and you can easily write your own bot on its basis."
16+
send_text_message:
17+
ru: "Это сообщение отправлено через метод **SendMessage**.\n\n**Документация**: \n\n"
18+
en: "This message is sent via **SendMessage** method.\n\n**Documentation**: \n\n"
19+
send_file_message:
20+
ru: "Этот файл отправлен методом **UploadFile**.\nФайл содержит фотографию корги в расширении pdf!\n\n**Документация**: \n\n"
21+
en: "This file is sent via **UploadFile** method.\nThe file is image of corgi in the pdf extension!\n\n**Documentation**: \n\n"
22+
send_image_message:
23+
ru: "Это фото отправлено методом **UploadFile**. Корги поднимет вам настроение! 🥳\n\n**Документация**: \n\n"
24+
en: "This image is sent via **UploadFile** method. Hope a little corgi will lighten your mood! 🥳\n\n**Documentation**: \n\n"
25+
send_audio_message:
26+
ru: "Это аудио отправлено методом **UploadFile**.\n\n**Документация**: \n\n"
27+
en: "This audio is sent using the **UploadFile** method.\n\n**Documentation**: \n\n"
28+
send_video_message:
29+
ru: "Это видео отправлено методом **UploadFile**.\n\n**Документация**: \n\n"
30+
en: "This video is sent via **UploadFile** method.\n\n**Documentation**: \n\n"
31+
send_contact_message:
32+
ru: "Следующий контакт будет отправлен методом **SendMessage**.\n\n**Документация**: \n\n"
33+
en: "The following contact to be sent via **SendMessage** method.\n\n**Documentation**: \n\n"
34+
send_location_message:
35+
ru: "Следующая геолокация будет отправлена методом **SendMessage**.\nЭто координаты острова Мальта!\n\n**Документация**: \n\n"
36+
en: "The following location to be sent via **SendMessage** method.\nThese are the coordinates of Malta island!\n\n**Documentation**: \n\n"
37+
not_recognized_message:
38+
ru: "Извините, я не совсем вас понял 😔, напишите меню, чтобы посмотреть возможные опции"
39+
en: "Sorry, I cannot understand what you are talking about 😔, type in menu to see the available options"
40+
links:
41+
send_text_documentation: "https://green-api.com/max-bot-api/docs/api/messages/SendMessage/"
42+
send_file_documentation: "https://green-api.com/max-bot-api/docs/api/upload/UploadFile/"
43+
send_contact_documentation: "https://green-api.com/max-bot-api/docs/api/messages/SendMessage/"
44+
send_location_documentation: "https://green-api.com/max-bot-api/docs/api/messages/SendMessage/"
45+
maxbot_api_client_python_documentation: "https://github.com/green-api/maxbot-api-client-python/blob/master/README.md"
46+
greenapi_website: "https://green-api.com/max"
47+
max_documentation: "https://dev.max.ru/docs-api"
48+
link_to_source_code:
49+
ru: "\n\n🗒️ Исходный код чатбота на GitHub:\nhttps://github.com/green-api/maxbot-demo-chatbot-python"
50+
en: "\n\n🗒️ Source code of the chatbot on GitHub:\nhttps://github.com/green-api/maxbot-demo-chatbot-python"
51+
link_to_max:
52+
ru: "\n\n📚 Документация MAX API:\nhttps://dev.max.ru/docs-api"
53+
en: "\n\n📚 MAX API Documentation:\nhttps://dev.max.ru/docs-api"
54+
link_to_docs:
55+
ru: "\n\n📚 Документация MAX BOT API:\nhttps://green-api.com/max-bot-api/docs/"
56+
en: "\n\n📚 MAX BOT API Documentation:\nhttps://green-api.com/max-bot-api/docs/"
57+
bot_name:
58+
ru: "MAX BOT API чат-бот"
59+
en: "MAX BOT API chatbot"

main.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import asyncio, logging, os, time
2+
from dotenv import load_dotenv
3+
4+
from maxbot_chatbot_python import Bot, MapStateManager
5+
from maxbot_api_client_python import API, Config
6+
from scenes.start import StartScene
7+
8+
logger = logging.getLogger(__name__)
9+
10+
async def main():
11+
if not load_dotenv():
12+
logger.warning("Error loading .env file or it does not exist")
13+
14+
cfg = Config(
15+
base_url=os.getenv("BASE_URL"),
16+
token=os.getenv("TOKEN"),
17+
ratelimiter=25,
18+
timeout=30
19+
)
20+
21+
async with API(cfg) as api_client:
22+
bot = Bot(api_client)
23+
24+
start_scene = StartScene()
25+
bot.state_manager = MapStateManager(init_data={})
26+
bot.state_manager.set_start_scene(start_scene)
27+
28+
start_time = time.time()
29+
30+
@bot.router.register("message_created")
31+
@bot.router.register("message_callback")
32+
async def scene_handler(notification):
33+
if notification.update and getattr(notification.update, 'timestamp', 0) < (start_time * 1000):
34+
return
35+
36+
notification.create_state_id()
37+
38+
if not bot.state_manager.get(notification.state_id):
39+
bot.state_manager.create(notification.state_id)
40+
41+
current_scene = notification.get_current_scene()
42+
if not current_scene:
43+
current_scene = start_scene
44+
notification.activate_next_scene(current_scene)
45+
46+
if hasattr(current_scene, 'execute'):
47+
await current_scene.execute(notification)
48+
else:
49+
logger.error(f"Current scene {type(current_scene).__name__} does not implement 'execute'")
50+
51+
try:
52+
logger.info("Bot is polling...")
53+
await bot.start_polling()
54+
except asyncio.CancelledError:
55+
logger.info("The bot has been stopped")
56+
57+
if __name__ == "__main__":
58+
try:
59+
asyncio.run(main())
60+
except KeyboardInterrupt:
61+
logger.info("The bot has been stopped by user")

pyproject.toml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[build-system]
2+
requires = ["setuptools>=61.0"]
3+
build-backend = "setuptools.build_meta"
4+
5+
[project]
6+
name = "maxbot-demo-chatbot-python"
7+
version = "1.1.1"
8+
description = "Python demo chatbot for MAX BOT API"
9+
readme = "README.md"
10+
authors = [{ name = "Green-API" }]
11+
requires-python = ">=3.12"
12+
classifiers = [
13+
"Programming Language :: Python :: 3",
14+
"License :: OSI Approved :: MIT License",
15+
"Operating System :: OS Independent",
16+
]
17+
dependencies = [
18+
"maxbot-api-client-python>=1.2.2",
19+
"maxbot-chatbot-python>=1.1.1",
20+
"httpx>=0.28.1",
21+
"python-dotenv>=1.0.1",
22+
"PyYAML>=6.0.2",
23+
"pydantic>=2.10.6"
24+
]
25+
26+
[project.urls]
27+
Homepage = "https://github.com/green-api/maxbot-demo-chatbot-python"

requirements.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
maxbot-api-client-python>=1.2.0
2+
maxbot-chatbot-python>=1.1.1
3+
python-dotenv>=1.0.1
4+
PyYAML>=6.0.2
5+
httpx>=0.28.1
6+
pydantic>=2.10.6

0 commit comments

Comments
 (0)