5.08M
Категория: ПрограммированиеПрограммирование

Создание Телеграмм-бота

1.

Создание
Телеграм-бота

2.

Установка Visual Studio Code
Ссылка для скачивания - https://code.visualstudio.com/download
Со всем соглашаемся и нажимаем «Установить»

3.

Создание и открытие файла в VS Code
1. Создаем папку, в которой будет находится
наш бот
2. В VS Code нажимаем на «File» -> «Open
Folder»
3. Находим нашу созданную папку и
нажимаем «Выбор папки»

4.

Установка виртуальной среды
1. В панели проводника навести на папку
reminder и нажать на кнопку «New File»
2. Назвать файл любым понятным названием с
расширением .py, например, bot.py
3. Двойным кликом открыть созданный файл
4. В верхней панели навести на «Terminal» и
далее выбрать «New Terminal», вследствие
чего в нижней части откроется терминал

5.

Установка виртуальной среды
5. В появившемся окне терминала требуется
вписать следующую команду:
python –m venv botvenv
(Вместо «botvenv» можно написать любое
название для папки)
Далее нажимаем «Enter»
6. После чего в проводнике мы можем
увидеть папку с названием «botvenv», где
хранятся файлы виртуальной среды
разработки
P.S. Если файл не создался, то требуется в команде вместо «python» написать «py»:
py –m venv botvenv

6.

Установка виртуальной среды
7. В нижней панели нажать на версию
интерпретатора
8. В появившемся окне выбрать первый
рекомендуемый, в пути которого
присутствует виртуальная среда, созданная
до этого в терминале

7.

Работа с виртуальной средой
1. Для того, чтобы работать с установленной
виртуальной средой, требуется активировать
её. Для этого требуется создать терминал, как
в первых пунктах и вписать следующее:
botvenv/Scripts/activate
2. После чего перед путем появится
приставка в виде названия папки
виртуальной среды в круглых скобках

8.

Работа с виртуальной средой
Если же после шага №1 выводится ошибка, то
следует выполнить следующее:
1. Ввести следующую команду в терминале:
Set-ExecutionPolicy RemoteSigned
2. Повторно ввести команду из шага №1 активации
виртуальной среды

9.

Процесс создания телеграм-бота
1. Для того, чтобы использовать нужные нам инструменты,
требуется установить асинхронную библиотеку aiogram. Для
этого в терминале требуется написать следующую команду:
pip install aiogram
2. После чего требуется нажать «Enter» и дождаться конца
установки библиотеки

10.

Процесс создания телеграм-бота
1. Для начала работы по созданию бота
требуется зайти в телеграм и в поисковой
строке ввести название следующего бота,
который управляет всеми ботами:
botfather
2. Вводим команду ‘/start’ для начала работы с
данным ботом

11.

Процесс создания телеграм-бота
1. Для создания нашего бота требуется ввести
команду ‘/newbot’
2. Далее вводим название, затем юзернейм
нашего бота на латинице так, чтобы в конце
было слово ‘bot’. Пример на скриншоте
3. После того, как вписали название, бот
отправит токен, который понадобится в
дальнейшем процессе создания бота для того,
чтобы активировать HTTP API

12.

Процесс создания телеграм-бота
Требуется импортировать набор инструментов, в
том числе из асинхронной библиотеки aiogram:
Каждый импорт описан далее

13.

Процесс создания телеграм-бота
import asyncio – библиотека, которая
предоставляет средства для работы с асинхронным
программированием в Python. Это позволяет
создавать и управлять асинхронными задачами и
событиями.
import logging – модуль, который используется
для записи логов в приложении. Это позволяет
отслеживать события, ошибки и другую
информацию во время выполнения программы.

14.

Процесс создания телеграм-бота
from datetime import datetime, timedelta –классы из модуля
datetime
datetime используется для работы с датами и временем,
позволяет создавать объекты, представляющие конкретные
даты и часы
timedelta представляет разницу между двумя датами или
временем, позволяет выполнять арифметические операции с
датами (например, добавлять или вычитать определенное
время)

