Compare commits

...

9 Commits

8 changed files with 119 additions and 19 deletions

View File

@@ -0,0 +1,23 @@
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())

View File

@@ -0,0 +1,55 @@
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())

View File

@@ -3,6 +3,8 @@ from __future__ import annotations
from datetime import datetime
from typing import Any, Dict, List, Optional, TYPE_CHECKING
from .types.input_media import InputMedia, InputMediaBuffer
from .connection.base import BaseConnection
from .enums.parse_mode import ParseMode
from .enums.sender_action import SenderAction
@@ -121,7 +123,7 @@ class Bot(BaseConnection):
chat_id: int = None,
user_id: int = None,
text: str = None,
attachments: List[Attachment] = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
link: NewMessageLink = None,
notify: Optional[bool] = None,
parse_mode: Optional[ParseMode] = None
@@ -177,7 +179,7 @@ class Bot(BaseConnection):
self,
message_id: str,
text: str = None,
attachments: List[Attachment] = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
link: NewMessageLink = None,
notify: Optional[bool] = None,
parse_mode: Optional[ParseMode] = None

View File

@@ -278,8 +278,6 @@ class Dispatcher:
:param host: Хост, на котором запускается сервер.
:param port: Порт сервера.
"""
await self.__ready(bot)
@webhook_app.post('/')
async def _(request: Request):
@@ -297,8 +295,26 @@ class Dispatcher:
except Exception as e:
logger_dp.error(f"Ошибка при обработке события: {event_json['update_type']}: {e}")
config = Config(app=webhook_app, host=host, port=port, log_level="critical")
await self.init_serve(
bot=bot,
host=host,
port=port
)
async def init_serve(self, bot: Bot, host: str = '0.0.0.0', port: int = 8080, **kwargs):
"""
Запускает сервер для обработки входящих вебхуков.
:param bot: Экземпляр бота.
:param host: Хост, на котором запускается сервер.
:param port: Порт сервера.
"""
config = Config(app=webhook_app, host=host, port=port, **kwargs)
server = Server(config)
await self.__ready(bot)
await server.serve()

View File

@@ -53,7 +53,7 @@ class Handler:
elif isinstance(arg, State):
self.state = arg
elif isinstance(arg, (Command, CommandStart)):
self.filters.insert(0, F.message.body.text.startswith(arg.command))
self.filters.insert(0, F.message.body.text.split()[0] == arg.command)
elif isinstance(arg, BaseMiddleware):
self.middlewares.append(arg)
else:

View File

@@ -1,3 +1,5 @@
from __future__ import annotations
from typing import List, TYPE_CHECKING, Optional
from .types.edited_message import EditedMessage
@@ -13,6 +15,7 @@ from ..connection.base import BaseConnection
if TYPE_CHECKING:
from ..bot import Bot
from ..types.input_media import InputMedia, InputMediaBuffer
class EditMessage(BaseConnection):
@@ -24,7 +27,7 @@ class EditMessage(BaseConnection):
bot (Bot): Экземпляр бота для выполнения запроса.
message_id (str): Идентификатор сообщения для редактирования.
text (str, optional): Новый текст сообщения.
attachments (List[Attachment], optional): Список вложений для сообщения.
attachments (List[Attachment | InputMedia | InputMediaBuffer], optional): Список вложений для сообщения.
link (NewMessageLink, optional): Связь с другим сообщением (ответ или пересылка).
notify (bool, optional): Отправлять ли уведомление о сообщении (по умолчанию True).
parse_mode (ParseMode, optional): Формат разметки текста (markdown, html и т.д.).
@@ -32,11 +35,11 @@ class EditMessage(BaseConnection):
def __init__(
self,
bot: 'Bot',
bot: Bot,
message_id: str,
text: str = None,
attachments: List['Attachment'] = None,
link: 'NewMessageLink' = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
link: NewMessageLink = None,
notify: bool = True,
parse_mode: Optional[ParseMode] = None
):

View File

@@ -23,6 +23,7 @@ from .users import User
if TYPE_CHECKING:
from ..bot import Bot
from ..types.input_media import InputMedia, InputMediaBuffer
class MarkupElement(BaseModel):
@@ -174,7 +175,7 @@ class Message(BaseModel):
async def answer(
self,
text: str = None,
attachments: List[Attachment] = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
link: NewMessageLink = None,
notify: Optional[bool] = None,
parse_mode: Optional[ParseMode] = None
@@ -185,7 +186,7 @@ class Message(BaseModel):
Args:
text (str, optional): Текст ответа. Может быть None.
attachments (List[Attachment], optional): Список вложений. Может быть None.
attachments (List[Attachment | InputMedia | InputMediaBuffer], optional): Список вложений. Может быть None.
link (NewMessageLink, optional): Связь с другим сообщением. Может быть None.
notify (bool): Флаг отправки уведомления. По умолчанию True.
parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
@@ -207,7 +208,7 @@ class Message(BaseModel):
async def reply(
self,
text: str = None,
attachments: List[Attachment] = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
notify: Optional[bool] = None,
parse_mode: Optional[ParseMode] = None
):
@@ -217,7 +218,7 @@ class Message(BaseModel):
Args:
text (str, optional): Текст ответа. Может быть None.
attachments (List[Attachment], optional): Список вложений. Может быть None.
attachments (List[Attachment | InputMedia | InputMediaBuffer], optional): Список вложений. Может быть None.
notify (bool): Флаг отправки уведомления. По умолчанию True.
parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
@@ -242,7 +243,7 @@ class Message(BaseModel):
self,
chat_id,
user_id: int = None,
attachments: List[Attachment] = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
notify: Optional[bool] = None,
parse_mode: Optional[ParseMode] = None
):
@@ -253,7 +254,7 @@ class Message(BaseModel):
Args:
chat_id (int): ID чата для отправки (обязателен, если не указан user_id)
user_id (int): ID пользователя для отправки (обязателен, если не указан chat_id). По умолчанию None
attachments (List[Attachment], optional): Список вложений. Может быть None.
attachments (List[Attachment | InputMedia | InputMediaBuffer], optional): Список вложений. Может быть None.
notify (bool): Флаг отправки уведомления. По умолчанию True.
parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
@@ -276,7 +277,7 @@ class Message(BaseModel):
async def edit(
self,
text: str = None,
attachments: List[Attachment] = None,
attachments: List[Attachment | InputMedia | InputMediaBuffer] = None,
link: NewMessageLink = None,
notify: bool = True,
parse_mode: Optional[ParseMode] = None
@@ -287,7 +288,7 @@ class Message(BaseModel):
Args:
text (str, optional): Новый текст сообщения. Может быть None.
attachments (List[Attachment], optional): Новые вложения. Может быть None.
attachments (List[Attachment | InputMedia | InputMediaBuffer], optional): Новые вложения. Может быть None.
link (NewMessageLink, optional): Новая связь с сообщением. Может быть None.
notify (bool): Флаг отправки уведомления. По умолчанию True.
parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.

View File

@@ -1,6 +1,6 @@
[project]
name = "maxapi"
version = "0.8.9"
version = "0.9.0"
description = "Библиотека для разработки чат-ботов с помощью API мессенджера MAX"
readme = "README.md"
requires-python = ">=3.10"