Как разработать Telegram-бота на Python+C
Создаем Telegram-бот, работаем c I/O Bound нагрузкой, подключаем фичи Google Drive и пишем на C внутри Python.
Эта инструкция — часть курса «Как создавать Telegram-ботов».
Смотреть весь курс
Введение
В этой инструкции мы создадим приложение, которое интегрируется со сторонними API. Разберем I/O Bound нагрузку и поработаем с асинхронностью в Python.
Часть сервера Telegram-бота мы будем писать на С, так как он считается перформанс-ориентированным языком, поэтому посмотрим также модуль обработки СPU Bound нагрузки, использующийся для сложных вычислений процессора.
Мы постараемся объяснить все: от развертывания каждого модуля до настройки проекта на удаленном сервере.
Работать все это будет в вебе, поэтому для примера клиент-серверной архитектуры используется Telegram. У нас по дефолту будет мобильный+десктопный клиент, поэтому не придется писать фронтенд самому.
Теория
У многих приложений есть открытый интерфейс (API), к которому можно подключиться из своих программ. Например, так можно подключиться к YouTube и попросить сервис прислать описания всех роликов из конкретного плейлиста.
Что такое CPU Bound и I/O Bound нагрузка. Примеры
- Есть какая-то задача Х, которая сильно нагружает процессор. Например, одни из самых медленных операций, которые выполняет современный процессор — деление или тригонометрические функции типа sin или cos. Такие сложные для процессора операции называют CPU Bound нагрузкой.
- Если операции упираются в скорость сети, скорость записи или чтения какого-то файла с диска или ожидания запроса из базы данных — это I/O Bound нагрузка. Отправили запрос к серверу и ждете, пока он придет — процессор простаивает, как правило, 90% времени.

Как эти проблемы решаются в Python?
- Можно использовать модуль мультипроцессинга, который распараллелит вычисления на несколько процессов на нескольких реальных ядрах. Первый оверхед — создание новых процессов в операционной системе — достаточно дорогая операция. А их взаимодействие — второй оверхед, то есть обмен данными между ними — не самая простая вещь. Как минимум, чтобы передать объект между ними, объект должен быть сериализован и десериализован соответствующе. Если кратко: сериализация — это очень дорого.
- Мультитрединг — дешевле, особенно вскейле, то есть когда мы планируем масштабировать и создавать большие пулы потоков. Потому что поток — это более легковесная сущность с точки зрения операционной системы и в сравнении с процессом, как минимум.
Самое важное, что потоки расшаривают одну и ту же область памяти внутри одного процесса. То есть обмен данными между ними организован гораздо проще.
В Python есть GIL или блок интерпретатора, с которым могут быть проблемы. В каждый конкретный момент времени может работать только один, залоченный поток, а другим приходится ждать.

В случае решения второй проблемы и I/O Bound нагрузки, то в Python она решается асинхронным программированием.
Практика
О том, как создаются Telegram-боты, можно посмотреть здесь. Начнем с нашего интерфейса.
Возьмем первую библиотеку для Python: Python-telegram-bot.
Чтобы не захламлять компьютер чем-то лишним, будем использовать питоновскую виртуальную среду (venv). Это похоже на изолированный контейнер, в котором можно проводить любые опыты, и доступно это только внутри этой папки.
Сначала нам нужен токен от BotFather для аутентификации с API Telegram. Плюс здесь можно устанавливать ряд других настроек: изменить описание, поставить моды. BotFather по сути представляет собой админку.
Токен мы будем хранить в скрытых данных. За это в Python отвечает модуль dotenv, который также ставится внутри нашей виртуалки, и в сам файл уже переносим токен.
from bot.bot import start, list_files, upload_file, search_button, cython, pi_button, FIRST, SECOND from dotenv import load_dotenv from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ConversationHandler import os async def hello(update: Update, context: ContextTypes.DEFAULT_Type) ->Name: Name: await update.message.replay_text(f'Hello(update.effective_user.first_name)') load_dotenv() application = ApplicationBuilder().token(os.getenv('TOKEN')).build() app.add_handler(CommandHandler(“hello”, hello)) app.run.polling()
Чтобы подружить Telegram с Google Drive воспользуемся API /quickstart/python. Здесь нам нужно получить что-то вроде токена, как и в случае аутентификации с API Telegram, только в Google API это называется(Credentials). В main.py мы должны добавить и токен, и обработчик функции start.
По этой логике нужно написать еще одну функцию и добавить ее в еще один handler уже для сэмпла от Google Drive.
Добавляем еще один CommandHandler (обработчик команд или все, что мы пишем через слэш).
В Telegram, проверить работу функции можно командой /files, которую мы можем легко добавить в админке BotFather
По коду Google: мы достаем секретки и вытаскиваем все файлы, дальше выводим их в консоль. Можно сделать, чтобы ответ приходил не в консоль сервера, а сразу в бот на клиент.
Загрузка файлов
Для демонстрации возможностей добавим еще и загрузку файлов. Google предлагает здесь обширный список того, что можно делать: Работа со всеми видами файлов, работа с UI Google Drive, и так далее.
Нам для интерактивности нужна динамика, поэтому мы будем грузить файл сначала на наш сервер через интерфейс Telegram, а уже оттуда его перенаправлять в Google Drive.
Чтобы загрузить файл сначала к нам на сервер, воспользуемся вот этим код-сниппетом из библиотеки telegram-bot-api а конкретно Download file.
Промежуточный итог