15.

Процесс создания телеграм-бота
from aiogram import Bot, Dispatcher, Router, types –
основные компоненты из библиотеки aiogram.
Bot – класс, представляющий сам бот. Он используется для
взаимодействия с Telegram API.
Dispatcher – класс, который управляет обработкой
входящих обновлений (сообщений, команд и т.д.) и
связывает их с соответствующими обработчиками.
Router позволяет организовывать маршрутизацию
сообщений и команд, улучшая структуру кода.
types содержит типы данных, используемые в API
Telegram, такие как сообщения, пользователи и т.д.

16.

Процесс создания телеграм-бота
from aiogram.filters import Command – фильтр из модуля
filters библиотеки aiogram. Этот фильтр используется для
обработки команд, отправленных пользователями, например,
когда пользователь вводит /start или /help.
from aiogram.types import Message – класс из модуля types.
Этот класс представляет сообщение, отправленное
пользователем, и содержит информацию о сообщении, такую
как текст, отправитель, время и т.д.

17.

Процесс создания телеграм-бота
from aiogram.types import ReplyKeyboardMarkup,
KeyboardButton – классы из модуля types
ReplyKeyboardMarkup используется для создания
клавиатур с кнопками, которые могут отображаться в чате.
Эти кнопки могут быть предназначены для быстрого
выбора пользователем
KeyboardButton представляет собой отдельную кнопку
клавиатуры, которую можно настроить с текстом, вызовом
действий и другими параметрами

18.

Процесс создания телеграмбота
Далее мы создаем константу TOKEN и
вставляем туда значение из botfather :
! Внимание!
Не давайте ваш токен посторонним лицам, так как благодаря ему
человек сможет полностью завладеть вашим ботом
logging.basicConfig(level=logging.INFO):
Настраивает модуль логирования, устанавливая
уровень логов на INFO, что позволяет записывать
информационные сообщения и предупреждения.

19.

Процесс создания телеграмДалее мы подготовим структуры данных длябота
уравления
расписанием:
• bot = Bot(token=TOKEN): Создает объект бота для
взаимодействия с API Telegram, используя заданный
токен.
• router = Router(): Инициализирует маршрутизатор,
который управляет обработкой входящих сообщений и
команд.
• dp = Dispatcher(): Создает диспетчер, который
координирует работу бота и маршрутизатора,
обрабатывая обновления.
• user_schedules = {}, adding_event = {}: Пустые словари
для хранения расписаний пользователей отслеживания,
находится ли пользователь в процессе добавления
события.

20.

Процесс создания телеграмСоздадим функцию которая будет создавать
клавиатуру, содержащую кнопки для
бота
удаления событий пользователя, а также кнопку для возврата в главное меню:
def get_delete_menu(user_id):
#Создаем список кнопок для событий
пользователя и добавляем кнопку для возврата
в главное меню
buttons = [
[KeyboardButton(text=event[1])] for event
in user_schedules.get(user_id, []) ]
buttons.append([KeyboardButton(text=
"Вернуться к главному меню")])
# Возвращаем разметку клавиатуры с кнопками
и настройкой автоматического изменения
размера
Return
ReplyKeyboardMarkup(keyboard=buttons,
resize_keyboard=True)

21.

Процесс создания телеграмбота
Создадим функцию для формирования
главного меню бота:
def get_main_menu(user_id):
# Если пользователь находится в процессе добавления события
возвращаем клавиатуру с кнопкой "Готово"
if adding_event.get(user_id):
return ReplyKeyboardMarkup(
keyboard=[[KeyboardButton(text="Готово")]],
resize_keyboard=True )
# Создаем список кнопок для главного меню
buttons = [
[KeyboardButton(text="Добавить событие")],
[KeyboardButton(text="Просмотреть события")],
[KeyboardButton(text="Удалить событие")], ]
return ReplyKeyboardMarkup(keyboard=buttons,
resize_keyboard=True)

