Всех приветствую, дорогие читатели!
В этом уроке я расскажу про написание телеграм ботов на AioGram и про свой опыт работы с ним.
Все что тут происходит подразумевает то, что вы на нормальном уровне знаете Python.
Бибилиотека AioGram работает со всеми версиями питона не ниже 3.8, уcтанавливается следущей командой:
Linux:
Windows:
Структура проектов
Структура проектов - важная часть написания телеграм бота.
Что же такое структура бота простыми словами? Это разбитие кода на несколько файлов/папок с файлами.
Для чего разбивают код на несколько файлов? Для более читабильного кода, что бы когда проект разрастется до болших размеров не нужно было искать что либо в одном файле, да и просто это более эстетично.
В данном случаем Нам хватит следущей стрктуры:
Первый бот. Мини менеджер.
Сейчас сделаем первого бота, он будет выдавать контактную информацию.
Создаем в папке/дериктории/каталоге файлы main.py, config.py и keyboards.py
Импортируем сам AioGram и дополнительные методы и классы из него, я никогда в жизни не запоминал все импорты, я просто один раз записал их и копирую в каждый новый проект, но пока что мы импортруем только основу и файлы с клавиатурой и конфигурацией:
Файл с клавиатурой пока что будет пустовать, позже мы его заполним, сейчас мы заполним файл config.py:
Далее Нам нужно авторизовать бота, сдлеать две переменные для дальнейшим взаимодейстивем с ботом:
Переменная bot отвечает за некую авторизацию, а переменная dp (сокращение dispatcher) нам понадобится для обработки событий.
Что такое событие? Это все, что происходит с ботом. Например, пользователь отправил боту команду - событие, пользователь отправил маедиафайл - событие, пользователь нажал на какую либо кнопку - событие.
Сейчас сделаем обработку команды start, этот обработчик должен быть в любом случае, т.к пользователь при взаимодействии с ботов всегда первый раз вводит команду start.
Разберем построчно:
@dp.message_handler(commands='start') это декоратор, в данном случае message_handler обрабатывает пришедшее сообщение /start, кто то может задасться вопрос, а при чем тут сообщение если мы вообще работает с командой /start? Я отвечу, бот воспринимает все, что приходит ему в виде текста в ЛС как сообщение, любой текст, будь то любая комнада, например, /start /help /contact и т.д, или обычный текст по типу "Привет", "Пока", "Бот лох" и т.д, а еще могут быть обычные кнопки, которые снизу под вводом текста обычно есть (в этом уроке мы сделаем их), по факту такие кнопки - обычный текст-шаблон для пользователя в виде кнопок.
Но вернемся к команде /start, что бы обозначить, что мы работаем именно с командой /start а не с командой /help в message_handler мы передаем аргумент commands='start', это значит, что декоратор @dp.message_handler(commands='start') будет обрабатывать только команду /start и никакую больше! Так же message_handler() имеет и другие аргументы, но их мы рассмотрим в следующих статьях.
async def start(message: types.Message) - функция, которая принимает тип сообщения types.Message, а слово message перед types.Message говоря простыми словами даст нам взаимодейстоввать с пришедшим сообщением, и сейчас вы поймете что я имею ввиду. Так же хочу сказать что название функции может быть любым, т.е может быть:
Эта строчка нужна для отправки сообщения, рассмотрим эту строчку поподробнее.
await используется по тому, что после него идет асинхронная функция.
Ну вот нам и понадобилась перменная bot, к ней мы будет обращаться что бы отправить что либо пользователю)
Сама функция send_message нужна для отправки сообщения, а именно какого либо текста, что бы отправить, напрмиер, фото, нужна будет уже другая функция.
Теперь нам нужно сделать так, что бы бот работал постоянно, для этого в конце кода мы пишем следущее:
executor.start_polling(dp, skip_updates=True) - нужен что бы бот работал постоянно и не оффался.
Клавиатура
Есть два вида так называемой клавиатры, InlineKeyboard (та что под сообщением) и ReplyMarkup (та что под вводом текста). Если с ReplyMarkup все будет понятно и просто, то с инлайн клавиатурой можно творить чудеса! В дальнейших уроках я покажу Вам на что способна инлайн клавиатура.
Разберем построчно.
Первая строка, как не сложно догадаться отвечает за импорт всех видов клавиатур из аиограма, тут особо заострять внимание не будет, просто скрпировали + вставили
user_menu = ReplyKeyboardMarkup(resize_keyboard=True) тут уже интереснее, здесь мы создаем переменную, в которой создаем саму клавиатуру ReplyKeyboardMarkup, инициализируем ее, в ее агрументах есть resize_keyboard=True, этот параметр отвечает за нормальны размер клавиатуры, что бы она не была огромная.
А вот дальше уже идет добавление кнопок в клавиатуру.
user_menu.row(KeyboardButton('Контактная информация')) тут KeyboardButton как раз отвечает за создание самой кнопки, а .row - добавление кнопки, т.к если сказать простым языком мы через .row добавляем в клавиатуру user_menu кнопку KeyboardButton с текстом 'Контактная информация', здесь вроде тоже ничего сложного, идем дальше.
Добавление клавиатуры в самого бота. Тут это работает таким образом, что клавиатура не возникает из воздуха, а она отправляется в месте с сообщением.
Идем в main.py в строчку с отправлением сообщения (12 строчка) и добавляем новый параметр reply_markup, которому присваиваем нужную клавиатуру. В самом начале мы ее импортировали, значит проблем возникнуть не должно.
Все просто, добавили новый параметр - клавиатуру, тут думаю объяснения не нужны.
Переходим в бота и пишем ему комнаду /start
Отлично! Кнопки на месте, это радует, но они не работаю, по тому что мы не задали им никаких функций) Давайте сделаем это, для этого нам понадобится сделать два декоратора для обработки текста из кнопок. Как работает обработка сообщений вы уже знаете, но теперь мы будет обрабатывать не commands='start' а text, смотрим код:
Видим, у нас появились новые обработчики, все точно так же как с командой старт, только в место параметра commands у нас параметр text и в место 'start' текст нужной нам клавиатуры. Тут думаю тоже проблем ни у кого не возникнет, а если же возникли пишите в комментариях)
Хорошо, а где контактная информация то? Для нее мы сделаем Inline клавиатуру, она создается почти так же как и replykeyboard
Создаем inline клавиатуру:
Разберем инлайн клвиатуру, с ней уже поинтереснее.
Схоже с первой клавиатурой, но тут по мимо текста кнопки мы указываем еще и то, куда будет вести эта кнопка, в данном случае это вымышленные страницы ВК, но в место url там может быть кое что другое, позже мы с этим 'кое чем' познакомимся.
Что бы получилось две кнопки в ряд мы просто содаем их через запятую.
Отлично, с инлайн клавиатурой мы по быстрому разобрались, теперь давайте отправим ее пользователю:
На этом урок подошел к концу, спасибо тем, кто дочитал до конца. Это моя статья взятая с зеленого форума, т.к на эксплоите я новичок хочу услышать мнение о том, как тут относяться к подобного рода статьям? Жду фидбека, еще раз всем спасибо.
main.py весь код:
keyboards.py:
автор @multicoder
источник exploit.in
В этом уроке я расскажу про написание телеграм ботов на AioGram и про свой опыт работы с ним.
Все что тут происходит подразумевает то, что вы на нормальном уровне знаете Python.
Бибилиотека AioGram работает со всеми версиями питона не ниже 3.8, уcтанавливается следущей командой:
Linux:
Код:
pip3 install aiogram
Код:
pip install aiogram
Структура проектов
Структура проектов - важная часть написания телеграм бота.
Что же такое структура бота простыми словами? Это разбитие кода на несколько файлов/папок с файлами.
Для чего разбивают код на несколько файлов? Для более читабильного кода, что бы когда проект разрастется до болших размеров не нужно было искать что либо в одном файле, да и просто это более эстетично.
В данном случаем Нам хватит следущей стрктуры:
- main.py
- config.py
- keyboard.py
Первый бот. Мини менеджер.
Сейчас сделаем первого бота, он будет выдавать контактную информацию.
Создаем в папке/дериктории/каталоге файлы main.py, config.py и keyboards.py
Импортируем сам AioGram и дополнительные методы и классы из него, я никогда в жизни не запоминал все импорты, я просто один раз записал их и копирую в каждый новый проект, но пока что мы импортруем только основу и файлы с клавиатурой и конфигурацией:
Python:
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
Python:
token = 'тут токен от бота, брать у @BotFather'
Код:
#main.py
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
Что такое событие? Это все, что происходит с ботом. Например, пользователь отправил боту команду - событие, пользователь отправил маедиафайл - событие, пользователь нажал на какую либо кнопку - событие.
Сейчас сделаем обработку команды start, этот обработчик должен быть в любом случае, т.к пользователь при взаимодействии с ботов всегда первый раз вводит команду start.
Python:
#main.py
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
@dp.message_handler(commands='start')
async def start(message: types.Message):
await bot.send_message(message.from_user.id, 'Доброго времени суток, какую контактуню информацию ты хочешь получить?')
@dp.message_handler(commands='start') это декоратор, в данном случае message_handler обрабатывает пришедшее сообщение /start, кто то может задасться вопрос, а при чем тут сообщение если мы вообще работает с командой /start? Я отвечу, бот воспринимает все, что приходит ему в виде текста в ЛС как сообщение, любой текст, будь то любая комнада, например, /start /help /contact и т.д, или обычный текст по типу "Привет", "Пока", "Бот лох" и т.д, а еще могут быть обычные кнопки, которые снизу под вводом текста обычно есть (в этом уроке мы сделаем их), по факту такие кнопки - обычный текст-шаблон для пользователя в виде кнопок.
Но вернемся к команде /start, что бы обозначить, что мы работаем именно с командой /start а не с командой /help в message_handler мы передаем аргумент commands='start', это значит, что декоратор @dp.message_handler(commands='start') будет обрабатывать только команду /start и никакую больше! Так же message_handler() имеет и другие аргументы, но их мы рассмотрим в следующих статьях.
async def start(message: types.Message) - функция, которая принимает тип сообщения types.Message, а слово message перед types.Message говоря простыми словами даст нам взаимодейстоввать с пришедшим сообщением, и сейчас вы поймете что я имею ввиду. Так же хочу сказать что название функции может быть любым, т.е может быть:
- async def admin(message: types.Message)
- async def call_func(callback: types.CallbackQuery)
- async def hi_handler(message: types.Message)
- async def kak_ugodno_mojno_nazvat(message: types.Message)
Код:
await bot.send_message(message.from_user.id, 'Доброго времени суток, какую контактуню информацию ты хочешь получить?')
await используется по тому, что после него идет асинхронная функция.
Ну вот нам и понадобилась перменная bot, к ней мы будет обращаться что бы отправить что либо пользователю)
Сама функция send_message нужна для отправки сообщения, а именно какого либо текста, что бы отправить, напрмиер, фото, нужна будет уже другая функция.
message.from_user.id - это самый обычный id юзера, но не стоит забывать что id вещь достаточно мощнаяя, с ее помощью в дальнейшем мы будет идентифицировать пользовтеля в боте, но пока что не берите это в голову. ID используется для того, что бы бот знал, какому пользователю отправить сообщение. Следущим агрументом идет сам текст, который мы будем отправлять пользователю, у меня это "Доброго времени суток, какую контактуню информацию ты хочешь получить?", там может быть все что душе угодно, любой текст который вы придумаете.Теперь нам нужно сделать так, что бы бот работал постоянно, для этого в конце кода мы пишем следущее:
Python:
#main.py
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
@dp.message_handler(commands='start')
async def start(message: types.Message):
await bot.send_message(message.from_user.id, text='Доброго времени суток, какую контактуню информацию ты хочешь получить?')
executor.start_polling(dp, skip_updates=True)
Клавиатура
Есть два вида так называемой клавиатры, InlineKeyboard (та что под сообщением) и ReplyMarkup (та что под вводом текста). Если с ReplyMarkup все будет понятно и просто, то с инлайн клавиатурой можно творить чудеса! В дальнейших уроках я покажу Вам на что способна инлайн клавиатура.
Python:
#keyboards.py
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
user_menu = ReplyKeyboardMarkup(resize_keyboard=True)
user_menu.row(KeyboardButton('Контактная информация'))
user_menu.row(KeyboardButton('Новости'))
Первая строка, как не сложно догадаться отвечает за импорт всех видов клавиатур из аиограма, тут особо заострять внимание не будет, просто скрпировали + вставили
user_menu = ReplyKeyboardMarkup(resize_keyboard=True) тут уже интереснее, здесь мы создаем переменную, в которой создаем саму клавиатуру ReplyKeyboardMarkup, инициализируем ее, в ее агрументах есть resize_keyboard=True, этот параметр отвечает за нормальны размер клавиатуры, что бы она не была огромная.
А вот дальше уже идет добавление кнопок в клавиатуру.
user_menu.row(KeyboardButton('Контактная информация')) тут KeyboardButton как раз отвечает за создание самой кнопки, а .row - добавление кнопки, т.к если сказать простым языком мы через .row добавляем в клавиатуру user_menu кнопку KeyboardButton с текстом 'Контактная информация', здесь вроде тоже ничего сложного, идем дальше.
Добавление клавиатуры в самого бота. Тут это работает таким образом, что клавиатура не возникает из воздуха, а она отправляется в месте с сообщением.
Идем в main.py в строчку с отправлением сообщения (12 строчка) и добавляем новый параметр reply_markup, которому присваиваем нужную клавиатуру. В самом начале мы ее импортировали, значит проблем возникнуть не должно.
Python:
#main.py
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
@dp.message_handler(commands='start')
async def start(message: types.Message):
await bot.send_message(message.from_user.id, text='Доброго времени суток, какую контактуню информацию ты хочешь получить?', reply_markup=kb.user_menu)
executor.start_polling(dp, skip_updates=True)
Переходим в бота и пишем ему комнаду /start
Отлично! Кнопки на месте, это радует, но они не работаю, по тому что мы не задали им никаких функций) Давайте сделаем это, для этого нам понадобится сделать два декоратора для обработки текста из кнопок. Как работает обработка сообщений вы уже знаете, но теперь мы будет обрабатывать не commands='start' а text, смотрим код:
Python:
#main.py
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
@dp.message_handler(commands='start')
async def start(message: types.Message):
await bot.send_message(message.from_user.id, text='Доброго времени суток, какую контактуню информацию ты хочешь получить?', reply_markup=kb.user_menu)
@dp.message_handler(text='Контактная информация')
async def contact(message: types.Message):
await bot.send_message(message.from_user.id, text='Контактная Инфа ')
@dp.message_handler(text='Новости')
async def news(message: types.Message):
await bot.send_message(message.from_user.id, text='Тут какие то новости')
executor.start_polling(dp, skip_updates=True)
Хорошо, а где контактная информация то? Для нее мы сделаем Inline клавиатуру, она создается почти так же как и replykeyboard
Создаем inline клавиатуру:
Python:
#keyboards.py
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
user_menu = ReplyKeyboardMarkup(resize_keyboard=True)
user_menu.row(KeyboardButton('Контактная информация'))
user_menu.row(KeyboardButton('Новости'))
contact_info = InlineKeyboardMarkup()
contact_info.row(InlineKeyboardButton(text='Модератор', url='https://vk.com/moderator'),
InlineKeyboardButton(text='Менеджер', url='https://vk.com/manager'))
contact_info.row(InlineKeyboardButton(text='Админ', url='https://vk.com/admin'))
contact_info = InlineKeyboardMarkup() тут так же как и с первой клавиатурой, просто создаем ее.contact_info.row(InlineKeyboardButton(text='Модератор', url='https://vk.com/moderator'),InlineKeyboardButton(text='Менеджер', url='https://vk.com/manager'))Схоже с первой клавиатурой, но тут по мимо текста кнопки мы указываем еще и то, куда будет вести эта кнопка, в данном случае это вымышленные страницы ВК, но в место url там может быть кое что другое, позже мы с этим 'кое чем' познакомимся.
Что бы получилось две кнопки в ряд мы просто содаем их через запятую.
Отлично, с инлайн клавиатурой мы по быстрому разобрались, теперь давайте отправим ее пользователю:
Python:
#main.py
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
@dp.message_handler(commands='start')
async def start(message: types.Message):
await bot.send_message(message.from_user.id, text='Доброго времени суток, какую контактуню информацию ты хочешь получить?', reply_markup=kb.user_menu)
@dp.message_handler(text='Контактная информация')
async def contact(message: types.Message):
await bot.send_message(message.from_user.id, text='Контактная Инфа', reply_markup = kb.contact_info)
@dp.message_handler(text='Новости')
async def news(message: types.Message):
await bot.send_message(message.from_user.id, text='Тут какие то новости')
executor.start_polling(dp, skip_updates=True)
main.py весь код:
Python:
import keyboards as kb
from config import *
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
bot = Bot(token)
dp = Dispatcher(bot)
@dp.message_handler(commands='start')
async def start(message: types.Message):
await bot.send_message(message.from_user.id, text='Доброго времени суток, какую контактуню информацию ты хочешь получить?', reply_markup=kb.user_menu)
@dp.message_handler(text='Контактная информация')
async def contact(message: types.Message):
await bot.send_message(message.from_user.id, text='Контактная Инфа', reply_markup = kb.contact_info)
@dp.message_handler(text='Новости')
async def news(message: types.Message):
await bot.send_message(message.from_user.id, text='Тут какие то новости')
executor.start_polling(dp, skip_updates=True)
keyboards.py:
Python:
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
user_menu = ReplyKeyboardMarkup(resize_keyboard=True)
user_menu.row(KeyboardButton('Контактная информация'))
user_menu.row(KeyboardButton('Новости'))
contact_info = InlineKeyboardMarkup()
contact_info.row(InlineKeyboardButton(text='Модератор', url='https://vk.com/moderator'),
InlineKeyboardButton(text='Менеджер', url='https://vk.com/manager'))
contact_info.row(InlineKeyboardButton(text='Админ', url='https://vk.com/admin'))
автор @multicoder
источник exploit.in