У нас есть сервер. Место, где мы разворачиваем наш код: удаленный или наш компьютер. Там мы запускаем наш Telegram-бот. Через интерфейс Telegram-бота, который нам дается по стандарту, мы можем загрузить файл, и он будет у нас лежать либо на компьютере, либо на удаленном сервере.
Этим сниппетом сначала загружаем файлы на компьютер. В отдельную функцию вынесем аутентификацию с Google Drive, чтобы было почище. Дальше во все захардкоденные сниппеты Google мы добавим наши динамические данные в виде имен файлов и путей. Все это достается из аргументов Update и Context.
Добавим также обработчик команд MessageHandler для медиасообщений.
Теперь, если вызвать эту функцию, то сначала файл появится в нашей папке Downloaded, а потом в Google Drive.
В конечном счете код в файле main.py у нас должен выглядеть так:
from bot.bot import start, list_files, upload_file, search_button, cython, pi_button, FIRST, SECOND from dotenv import load_dotenv from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ConversationHandler import os def main(): import cProfile import pstats load_dotenv() application = ApplicationBuilder().token(os.getenv('TOKEN')).build() application.add_handler(CommandHandler('start', start)) with cProfile.Profile() as pr: application.add_handler(CommandHandler('files', list_files)) stats = pstats.Stats(pr) stats.sort_stats(pstats.SortKey.TIME) stats.dump_stats(filename='profiling.prof') conv_handler = ConversationHandler( entry_points=[CommandHandler("cython", cython)], states=< FIRST: [CallbackQueryHandler(search_button)], SECOND: [CallbackQueryHandler(pi_button)], >, fallbacks=[CommandHandler("cython", cython)], ) application.add_handler(conv_handler) application.add_handler(MessageHandler(filters.Document.ALL, upload_file)) application.run_polling() if __name__ == '__main__': main()
На этом мы закончили работу с I/O Bound нагрузкой и ее функциями. А что если мы хотим добавить функциональность по нагрузке процессора? Вариаций действительно много. Можно сделать промежуточный лэйер, который будет брать видео, которые мы грузим, монтажить их в клип, сжимать и выгружать на Google Drive уже готовые препродакшн видео.
Модуль для сложных вычислений на процессоре
Следующая фича на бэкенде. Мы сейчас добавим модуль для CPU Bound обработки именно на процессоре, и делать это будет Python в связке с языком С. Более того, делать мы это будем в нескольких потоках. То есть мы отключим питоновский GIL.
Потенциально это может создать много проблем с синхронизацией, но тема многопоточности — это отдельная история, которую мы в рамках инструкции вынесем за скобки.
Первый модуль будет большой аллокацией + бинарный поиск по массиву. Заодно так проверим, как это работает. Папка lowlevel для C-файлов и сразу заведем модуль с парой простых функций.
int*allocate(int N) int* ptr = malloc(sizeof(int)* N);
Выделяем память для массива данных. Внутри функции поиска элементов будем вызывать наши функции для аллокации и генерации данных. Так можно увидеть наглядно, как работает процессор линейно, в нескольких потоках и в нескольких процессах. Эта практика сейчас используется для наглядности, но в боевых проектах так делать не стоит.
Чтобы вызывать код на С из-под Python нам потребуется Cython. Это суперсет Python, который позволяет писать на C прямо внутри Python. Чтобы все это работало, нужно поставить это в виртуалку и добавить файл для интерфейса Python и C.
cdef extern from "lowlevel/module.c" nogil; int binary_search_imp(int index) cdef int b_search_(int index):
Затем создаем промежуточную функцию, которая будет вызывать нашу экспортированную C функцию.
cdef int b_search(int index): return binary_search_impl(index); def binary_search(int index, results = None): cdef int result; with nogil: result = b_search(index); if results is not None: results.append(result) return result
Самое важное — поставить аннотацию nogil, то есть здесь мы отключаем лок интерпретатора (GIL).
Итак, у нас есть С файл с core-функциями. У нас есть файл, чтобы этими функциями пользоваться в самом Python.
Теперь в новом файле опишем все Python-функции. Чтобы не путаться, назовем его, например, performance.py. В него сразу добавим функцию по вычислению дельты времени, от начала и конца исполнения. Она позволит наглядно увидеть скорость Python в линейном режиме, многопоточном и в многопроцессном.
Функция, внутри которой есть функция-обертчик, где есть вызов функции, которую мы декорируем. Чтобы протестить все, что мы написали, нам нужны три основных функции.
Линейная. Все вычисления будут происходить по очереди в одном потоке, как обычно работает Python. Асинхронность здесь не сработает, потому что все это нагружает именно процессор, а не любого рода ввод/вывод.
def linear(N) results = [] binary_search(N, results) return results
Многопоточная. Создаем пять потоков по одному вызову в каждом.
def multithreaded(N): results = []
Мультипроцессинговая. Функция с изолированным друг от друга процессами: shared.list.
shared.list. def multithreaded(N): results = mp.Managed.lists()
Теперь перейдем к следующему конфигу, по настройке Cython. Назовем его setup.py. Что здесь должно быть?
- файл, который нужно скомпилировать,
- модуль, который мы создаем и будем использовать,
- функция setup, которая будет все это структурировать.
Код выглядит так:
from setuptools import setup from distutils.extension import Extension from Cython.Distutils import build_ext sourceFiles = ['bot/nogil.pyx'] ext_modules = [ Extension("nogil", sourceFiles ), ] setup( name='google drive app', cmdclass=, ext_modules=ext_modules )
Добавим простой bash-script, чтобы собирать все было удобнее.
# !/bin/bash [! -e "nogil.c" ] || rm "nogil.c" find . -name "*.so" -type f -delete python3 setup.py build_ext -b build mv bot/*.c bot/lowlevel/
Теперь все должно адекватно пересобираться и раскладываться по своим местам.
Чтобы в самом Telegram-боте это выглядело красиво, добавим пару кнопок. В Inline-боте нужны две функции: описание и кнопка + события, которые будут происходить, когда мы будем на нее нажимать.
Вызываем функцию бинарного поиска в наших 3-х тестах. Линейном, многопоточном и многопроцессном, дергаем наши три функции. Добавляем обработчики для кнопок и можно тестировать.
Почти секунда у нас уйдет, чтобы выделить необходимую память для каждого вызова функции. Многопоточность обгоняет линейную более чем на 50%. Многопроцессность также быстрее, но все же уступает многопоточности.
В конце у нас должен получиться примерно такой код в bot.py:
from __future__ import print_function import os import logging from telegram import Update from telegram.ext import ContextTypes import os.path from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError from googleapiclient.http import MediaFileUpload from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update from bot.performance import linear, multithreaded, multiprocessed, linear_pi, mt_pi, mp_pi logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) def creds(): # If modifying these scopes, delete the file token.json. SCOPES = ['https://www.googleapis.com/auth/drive'] """Shows basic usage of the Drive v3 API. Prints the names and ids of the first 10 files the user has access to. """ creds = None # The file token.json stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists('token.json'): creds = Credentials.from_authorized_user_file('token.json', SCOPES) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', SCOPES) creds = flow.run_local_server(port=0) # Save the credentials for the next run with open('token.json', 'w') as token: token.write(creds.to_json()) return creds async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!") async def list_files(update: Update, context: ContextTypes.DEFAULT_TYPE): try: service = build('drive', 'v3', credentials=creds()) # Call the Drive v3 API results = service.files().list( pageSize=10, fields="nextPageToken, files(id, name)").execute() items = results.get('files', []) if not items: print('No files found.') return #4.362e-06 # l = [] # for f in items: # l.append(f.get("name")) print('Files:') #4.103e-06 for item in items: await context.bot.send_message(chat_id=update.effective_chat.id, text=item.get("name")) print(u' ()'.format(item['name'], item['id'])) except HttpError as error: # TODO(developer) - Handle errors from drive API. print(f'An error occurred: ') async def upload_file(update: Update, context: ContextTypes.DEFAULT_TYPE): newFile = await update.message.effective_attachment.get_file() await newFile.download(custom_path="downloaded/" + update.message.effective_attachment.file_name) try: # create drive api client service = build('drive', 'v3', credentials=creds()) file_metadata = media = MediaFileUpload("downloaded/"+update.message.document.file_name, mimetype=update.message.document.mime_type, resumable=True) # pylint: disable=maybe-no-member file = service.files().create(body=file_metadata, media_body=media, fields='id').execute() print(F'File ID: ') except HttpError as error: await context.bot.send_message(chat_id=update.effective_chat.id, text="Failure") print(F'An error occurred: ') file = None await context.bot.send_message(chat_id=update.effective_chat.id, text="Success") return file.get('id') FIRST, SECOND = range(2) async def cython(update: Update, context: ContextTypes.DEFAULT_TYPE): keyboard = [ [InlineKeyboardButton(u"Search", callback_data=str(FIRST))] ] reply_markup = InlineKeyboardMarkup(keyboard) await update.message.reply_text(u"First module", reply_markup=reply_markup) return FIRST async def search_button(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query keyboard = [ [InlineKeyboardButton(u"Pi", callback_data=(SECOND))] ] index = ((2**31-1) // 32 - 1) await context.bot.send_message(chat_id=update.effective_chat.id, text="lin: "+linear(index)) await context.bot.send_message(chat_id=update.effective_chat.id, text="mt: "+multithreaded(index)) await context.bot.send_message(chat_id=update.effective_chat.id, text="mp: "+multiprocessed(index)) #reply_markup = InlineKeyboardMarkup(keyboard) await context.bot.edit_message_text(chat_id=query.message.chat_id, message_id=query.message.message_id, text=u"Second module") reply_markup = InlineKeyboardMarkup(keyboard) await context.bot.edit_message_reply_markup(chat_id=query.message.chat_id, message_id=query.message.message_id, reply_markup=reply_markup) return SECOND async def pi_button(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await context.bot.send_message(chat_id=update.effective_chat.id, text="lin: "+linear_pi(100000000)) await context.bot.send_message(chat_id=update.effective_chat.id, text="mt: "+mt_pi(100000000)) await context.bot.send_message(chat_id=update.effective_chat.id, text="mp: "+mp_pi(100000000)) await context.bot.edit_message_text(chat_id=query.message.chat_id, message_id=query.message.message_id, text=u"You can add more CPU bound modules")
Тестируем на Linux сервере
Мы будем использовать последнюю версию Ubuntu и выберем самое простое железо. Кроме этого, с помощью Shared Line можно использовать только 10% ресурсов, поэтому это будет еще дешевле, но под наш pet-проект хватит. В день такая конфигурация будет стоить не больше 15 рублей.

