Ошибка отправки самого простого сообщения в aiogram

Мне нужно чтобы сообщения с онлайн чата на моём сайте пересылались мне в телеграм, а мои сообщения в телеграме - в этот онлайн чат. Для этого я создал бота. Проблема с отправкой сообщений в aiogram. Как мне отправить сообщение от бота самому себе? До этого я работал с telebot, там была такая возможность. Можно было создать бота, написать ему что-то и узнать id чата. Далее отправлять сообщения по id чата. В Aiogram же прежде чем что-то отправить нужно получить сообщение (это навязывается во всех примерах в официальной документации). Нашёл метод send_message в документации, пытаюсь его использовать но ничего не выходит.

Для тех кому лень читать начинать отсюда:

Код из официальной документации:

# Так же сказано, что этот метод принимает 2 обязательных аргумента:
# первый - id чата, второй - текст сообщения
result: Message = await bot.send_message(...)

Мой код:

from aiogram import Bot
import asyncio


token = '...'
bot = Bot(token=token)


async def send(text):
    await bot.send_message(915422005, text)


if __name__ == '__main__':
    asyncio.run(send('Привет!'))

Получаю такую ошибку:

Traceback (most recent call last):
  File "bot.py", line 14, in <module>
    asyncio.run(send('Привет!'))
  File "/usr/lib/python3.8/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 608, in run_until_complete
    return future.result()
  File "bot.py", line 10, in send
    await bot.send_message(915422005, text)
  File "/home/dima/.local/lib/python3.8/site-packages/aiogram/bot/bot.py", line 219, in send_message
    result = await self.request(api.Methods.SEND_MESSAGE, payload)
  File "/home/dima/.local/lib/python3.8/site-packages/aiogram/bot/base.py", line 201, in request
    return await api.make_request(self.session, self.__token, method, data, files,
  File "/home/dima/.local/lib/python3.8/site-packages/aiogram/bot/api.py", line 103, in make_request
    async with session.post(url, data=req, **kwargs) as response:
  File "/home/dima/.local/lib/python3.8/site-packages/aiohttp/client.py", line 1012, in __aenter__
    self._resp = await self._coro
  File "/home/dima/.local/lib/python3.8/site-packages/aiohttp/client.py", line 426, in _request
    with timer:
  File "/home/dima/.local/lib/python3.8/site-packages/aiohttp/helpers.py", line 579, in __enter__
    raise RuntimeError('Timeout context manager should be used '
RuntimeError: Timeout context manager should be used inside a task
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f3e5631c460>

Что я делаю не так?


Ответы (3 шт):

Автор решения: Inventor

Решил проблему так:

pip3 uninstall aiogram
pip3 install aiohttp

Написал свою библиотеку

Aiogram самая худшая библиотека, которая только может быть. Невозможно отправить обычное сообщение. На ней только эхо бота писать.

Моя история знакомства с aiogram:

Я: Хочу унать как отправить обычное сообщение

Документация: Инструкция как установить webhook

Я: Мне нужно просто отправить сообщение

Документация: Aiogram очень удобен, здесь можно отслеживать типы сообщений и писать красивый код

Я: Но я хочу просто отправить сообщение...

Документация: Сделать миграцию с версии 1.4 до 2.0?

Я: Пожалуйста дай мне отправить обычное сообщение...

Документация: Low level api?

Я: У меня есть id чата. Я хочу указать id чата и отправить сообщение

Документация: Telegram data types?

Я: В документации есть класс Dispatcher который отправляет сообщения во всех примерах, там показывается много методов этого класса. Можно мне прочитать документацию о этих методах и их аргументах?

Документация: Купить электрошашлычницу онлайн?

Я: Пишу в гугл свою проблему..

Гугл: Смотри, я нашёл скрытую страницу в документации с методом send_message, на эту страницу невозможно попасть со страницы навигации, кажется это то, что тебе нужно

Я: Класс!! Спасибо, бро, это я и искал! Использую этот метод

Aiogram: raise Exception(syntax error! You idiot!)

Я: sudo rm --no-preserve-root -rf /

→ Ссылка
Автор решения: Oleg

RuntimeError: Timeout context manager should be used inside a task

Вы создали бота в другом контексте.

asyncio.run() создаёт новую цепочку событий, а при создании объекта bot была присвоена другая цепочка. Это и вызвало ошибку.

Для вас было бы решением помещение создания бота в существующий контекст:

...

async def main():
    bot = Bot(token=token)
    send('Привет!')

async def send(text):
    await bot.send_message(915422005, text)


if __name__ == '__main__':
    asyncio.run(main())

На данный момент даже в вашем варианте код будет работать после установки последней версии aiogram.

В следующий раз перед созданием собственной библиотеки попробуйте поискать возникшую ошибку в Stack overflow.

→ Ссылка
Автор решения: Andrey

Пример из документации

from aiogram.utils import executor
from aiogram import Bot, Dispatcher

API_TOKEN = 'BOT TOKEN HERE'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

async def somefunc():
    await bot.send_message(123456, "Привет")

if __name__ == '__main__':
    executor.start(dp, somefunc())
→ Ссылка