Telegram python bots with aiogram
aiogram
Is a pretty simple and fully asynchronous framework for Telegram Bot API written in Python 3.7 with [asyncio] and [aiohttp].
pip install -U aiogram
"""
This is a echo bot.
It echoes any incoming text messages.
"""
import logging
from aiogram import Bot, Dispatcher, executor, types
# Then you have to initialize bot and dispatcher instances.
# Bot token you can get from @BotFather
API_TOKEN = 'BOT TOKEN HERE'
# Configure logging
logging.basicConfig(level=logging.INFO)
# Initialize bot and dispatcher
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# interaction with bots starts with one command.
# Register your first command handler
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):
"""
This handler will be called when user sends `/start` or `/help` command
"""
await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.")
# If you want to handle all text messages in
# the chat simply add handler without filters
@dp.message_handler()
async def echo(message: types.Message):
# old style:
# await bot.send_message(message.chat.id, message.text)
await message.answer(message.text)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
АПИ реализуется с помощью классов Botи Dispatcher. Bot реализует [aiohttp] сервер и связку с api telegram. Dispatcher обрабатывает входящие обновления: сообщения, отредактированные сообщения, сообщения канала, отредактированные сообщения канала, встроенные запросы, выбранные встроенные результаты, запросы колбеков, запросы на доставку, запросы пречекаута. execitor это хелпер для запуска бота в разных режимах, к примеру ниже в long-polling mode.
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
@dp.message_handler(regexp='(^cat[s]?$|puss)')
async def cats(message: types.Message):
with open('data/cats.jpg', 'rb') as photo:
'''
# Old fashioned way:
await bot.send_photo(
message.chat.id,
photo,
caption='Cats are here 😺',
reply_to_message_id=message.message_id,
)
'''
await message.reply_photo(photo, caption='Cats are here 😺')
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Подробнее:
Bot class
Методы:
download_file_by_idСкачать файл по file_id в целевой файл или каталогget_updatesполучать входящие обновления с помощью long pollingset_webhookИспользуйте этот метод, чтобы указать URL-адрес и получать входящие обновления через исходящий вебхук. Всякий раз, когда для бота появляется обновление, мы отправляем HTTPS-запрос POST на указанный URL-адрес, содержащий сериализованное обновление JSON. В случае неудачного запроса мы откажемся после разумного количества попыток. ВозвращаетTrueв случае успеха.delete_webhookудалить интеграцию с вебхукомget_webhook_infoget_mesimple method for testing your bot’s auth tokenlog_outИспользуйте этот метод для логаута от сервера API перед локальным запуском бота. Вы должны выйти, прежде чем запускать локально, иначе нет гарантии, что бот будет получать обновления. После успешного звонка вы не сможете снова войти в систему с тем же токеном в течение 10 минут. ВозвращаетTrueв случае успеха.close_botИспользуйте этот метод, чтобы закрыть экземпляр бота перед его перемещением с одного локального сервера на другой. Вам необходимо удалить вебхук перед вызовом этого метода, чтобы гарантировать, что бот не запустится снова после перезапуска сервера. Метод вернет ошибку 429 в первые 10 минут после запуска бота. Возвращает True в случае успехаsend_messageдля текстовых сообщенийforward_messagecopy_messagesend_photosend_audiosend_documentsend_videosend_animationsend_voicesend_video_notesend_media_groupsend_location- many send methods and chat_methods
Dispatcher class
Методы:
skip_updatesВы можете пропустить старые входящие обновления из очереди. Этот метод не рекомендуется использовать на продеprocess_updatesОбработать список обновленийprocess_updatereset_webhookstart_pollingстарт long-pollingstop_pollingwait_closedдождаться завершения long poolingis_pollingmessage_handlerдекоратор для обработки сообщений
# Simple commands handler
@dp.message_handler(commands=['start', 'welcome', 'about'])
async def cmd_handler(message: types.Message):
...
# Filter messages by regular expression
@dp.message_handler(regexp='^[a-z]+-[0-9]+')
async def msg_handler(message: types.Message):
...
# Filter messages by command regular expression
@dp.message_handler(filters.RegexpCommandsFilter(regexp_commands=['item_([0-9]*)']))
async def send_welcome(message: types.Message):
...
# Filter by content type
@dp.message_handler(content_types=ContentType.PHOTO | ContentType.DOCUMENT)
async def audio_handler(message: types.Message):
...
# Filter by custom function
@dp.message_handler(lambda message: message.text and 'hello' in message.text.lower())
async def text_handler(message: types.Message):
...
# Use multiple filters
@dp.message_handler(commands=['command'], content_types=ContentType.TEXT)
async def text_handler(message: types.Message):
...
# Register multiple filters set for one handler
@dp.message_handler(commands=['command'])
@dp.message_handler(lambda message: demojize(message.text) == ':new_moon_with_face:')
async def text_handler(message: types.Message):
...
register_edited_message_handlerзарегистрировать обработчик для редактируемого сообщенияedited_message_handlerдекоратор- and ome register and decorator method for many types of messages
current_stateПолучить текущее состояние пользователя в чате в качестве контекстаthrottlecheck_keyПолучить информацию о ключе в бакетеrelease_keyвыпустить залоченный ключasync_taskдекоратор, который выполняет хендлер как асинхронный таск. Это надо использовать для медленных хендлеров с таймоутом.throttledbind_filter,unbind_filtersetup_middleware
Aiogram 3.x
Начиная с 3.x интерфейс aiogram полностью поменялся.
- подробный гайд по новому интерфейсу
- docs
- aiogram_dialog is a framework for developing interactive messages and menus in your telegram bot like a normal GUI application. docs
- magic-filterfro aiogram provides magic filter based on dynamic attribute getter
- конечные автоматы
Смотри еще:
- примеры с aiogram
- Aiogram starts and stops polling with TimeoutError
- Пишем Telegram-ботов с aiogram 3.x неплохое и подробное руководство
- [aiogram-dialog] библиотека
- [telegram-bots] библиотека
- [python-telegram-bot] библиотека
- [aiohttp]
- [asyncio]