Поднимаем и обновляем там все, потому что это fresh Linux. Далее загружаем весь код бота на сервер, и можно приступать к тестированию: закинем пару файлов в наш Telegram-бот. Тестируем работу загрузки файлов. Вывода файлов, и сами функции по нагрузке CPU bound вычислений.
Заключение
Мы подключаемся к открытому API Google Drive, и вместо того, чтобы в самом диске нажимать разные кнопки, мы можем управлять им из-под Telegram-бота. Сделать это можно не только с диском, но и с любым сервисом, у которого есть открытый API.

Кроме этого, мы рассмотрели пару фич для работы с CPU Bound нагрузками, что может помочь разгрузить какие-то сложные для процессора вычисления.
За границей Hello World: полный гайд по разработке Telegram ботов с помощью Python и Aiogram 3. Часть 1
Захотев однажды научиться разрабатывать ботов для Telegram на языке программирования Python, я просто зашёл в Яндекс и вбил что-то вроде «telegram бот на python для новичков» и нашёл казалось бы огромное множество гайдов и туториалов. Однако копнув немного глубже стало понятно, что большая часть гайдов заканчивается на прикреплении клавиатур к сообщениям, или ещё хуже, на написании эхо-бота.
Пришлось копаться в документации, шерстить форумы и учиться на примерах кода с GitHub. Этот гайд создан как полное руководство по разработке полноценного Telegram бота для работы с нейросетями, такими как ChatGPT и Dall-e, начиная установкой IDE и получением токена и заканчивая подключением оплаты, базы данных и загрузки бота на сервер.
Я считаю что гайд будет полезен прежде всего тем, кто уже пробовал разобраться в теме и имеет базовые знания. Чтобы гайд был полезным необходимо иметь базовые знания в Python, всё остальное вы можете изучить в процессе. Продвинутым разработчикам ботов большая часть будет знакома и вряд ли принесёт пользу, однако есть шанс, что и вы найдёте для себя что-то полезное. Жду любую конструктивную критику как по коду и его стилю, так и по изложению.
Что мы получим в итоге?
В конце гайда у нас получится полностью функционирующий бот, с админкой, оплатой, базой данных, реферальной программой и подключенным API OpenAI. По мере выхода статей код будет появляться в репозитории на GitHub.
Используемые технологии
Будут использованы следующие технологии:
- VS Code (или любой другой удобный редактор или IDE)
- Python
- Aiogram 3
- PostgreSQL
- API OpenAI
Подготовка окружения
Разработка любой программы начинается с подготовки среды, так что приступим. Для начала устанавливаем VS Code или любую другую вашу любимую IDE или редактор кода. Скачиваем установщик с сайта, запускаем, устанавливаем. По умолчанию среда уже готова к работе, но рекомендую установить дополнительные расширения для Python, а также по желанию темы и другие плюшки.
Конечно же надо установить сам Python, но раз вы читаете это, то уверен, что либо уже сделали это, либо разберётесь сами. Скажу лишь, что использую версию 3.10, однако код также должен работать на версиях Python 3.8 и выше.
В VS Code переходим на вкладку Git, скачиваем и устанавливаем Git. Далее инициализируйте репозиторий и желательно опубликуйте его на GitHub (для удобства дальнейшей работы), это можно сделать прямо из VS Code.

