Ошибка отправки самого простого сообщения в 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 шт):
Решил проблему так:
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 /
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.
Пример из документации
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())