Overrated
Опытный user
- Регистрация
- 10 Мар 2022
- Сообщения
- 751
- Реакции
- 81

Aiogram для чайников
Урок #1 Начало, эхо-бот
Итак, сегодня я научу вас писать ботов для телеграма с помощью python используя библиотеку aiogram.
Главное преимущество aiogram'a перед другими библиотека для написания ботов(telebot и тд.) это асинхронность.
Асинхронная библиотека позволяет обрабатывать большое количество одновременных соединений. Именно поэтому при 1000+ пользователях наш бот не будет крашиться.
Ну что ж, приступим
Начнем с установки библиотек на наш пк(или же виртуальное окружение)
pip install aiogram
pip install asyncio
Asyncio предназначен для упрощения использования корутин и футур в асинхронном коде.Он нам сейчас не пригодиться, но на будущие - установим
Импортируем в код все - что нам нужно:
Код Python:
#База для создания бота
import aiogram
import asyncio
from aiogram import Bot, Dispatcher, executor, types
#Кнопки
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
Так, а теперь по порядку:
Bot - это сам бот
Dispatcher - позволяет боту принимать события(сообщения, команды и тд)
Executor - Запускает наш бот
Types - Позволяет добавлять кнопки, и тд.
Из types мы достали только "Reply" кнопки, так же существуют и Inline кнопки, приведу пример, так будет легче
разъяснить
Reply кнопки:

Inline кнопки:

Что бы импортировать inline кнопки:
Код Python:
from aiogram.types import KeyboardButton, InlineKeyboardMarkup
Что бы запустить самого бота нам для начала нужен его токен. Токен
можно взять от бота BotFather при создании бота. Тут разъяснять не буду, есть миллионы 1-минутных гайдов.
Итак, я скопировал токен. Я буду его импортировать из отдельного файла
Что находиться в файле config.py:
bot_token = '5649036411:AAFNBuAfnG_uT0VLiZuPlYQh744v7rMF710'
Импорт переменной из стороннего файла:
from config import *
config - имя файла(без .py)
Звездочка(*) - значит импорт всего из файла(функции, переменные и тд.)
Если вам нужно импортировать что-то конкретное - просто вместо * поставьте имя переменной, функции и тд
Время написать оболочку, так называемою базу для бота:
Код Python:
bot = Bot(bot_token)
dp = Dispatcher(bot)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates = True)
bot_token - токен, который мы прежде импортировали
bot - это название, оно видно только кодеру, и можете ставить туда все, что угодно, но все же "bot" это стандарт
dp - это название для диспетчера, "dp" - это тоже стандарт
executor.start_polling - запускает бота, дальше идет название диспетчера
skip_updates = True - позволяет пропускать все сообщения, которые были написаны до старта бота. То есть если наспамить что-либо, а после запустить бота, он не отреагирует на все эти сообщения.
Итак, мы создали пустышку, теперь давайте добавим что-нибудь.
Начнем с эхо-бота:
Код Python:
@dp.message_handler() #Принимает событие - сообщение от юзера
async def anymessage(soobchenie: types.Message): #Создаем функцию реакции на сообщение
await bot.send_message(soobchenie.from_user.id, soobchenie.text) # отправляем сообщение
soobchenie - это переменная в которую мы принимаем сообщение, там можно было написать все что угодно
message.from_user.id - это то, куда мы отправляем сообщение, а точнее обратно к юзеру
Все отлично работает. Теперь добавим реакцию на команду "/start"
Код Python:
@dp.message_handler(commands=['start']) # Реакция на событие - команда /start
async def command_start(message: types.Message): ##Создаем функцию реакции на сообщение
await bot.send_message(message.from_user.id, "Привет! Я эхо-бот, отправь мне сообщение") #отправляем сообщение
Вот только ставить функцию реакции на /start желательно первым(выше всего остального)
commands=['start'] Как раз таки определяет нашу команду, туда можно ставить не только 'start'
Вот так выглядит наш конечный код на сегодня:
Код Python:
#База для создания бота
import aiogram
import asyncio
from aiogram import Bot, Dispatcher, executor, types
#Кнопки
from config import *
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
bot = Bot(bot_token)
dp = Dispatcher(bot)
@dp.message_handler(commands=['start']) # Реакция на событие - команда /start
async def command_start(message: types.Message): ##Создаем функцию реакции на сообщение
await bot.send_message(message.from_user.id, "Привет! Я эхо-бот, отправь мне сообщение") #отправляем сообщение
@dp.message_handler() #Принимает событие - сообщение от юзера
async def anymessage(soobchenie: types.Message): #Создаем функцию реакции на сообщение
await bot.send_message(soobchenie.from_user.id, soobchenie.text) # отправляем сообщение
if __name__ == '__main__':
executor.start_polling(dp, skip_updates = True)
Итак, на этом первый урок заканчивается. Кому не сложно - поддержите. Если что-то не поняли - жду вас у себя в лс. Всем хорошего дня