После этого создадим виртуальное окружение, чтобы не засорять пакетами глобальyую среду. Подробнее про виртуальные окружения и преимущества их использования можете почитать здесь. Открываем палитру команд (Ctrl-Shift-P на Windows) и запускаем команду Python: Create Environment .

Далее выбираем venv и интерпретатор Python. Чтобы активировать виртуальное окружение, в терминале выполните команду .\.venv\Scripts\activate . Также выберите интерпретатор Python по умолчанию.

Выбранный интерпретатор должен находиться в папке .venv

Теперь пришло время установить все используемые библиотеки. Их список вы можете найти у меня на github. Там же я буду выкладывать весь код по мере выхода статей. Если вы скачали файл, то установить библиотеки можно командой:
pip install -r requirements.txt
Обратите внимание что мы будем использовать aiogram версии 3, который ещё находится в бета-тестировании, 3 версия НЕ совместима с предыдущими, так что не забывайте об этом.
Следующий шаг — установка PostgreSQL. Сама установка не является чем-то сложным, поэтому не будем её подробно рассматривать. Для более удобной работы с базами данных можете установить графический клиент, такой как pgAdmin (идущий в комплекте с PostgreSQL), DBeaver или Navicat, самый удобный и используемый мною каждый день в работе (имеет бесплатную пробную версию).
На этом настройка окружения завершена, можно приступать к созданию структуры бота.
Создание структуры
Наш бот будет разделён на несколько логических частей — файлов. Можно писать весь код в одном файле — он будет также работать, однако отладка и поиск нужной функции или класса станет сущим адом.
Файловая структура нашего бота:
- main.py — точка входа, код запуска бота и инициализации всех остальных модулей
- config.py — файл со всеми конфигурационными параметрами, такими как токен бота и данные подключения к БД. Хранение настроек в Python-файле является не самой лучшей практикой, однако если настройки меняются очень редко, то такой способ является самым простым. Можно также хранить настройки в переменных окружения или специальных файлах (ini, json) и через config.py лишь предоставлять абстракцию данных, однако в этом боте будет использован самый простой способ
- db.py — функции подключения и работы с базой данных. Данный файл будет являться абстракцией базы данных от основного кода
- text.py — все тексты, используемые ботом. В этом файле будут лежать все приветствия, сообщения об ошибках и другие текстовые данные для бота. Хранение текста в Python-файле также является не лучшей практикой, так как изменить тексты можно только через код, однако тексты меняются не так часто (чаще всего никогда), поэтому снова пойдём самым простым путём
- kb.py — все клавиатуры, используемые ботов. В этом файле будут находиться абсолютно все клавиатуры, как статические, так и динамически генерируемые через функции
- middlewares.py — название файла говорит само за себя. В этом файле будут лежать все используемые мидлвари (их будет всего две)
- states.py — будет хранить вспомогательные классы для FSM (машины состояний), а также фабрики Callback Data для кнопок Inline клавиатур
- utils.py — различные функции. В этом файле будут лежать функции для рассылки, генерации текста и изображений через API и другие
- handlers.py — основной файл, в котором будет содержать почти весь код бота. Будет состоять из функций-обработчиков с декораторами (фильтрами)
- admin.py — обработчики событий, клавиатуры, классы и весь остальной код админки бота. Опять же если придерживаться лучших практик, стоило бы вынести это в отдельную папку, в которой уже создать модули клавиатур, текстов, хэндлеров (обработчиков) и всего остального. Наша админка будет иметь базовый функционал, поэтому реализуем всё в одном файле
В итоге ваша папка должна выглядеть так:

