Как отправить сообщение в aiogram используя произвольную функцию без handler и имея доступ к уже существующему боту?

Каким образом можно использовать существующий объект Bot при вызове функции send_msg_without_handler(msg), чтобы отправить и после редактировать сообщение, без необходимости создания нового объекта?
  • 15 февраля 2024 г. 7:18
Ответы на вопрос 2
В aiogram можно отправить сообщение без использования хэндлера (то есть без определения функции, вызываемой при определенном событии) в следующем формате:

```python
from aiogram import types

async def send_msg_without_handler(bot, chat_id, text):
    await bot.send_message(chat_id=chat_id, text=text)
```

Здесь `bot` - это объект, представляющий вашего бота, который имеет доступ к API Telegram. Вы можете передать этот объект в функцию `send_msg_without_handler` как параметр при ее вызове.

```python
from aiogram import Bot

# Создаем объект бота
bot = Bot(token="YOUR_TOKEN")

# Вызываем функцию и передаем объект бота в качестве параметра
await send_msg_without_handler(bot, chat_id, text)
```

Если вы хотите после отправки сообщения иметь возможность его отредактировать, вы можете использовать метод `send_message` с параметром `reply_markup`. Затем используйте метод `edit_text` для редактирования сообщения:

```python
async def send_msg_without_handler(bot, chat_id, text):
    message = await bot.send_message(chat_id=chat_id, text=text)
    
    # Предположим, что вы хотите отредактировать сообщение через 5 секунд
    await asyncio.sleep(5)
    
    # Редактируем сообщение
    await bot.edit_message_text(chat_id=chat_id, message_id=message.message_id, text="Новый текст сообщения")
```

Внимание! Для использования `asyncio.sleep()` вам нужно импортировать модуль asyncio:

```python
import asyncio
```

Обратите внимание, что редактирование сообщения возможно только в течение 48 часов после его отправки.
Очевидно, хранить существующего бота где-то. Или в глобальной переменной, или переделать функцию в метод класса и хранить ссылку на бота в поле класса. Главное, чтобы эта ссылка была в поле видимости твоего кода. 

Но я бы заметил, что слишком частое редактирование сообщения - не лучшая идея. Я бы разбил процесс на две части - обработчик обновлений от OpenAI складывает в какой-то буфер полученные части текста, а бот время от времени проверяет буфер и дописывает всё, что там лежит, в сообщение.
Похожие вопросы