22.

Процесс создания телеграм-бота
Далее добавим декоратор, используемый для обработки сообщений, которые
содержат команду /start в Telegram-боте:
@router.message(Command("start"))
async def start_handler(message: Message):
# Инициализируем пустое расписание для пользователя по
его ID
user_schedules[message.from_user.id] = []
# Устанавливаем флаг, указывающий, что пользователь не
добавляет событие
adding_event[message.from_user.id] = False
# Приветственное сообщение пользователю
await message.answer(
"Привет! Добавляйте свои события!",
# Клавиатура главного меню
reply_markup=get_main_menu(message.from_user.id),)

23.

Процесс создания телеграмРассмотри процесс добавления события:
бота
@router.message(lambda message: message.text ==
"Добавить событие")
async def add_event(message: Message):
# Пользователь начал процесс добавления события
adding_event[message.from_user.id] = True
# Отправляем инструкцию по вводу расписания
await message.answer(
"Введите ваше расписание в формате:\n"
"`дд.мм.гггг ЧЧ:ММ предмет`\n" # Формат даты и времени
"Пример:\n" # Приводим пример
"`25.12.2024 14:00 математика`\n"
"Напишите `готово`, когда закончите.",
parse_mode="Markdown", # Используем Markdown для
форматирования текста
reply_markup=ReplyKeyboardMarkup(
keyboard=[[KeyboardButton(text="Готово")]],
resize_keyboard=True ), )

24.

Процесс создания телеграмРассмотри процесс просмотра событий:
бота
@router.message(lambda message: message.text == "Просмотреть события")
async def show_schedule_handler(message: Message):
user_id = message.from_user.id # Получаем ID пользователя
if user_id in user_schedules: # Проверяем наличие расписания
schedule = user_schedules[user_id] # Извлекаем расписание
пользователя
if schedule: # Если расписание не пустое
schedule_str = "\n".join( # Форматируем дату и время
f"{event_time.strftime('%d.%m.%Y %H:%M')} - {subject}"
for event_time, subject in schedule )
# Отправляем пользователю расписание
await message.answer(
f"Ваше расписание:\n{schedule_str}",
reply_markup=get_main_menu(user_id) )
else: # Если расписание пустое
await message.answer(
"У вас пока нет запланированных событий.",
reply_markup=get_main_menu(user_id), )
else: # Если у пользователя нет расписания
await message.answer(
"У вас пока нет расписания.", reply_markup=get_main_menu(user_id) )

25.