Получение токена
На эту тему написано настолько много материала, что крайне не хочется дублировать его, поэтому дам краткую инструкцию по получению токена:
- Запустите бота BotFather
- Создайте бота командой /newbot
- Следуя указаниям бота введите все данные, типа названия
- Скопируйте токен и вставьте его в переменную BOT_TOKEN в файле config.py
Можно также произвести настройку бота в BotFather, к примеру настроить описание, аватарку и другие параметры.
Пишем первый код!
Теперь, когда все подготовительные действия сделаны, можем приступить к написанию кода. Мы не будем писать эхо-бота, а сразу перейдём к чему-то более полезному — бот, отправляющий пользователю его ID.
В файле main.py пишем следующий код:
import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.enums.parse_mode import ParseMode from aiogram.fsm.storage.memory import MemoryStorage import config from handlers import router async def main(): bot = Bot(token=config.BOT_TOKEN, parse_mode=ParseMode.HTML) dp = Dispatcher(storage=MemoryStorage()) dp.include_router(router) await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types()) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) asyncio.run(main())
Сначала мы импортируем все нужные нам классы и модули:
- asyncio — для асинхронного запуска бота
- logging — для настройки логгирования, которое поможет в отладке
- aiogram — основной модуль библиотеки aiogram, из которого мы импортируем классы Bot и Dispatcher
- aiogram.enums.parse_mode — содержит настройки разметки сообщений (HTML, Markdown)
- aiogram.fsm.storage.memory — хранилища данных для состояний пользователей
- config — настройки бота, пока что только токен
- handlers — пока пустой, но скоро мы напишем в нём функционал нашего бота
Затем мы объявляем функцию main() , в которой будет запускаться бот. Далее мы создаём объект бота с нашим токеном. Обратите внимание на параметр parse_mode , он отвечает за используемую по умолчанию разметку сообщений. Мы используем HTML, чтобы избежать проблем с экранированием символов. Затем мы создаём объект диспетчера, параметр storage=MemoryStorage() говорит о том, что все данные бота, которые мы не сохраняем в БД (к примеру состояния), будут стёрты при перезапуске. Этот вариант является оптимальным, так как хранение состояний диспетчера требуется редко.
Строка dp.include_router(router) подключает к нашему диспетчеру все обработчики, которые используют router, их вы увидите в следующем файле. Строка await bot.delete_webhook(drop_pending_updates=True) удаляет все обновления, которые произошли после последнего завершения работы бота. Это нужно, чтобы бот обрабатывал только те сообщения, которые пришли ему непосредственно во время его работы, а не за всё время. следующая строка запускает бота. Однако если сейчас попытаться запустить файл, бот не запустится, а выдаст исключение, так как файл handlers.py пустой. Давайте исправим это.
from aiogram import Router router = Router()
Давайте запустим и проверим, как работает наш бот. После запуска вы должны увидеть следующий вывод в лог:

Это означает, что наш бот запущен и слушает обновления, однако пока что он ничего не делает, так как мы не добавили ни одного обработчика. Давайте исправим это, написав в файле handlers.py следующий код:
from aiogram import types, F, Router from aiogram.types import Message from aiogram.filters import Command router = Router() @router.message(Command("start")) async def start_handler(msg: Message): await msg.answer("Привет! Я помогу тебе узнать твой ID, просто отправь мне любое сообщение") @router.message() async def message_handler(msg: Message): await msg.answer(f"Твой ID: ")
Сначала мы импортируем все необходимое из aiogram. После этого создаём роутер для дальнешей привязки к нему обработчиков. Затем мы объявили две функции-обработчика событий, а также назначили им фильтры. Рассмотрим их подробнее. Декоратор @router.message означает, что функция является обработчиком входящих сообщений. Command(«start») запускает обработчик только если входящее сообщение — команда /start . Далее мы объявляем саму функцию и в её теле отвечаем пользователю на сообщение текстом приветствия. Если мы имеем доступ к объекту сообщения, то всегда можем отправить в тот же чат любое сообщение методом msg.answer(«Text») , что является аналогом await bot.send_message(msg.chat.id, «Text») .
Второй обработчик реагирует на все сообщения, так как у него не задан ни один фильтр. В теле функции мы снова отвечаем пользователю сообщением и подставляем в него значение msg.chat.id . Запустим снова код и посмотрим на результат. Обратите внимание, что запускать надо не handlers.py, а main.py, так как именно он является точкой входа в нашу программу. В консоли снова появится аналогичное сообщение об успешном запуске бота, можно перейти в чат с ботом и отправить ему команду /start .
Мы должны получить следующие ответы от бота:

