Compare commits
5 Commits
52d69904c6
...
7155f974a2
| Author | SHA1 | Date | |
|---|---|---|---|
| 7155f974a2 | |||
| cd85a1b7fb | |||
| bdc51a32c5 | |||
| c88b5228b7 | |||
| 611114ec09 |
@@ -62,13 +62,7 @@ if __name__ == '__main__':
|
||||
|
||||
## ⭐️ Примеры
|
||||
|
||||
- [Эхо бот](https://github.com/love-apples/maxapi/blob/main/examples/echo/main.py)
|
||||
- [Обработчик доступных событий](https://github.com/love-apples/maxapi/blob/main/examples/events/main.py)
|
||||
- [Обработчики с MagicFilter](https://github.com/love-apples/maxapi/blob/main/examples/magic_filters/main.py)
|
||||
- [Демонстрация роутинга, InputMedia и механика контекста](https://github.com/love-apples/maxapi/tree/main/examples/router_with_input_media) (audio.mp3 для команды /media)
|
||||
- [Получение ID](https://github.com/love-apples/maxapi/tree/main/examples/get_ids/main.py)
|
||||
- [Миддлварь в хендлерах](https://github.com/love-apples/maxapi/tree/main/examples/middleware_in_handlers/main.py)
|
||||
- [Миддлварь в роутерах](https://github.com/love-apples/maxapi/tree/main/examples/middleware_for_router/main.py)
|
||||
[Тут](https://github.com/love-apples/maxapi/tree/main/examples)
|
||||
|
||||
---
|
||||
|
||||
|
||||
11
examples/README.md
Normal file
11
examples/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
## ⭐️ Примеры
|
||||
|
||||
- [Эхо бот](https://github.com/love-apples/maxapi/blob/main/examples/echo/main.py)
|
||||
- [Обработчик доступных событий](https://github.com/love-apples/maxapi/blob/main/examples/events/main.py)
|
||||
- [Обработчики с MagicFilter](https://github.com/love-apples/maxapi/blob/main/examples/magic_filters/main.py)
|
||||
- [Демонстрация роутинга, InputMedia и механика контекста](https://github.com/love-apples/maxapi/tree/main/examples/router_with_input_media) (audio.mp3 для команды /media)
|
||||
- [Получение ID](https://github.com/love-apples/maxapi/tree/main/examples/get_ids/main.py)
|
||||
- [Миддлварь в хендлерах](https://github.com/love-apples/maxapi/tree/main/examples/middleware_in_handlers/main.py)
|
||||
- [Вебхуки](https://github.com/love-apples/maxapi/tree/main/examples/webhook)
|
||||
- [Клавиатуры](https://github.com/love-apples/maxapi/tree/main/examples/keyboard/main.py)
|
||||
- [Миддлварь в роутерах](https://github.com/love-apples/maxapi/tree/main/examples/middleware_for_router/main.py)
|
||||
4
examples/webhook/README.md
Normal file
4
examples/webhook/README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
## Вебхуки
|
||||
|
||||
- [Высокоуровневый](https://github.com/love-apples/maxapi/tree/main/examples/webhook/high_level.py)
|
||||
- [Низкоуровневый](https://github.com/love-apples/maxapi/tree/main/examples/webhook/low_level.py)
|
||||
@@ -1,5 +1,3 @@
|
||||
# Методы класса Bot
|
||||
|
||||
## 💬 Работа с сообщениями
|
||||
|
||||
### `send_message(...)`
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# События
|
||||
|
||||
Для обработки разных типов обновлений используются события (Event). Ниже перечислены основные события и их назначение.
|
||||
|
||||
| Событие | Описание |
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# Философия хендлеров или как задается хендлер в maxapi
|
||||
|
||||
Для регистрации хендлера в maxapi используется объект `Dispatcher` или `Router` и декоратор с указанием типа события и фильтра.
|
||||
|
||||
## Общий синтаксис
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# Клавиатуры и кнопки
|
||||
|
||||
Есть два способа построения клавиатур для сообщений: через **InlineKeyboardBuilder** и через **pydantic-модели** (ButtonsPayload)
|
||||
|
||||
---
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# MemoryContext
|
||||
|
||||
Контекст данных пользователя с поддержкой асинхронных блокировок. Используется для хранения и управления состоянием пользователя в рамках сессии.
|
||||
|
||||
При передаче в хендлер события `message_chat_created` в качестве атрибута `chat_id` идёт идентификатор созданного чата, а `user_id` - идентификатора бота!
|
||||
|
||||
143
wiki/webhook.md
Normal file
143
wiki/webhook.md
Normal file
@@ -0,0 +1,143 @@
|
||||
## Высокоуровневый запуск webhook через Dispatcher.handle\_webhook
|
||||
|
||||
```python
|
||||
async def handle_webhook(self, bot: Bot, host: str = '0.0.0.0', port: int = 8080)
|
||||
```
|
||||
|
||||
Запускает FastAPI-приложение для приёма событий через вебхук.
|
||||
Рекомендуется для большинства сценариев, когда не требуется ручной контроль над обработкой запроса.
|
||||
|
||||
### Параметры
|
||||
|
||||
* **bot** (`Bot`): Экземпляр бота, с помощью которого будут обрабатываться события.
|
||||
* **host** (`str`, по умолчанию `'0.0.0.0'`): Хост, на котором запускается сервер.
|
||||
* **port** (`int`, по умолчанию `8080`): Порт, на котором будет доступен сервер.
|
||||
|
||||
### Поведение
|
||||
|
||||
* Создаёт FastAPI-приложение с обработчиком POST-запросов по адресу `'/'`.
|
||||
* В обработчике автоматически:
|
||||
|
||||
* Десериализует входящий запрос (`await request.json()`).
|
||||
* Преобразует событие в объект через `process_update_webhook`.
|
||||
* Передаёт событие в диспетчер (`await self.handle(event_object)`).
|
||||
* Возвращает `{ "ok": true }` при успехе.
|
||||
* Логирует ошибку при неудаче.
|
||||
* Запускает сервер с помощью метода `init_serve`.
|
||||
|
||||
### Пример использования
|
||||
|
||||
```python
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from maxapi import Bot, Dispatcher
|
||||
from maxapi.types import MessageCreated
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
bot = Bot('тут_ваш_токен')
|
||||
dp = Dispatcher()
|
||||
|
||||
|
||||
@dp.message_created()
|
||||
async def handle_message(event: MessageCreated):
|
||||
await event.message.answer('Бот работает через вебхук!')
|
||||
|
||||
|
||||
async def main():
|
||||
await dp.handle_webhook(bot)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
asyncio.run(main())
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dispatcher.init\_serve
|
||||
|
||||
```python
|
||||
async def init_serve(self, bot: Bot, host: str = '0.0.0.0', port: int = 8080, **kwargs)
|
||||
```
|
||||
|
||||
Низкоуровневая функция для запуска FastAPI-сервера с уже сконфигурированным приложением.
|
||||
|
||||
### Параметры
|
||||
|
||||
* **bot** (`Bot`): Экземпляр бота.
|
||||
* **host** (`str`, по умолчанию `'0.0.0.0'`): На каком адресе принимать входящие запросы.
|
||||
* **port** (`int`, по умолчанию `8080`): На каком порту будет работать сервер.
|
||||
* **kwargs**: Дополнительные параметры, передающиеся в конфиг сервера.
|
||||
|
||||
### Внутренняя логика
|
||||
|
||||
* Формирует объект конфигурации `Config` для сервера (`uvicorn`).
|
||||
* Создаёт сервер и запускает его методом `server.serve()`.
|
||||
* Перед запуском вызывает внутреннюю инициализацию диспетчера `await self.__ready(bot)`.
|
||||
|
||||
### Пример использования
|
||||
```python
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from fastapi import Request
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from maxapi import Bot, Dispatcher
|
||||
from maxapi.methods.types.getted_updates import process_update_webhook
|
||||
from maxapi.types import MessageCreated
|
||||
from maxapi.dispatcher import webhook_app
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
bot = Bot('тут_ваш_токен')
|
||||
dp = Dispatcher()
|
||||
|
||||
|
||||
@dp.message_created()
|
||||
async def handle_message(event: MessageCreated):
|
||||
await event.message.answer('Бот работает через вебхук!')
|
||||
|
||||
# Регистрация обработчика
|
||||
# для вебхука
|
||||
@webhook_app.post('/')
|
||||
async def _(request: Request):
|
||||
|
||||
# Сериализация полученного запроса
|
||||
event_json = await request.json()
|
||||
|
||||
# Десериализация полученного запроса
|
||||
# в pydantic
|
||||
event_object = await process_update_webhook(
|
||||
event_json=event_json,
|
||||
bot=bot
|
||||
)
|
||||
|
||||
# ...свой код
|
||||
print(f'Информация из вебхука: {event_json}')
|
||||
# ...свой код
|
||||
|
||||
# Окончательная обработка запроса
|
||||
await dp.handle(event_object)
|
||||
|
||||
# Ответ вебхука
|
||||
return JSONResponse(content={'ok': True}, status_code=200)
|
||||
|
||||
|
||||
async def main():
|
||||
|
||||
# Запуск сервера
|
||||
await dp.init_serve(bot, log_level='critical')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
asyncio.run(main())
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
## Какой способ выбрать?
|
||||
|
||||
* **handle\_webhook** — используйте, если вы хотите «всё из коробки» и не нужны дополнительные роуты или сложная кастомизация.
|
||||
* **init\_serve** — можно вызывать самостоятельно, если вы хотите вручную управлять жизненным циклом сервера.
|
||||
Reference in New Issue
Block a user