aiogram

Danger

This version still in development!

MIT License Supported python versions Telegram Bot API Tests PyPi Package Version PyPi status Downloads [Telegram] aiogram live Codecov

aiogram modern and fully asynchronous framework for Telegram Bot API written in Python 3.8 with asyncio and aiohttp.

It helps you to make your bots faster and simpler.

Danger

Breaking News:

aiogram 3.0 has breaking changes.

It breaks backwards compatibility by introducing new breaking changes!

Features

Warning

Before start using aiogram is highly recommend to know how to work with asyncio.

Also if you has questions you can go to our community chats in Telegram:

Simple usage

import logging
from typing import Any

from aiogram import Bot, Dispatcher, types
from aiogram.types import Message

TOKEN = "42:TOKEN"
dp = Dispatcher()

logger = logging.getLogger(__name__)


@dp.message(commands={"start"})
async def command_start_handler(message: Message) -> None:
    """
    This handler receive messages with `/start` command
    """
    # Most of event objects has an aliases for API methods to be called in event context
    # For example if you want to answer to incoming message you can use `message.answer(...)` alias
    # and the target chat will be passed to :ref:`aiogram.methods.send_message.SendMessage` method automatically
    # or call API method directly via Bot instance: `bot.send_message(chat_id=message.chat.id, ...)`
    await message.answer(f"Hello, <b>{message.from_user.full_name}!</b>")


@dp.message()
async def echo_handler(message: types.Message) -> Any:
    """
    Handler will forward received message back to the sender

    By default message handler will handle all message types (like text, photo, sticker and etc.)
    """
    try:
        # Send copy of the received message
        await message.send_copy(chat_id=message.chat.id)
    except TypeError:
        # But not all the types is supported to be copied so need to handle it
        await message.answer("Nice try!")


def main() -> None:
    # Initialize Bot instance with an default parse mode which will be passed to all API calls
    bot = Bot(TOKEN, parse_mode="HTML")
    # And the run events dispatching
    dp.run_polling(bot)


if __name__ == "__main__":
    main()