Если у вас получилось также, то поздравляю, вы настроили всё правильно и запустили минимально рабочего бота.
Заключение
В следующей части мы сделаем меню бота и подключим к боту API OpenAI. Так как это моя первая статья на Хабре, жду любой конструктивной критики в комментариях по оформлению, стилю изложения и разумеется коду.
UPD: Обновил код, удалил использование глобального объекта диспетчера, заменил на роутер. Спасибо более опытным коллегам за подсказку
Telegram Bot

Телеграм бот на Python / #1 – Разработка ботов с нуля. Как создать Telegram Bot?
Представляем курс для начинающих по разработке Telegram ботов на Python. За курс вы с нуля научитесь создавать Телеграм ботов в разных жанрах и с использованием разных библиотек.
Видеоурок
Разработка ботов
За последние несколько лет боты стали неотъемлемой частью многих интернет компаний. За счет ботов компании могут автоматизировать рутинную работу и могут позволить пользователю быстро получить необходимую информацию.
В связи с этим сфера их разработки сейчас действительно очень популярна. Многие компания хотят иметь своего телеграмм бота и поэтому ищут специализированных разработчиков. Приятно в этом то, что на изучение разработки вам придется потратить всего пару дней (за исключением изучения самого языка программирования). После пары дней тренировок вы уже сможете брать заказы на фрилансе и получать за их выполнение деньги.
Почему Telegram?
В современном мире мессенджеры стали основным способом для общения в интернете. Существует много мессенджеров, но с уверенностью можно сказать что одним из самых популярных является Телеграм.

Поэтому, если вы решили создавать ботов, то логично начать сразу с наиболее популярной платформы в этой сфере. Изучив разработку Telegram ботов вы позже сможете переключиться и на разработку ботов под другие мессенджеры или соц сети. Принцип работы всех ботов примерно одинаков. Разница заключается лишь в использовании разных библиотек и методов в них.
Инструменты разработчика
На самом деле для разработки ботов вы можете использовать любые языки программирования. Можно писать на PHP, C#, Java и даже на JavaScript.
Многие разработчики выбирают тот язык, на котором они пишут в повседневной жизни. Если же такого языка нет, то одним из наилучших в этом плане является язык Python. Он легок в использовании и позволяет быстро добавить необходимый функционал для вашего бота.

