Compare commits
9 Commits
85e4c086d4
...
52d69904c6
| Author | SHA1 | Date | |
|---|---|---|---|
| 52d69904c6 | |||
| 7e9163adc9 | |||
| 6a0406f476 | |||
| 9241917bb1 | |||
| 0354fbc5fd | |||
| f600decf2b | |||
| dd6c8ff9ea | |||
| c844d2b2e6 | |||
| 7336b2ebb9 |
23
examples/webhook/high_level.py
Normal file
23
examples/webhook/high_level.py
Normal 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())
|
||||
55
examples/webhook/low_level.py
Normal file
55
examples/webhook/low_level.py
Normal 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())
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
):
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user