Процесс создания телеграмДобавим декораторы для удаления событий
и возвращения в главное меню :
бота
@router.message(lambda message:
message.text == "Вернуться к главному
меню")
async def return_to_main_menu(message:
Message): # Отправляем пользователю
сообщение о возвращении в главное меню
@router.message(lambda message:
message.text == "Удалить событие")
async def delete_event_handler(message:
Message): # Отправляем пользователю
сообщение с просьбой выбрать событие для
удаления
await message.answer( "Выберите событие
для удаления:",
reply_markup=get_delete_menu(message.f
rom_user.id), # Клавиатура для выбора
события )
await message.answer( "Вы вернулись в
главное меню.",
reply_markup=get_main_menu(message.f
rom_user.id) # Клавиатура главного меню)

26.

Процесс создания телеграм-бота
Далее добавим декоратор обработки сообщений, если текст совпадает с любым событием пользователя:
@router.message(lambda message: any(message.text == event[1] for event
in user_schedules.get(message.from_user.id, [])))
async def delete_selected_event(message: Message):
# Находим событие для удаления, соответствующее тексту
event_to_delete = next(
( event # Получаем расписание пользователя
for event in user_schedules.get(message.from_user.id, [])
if event[1] == message.text ), # Сравниваем с текстом сообщения
None, )
if event_to_delete: # Если событие найдено
# Удаляем событие из расписания
user_schedules[message.from_user.id].remove(event_to_delete)
# Уведомляем пользователя об успешном удалении события
await message.answer(
f"Событие '{event_to_delete[1]}' удалено.",
reply_markup=get_main_menu(message.from_user.id), ) # Главное меню
else: # Если событие не найдено
await message.answer(
"Событие не найдено.",
reply_markup=get_main_menu(message.from_user.id))

27.

Процесс создания телеграм-бота
Декоратор обработки сообщения, если текст не пустой и не равен «готово»:
@router.message(lambda message: message.text and
message.text.lower() != "готово")
async def add_schedule(message: Message):
user_id = message.from_user.id # Получаем ID пользователя
if adding_event.get(user_id): # Добавляет ли пользователь событие
try: # Разбиваем текст сообщения на дату, время и предмет
date_str, time, subject = message.text.split(maxsplit=2)
schedule_time = datetime.strptime(f"{date_str} {time}", "%d.%m.%Y
%H:%M")
# Добавляем событие в расписание пользователя
user_schedules[user_id].append((schedule_time, subject))
await message.answer( f"Добавлено: {date_str} {time} {subject}",
reply_markup=get_main_menu(user_id), ) # Показываем
главное меню
except ValueError: await message.answer( # Уведомляем о
неверном формате
"Неверный формат. Пожалуйста, попробуйте снова.",
reply_markup=get_main_menu(user_id),)
else: # Если пользователь не добавляет событие, просим его выбрать опцию
из меню
await message.answer("Выберите опцию из меню.",
reply_markup=get_main_menu(user_id) )

28.

Процесс создания телеграм-бота
Декоратор обработки сообщения, если текст равен «готово» :
@router.message(lambda message: message.text and
message.text.lower() == "готово") async def
finish_schedule(message: Message):
user_id = message.from_user.id # Получаем ID
пользователя
if adding_event.get(user_id):
adding_event[user_id] = False # Завершаем
процесс добавления события
# Уведомляем пользователя о сохранении расписания
await message.answer(
"Расписание сохранено! Вы получите напоминания
за 30 минут до начала занятий.",
reply_markup=get_main_menu(user_id), )
else: # Если пользователь не добавляет событие, просим
выбрать опцию из меню
await message.answer(
"Выберите опцию из меню.",
reply_markup=get_main_menu(user_id) )

29.

Процесс создания телеграм-бота
Функция автоматической отправки напоминаний пользователям о предстоящих событиях:
async def send_reminders():
while True: now = datetime.now() # Получаем текущее время
for user_id, schedule in user_schedules.items(): # Проходим по
каждому пользователю и его расписанию
for schedule_time, subject in schedule: # Проходим по каждому
событию в расписании
reminder_time = schedule_time - timedelta(minutes=30)
if reminder_time <= now < reminder_time +
timedelta(minutes=1):
# Отправляем пользователю сообщение с напоминанием
await bot.send_message( user_id,
f"Напоминание: {subject} начинается в
{schedule_time.strftime('%H:%M')}", )
await asyncio.sleep(60) # Ждем 60 секунд перед следующей
проверкой

30.

Процесс создания телеграмВ конце настраиваем бота для обработки бота
сообщений и обеспечиваем отправку напоминаний
пользователям:
async def main():
dp.include_router(router) # Подключаем маршрутизатор к
диспетчеру для обработки сообщений
await
bot.delete_webhook(drop_pending_updates=True) #
Удаляем , webhook если он установлен, и игнорируем
ожидающие обновления
asyncio.create_task(send_reminders()) # Запускаем задачу
для отправки напоминаний в фоновом режиме
await dp.start_polling(bot) # Начинаем опрос бота для
получения новых сообщений
if __name__ == "__main__":
asyncio.run(main()) # Запускаем асинхронную функцию
main

31.

Процесс создания телеграмбота
После завершения написания кода открывает терминал и
запускаем нашего бота при помощи команды python
bot.py и нажимаем «Enter»
*вместо bot.py пропишите название вашего бота
English     Русский Правила