Такая легкость в частности обеспечена обилием библиотек, что были разработаны под этот язык для быстрого описания и выполнения команд.
Плюс выбор падает на Питон, так как на его основе можно создавать ботов и под другие мессенджеры, что очень удобно, ведь синтаксис будет такой же.
План курса
В ходе курса вы с нуля научитесь создавать Telegram ботов под разные сферы и цели применения. Вы научитесь работать с несколькими библиотеками для построения ботов, а также внедрите в код разные API системы для интеграции полезных функций.
К концу курса у вас будут хорошие навыки по созданию ботов. Вы сможете создавать ботов, что будут представлять из себя набор полезных действий или даже полноценный магазин с покупками.
Дополнительный курс
На нашем сайте вы также найдете курс « Профессия Python разработчик ». В ходе огромной программы вы изучите язык Python, научитесь работать с базами данных, тестированием и научитесь создавать веб сайты за счёт фреймворка Django.
За курс вы изучите массу нового и к концу программы будете уметь работать с языком Питон, создавать на нём полноценные ПК приложения на основе библиотеки Kivy и создавать веб сайты на основе библиотеки Джанго.
Задание к уроку
Создание бота
Создайте нового бота через Телеграм. Укажите что ваш бот будет иметь название: «ВашеИмяФамилия My Bot».
Посмотреть ответ
Для создания бота зайдите в Телеграм и найдите официального бота @BotFather .
Запустите его и пропишите команду «/newbot». Далее укажите название для бота и его программный адрес.
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Создание бота Telegram с помощью Python: пошаговое руководство

TLDR Ключевая идея видео заключается в том, что изучение Python и создание Telegram-ботов может стать прибыльным навыком для фрилансеров, и в видео приводится пошаговое руководство о том, как создать Telegram-бота.
Summarize any YouTube video Summarize any video by yourself
Install on Safari
Install on Chrome
Ключевые выводы
Изучение того, как создавать Telegram-ботов, может стать прибыльным навыком, позволяющим частным лицам выполнять заказы фрилансеров и зарабатывать реальные деньги за их выполнение.
Python является популярным языком для разработки ботов Telegram благодаря своей простоте использования, обилию библиотек и возможности создавать ботов для других мессенджеров с таким же синтаксисом.
Создание ботов в Telegram может варьироваться от простых действий до полноценных магазинов с покупками, предлагая широкий спектр возможностей для разработчиков.
Имя бота должно состоять из одного целого слова без пробелов, и если выбранное имя уже занято, необходимо указать альтернативное имя.
Токен необходим для подключения к Telegram-боту и управления им, позволяя пользователям добавлять дополнительные характеристики и настраивать его функциональность.
Добавление команд и функциональных возможностей в бота требует написания кода, который будет рассмотрен в следующих уроках.
Get insights from any YouTube video
Install on Safari
Install on Chrome
Просмотреть больше Программирование
- Овладение искусством программирования: необходимые навыки для каждого разработчика
- Rustacean : Внедрение Web 3 и разработка смарт-контрактов с Тимуром Гувенкая
- Передача адреса переменной в функцию в C
- Прокси JavaScript: пользовательская логика и гибкое манипулирование объектами
- Команды цифровых сервисов и UX-аналитика в банковском UX
- Путь программиста: открывая возможности и совершенствуя навыки
Отмеченное временем резюме
Боты стали популярны в последние годы, поскольку они автоматизируют рутинную работу и предоставляют быструю и удобную информацию, что делает освоение этого навыка прибыльным для выполнения внештатных заказов.
Python является популярным языком для разработки ботов Telegram благодаря своей простоте использования, обилию библиотек и возможности создавать ботов для других мессенджеров, используя тот же синтаксис.
Вы можете создавать ботов с полезными действиями или даже магазин с покупками, ознакомившись с Python и используя Phaser bot в Telegram.
Нажмите на кнопку «Пуск», укажите имя для бота, и если имя не занято, бот будет создан.
После создания Telegram-бота мы получаем токен для подключения и добавления таких функций, как изображение и описание, с командами, доступными для редактирования, управления и удаления бота.
Спикер демонстрирует, как создать Telegram-бота, включая выбор имени, добавление описания и установку изображения.
Описание, отображаемое в боте, может быть очищено и настроено с помощью команды Set about Text, а дополнительные функциональные возможности могут быть добавлены с помощью кодирования в будущих уроках.
Подключайтесь к действиям в течение года и обрабатывайте их, подписывайтесь на канал и присоединяйтесь к социальным сетям.
Summarize any video by yourself
