Как разработать 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 нагрузками, что может помочь разгрузить какие-то сложные для процессора вычисления.
Как создать телеграм-бота на Python
Узнайте, как создать своего телеграм-бота на Python с нуля, используя простые шаги в этой понятной статье для новичков.

Алексей Кодов
Автор статьи
23 июня 2023 в 18:47
Создание телеграм-бота на Python — отличный способ погрузиться в мир разработки и научиться работать с API. В этой статье мы рассмотрим, как создать простого телеграм-бота, который будет отвечать на сообщения пользователей.
Шаг 1: Зарегистрировать телеграм-бота
Для начала, вам понадобится создать телеграм-бота и получить его токен. Для этого:
- Откройте приложение Telegram и найдите бота @BotFather.
- Напишите боту /newbot и следуйте инструкциям, чтобы создать своего бота.
- Сохраните полученный токен, он потребуется для работы с API.
Шаг 2: Установить библиотеку python-telegram-bot
Для работы с API телеграма удобно использовать библиотеку python-telegram-bot . Установите ее с помощью следующей команды:
pip install python-telegram-bot
Шаг 3: Написать код для телеграм-бота
Теперь приступим к написанию кода нашего бота. Создайте файл bot.py и напишите следующий код:
import logging from telegram import Update from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext # Введите токен своего бота TOKEN = "your_token_here" # Настройка логирования logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) # Обработка команды /start def start(update: Update, context: CallbackContext) -> None: update.message.reply_text('Привет, я твой телеграм-бот! ') # Обработка текстовых сообщений def echo(update: Update, context: CallbackContext) -> None: update.message.reply_text(f'Вы написали: ') # Главная функция def main() -> None: updater = Updater(TOKEN) dispatcher = updater.dispatcher # Регистрация обработчиков dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo)) # Запуск бота updater.start_polling() updater.idle() if __name__ == '__main__': main()
Не забудьте заменить «your_token_here» на токен вашего бота.
Как создать телеграм-бота на Python: инструкция
Наверняка вам уже приходилось сталкиваться с ботами в Telegram. Боты помогают автоматизировать рутинные задачи как для обычных пользователей (например, боты-планировщики или боты для учета финансов), так и для компаний. Последние могут использовать ботов-рекламщиков, которые занимаются рассылками по клиентской базе, ботов-ассистентов, которые выполняют роль технической поддержки, и так далее.
В этой инструкции опишем процесс создания бота в Telegram на Python . В качестве примера создадим Telegram-бот компании Timeweb Cloud, который будет приветствовать пользователя и предлагать ему перейти на сайт компании.
Как создать бота в Telegram на Python пошагово
Шаг 1. Регистрация бота в BotFather
В первую очередь зарегистрируйте бота в Telegram. Для этого введите в поисковой строке мессенджера @BotFather и перейдите к нему, как это показано на картинке ниже.
После нажмите кнопку «Запустить» в нижней части окна и выберите в открывшемся списке команду /newbot . Бот предложит указать имя создаваемого бота. В нашем случае укажем TimewebCloudBot, и его же продублируем в качестве короткого имени.
После этого бот будет создан.
Надежно сохраните токен бота — в будущем он понадобится для авторизации и работы с ботом.
Шаг 2. Подготовка необходимых компонентов
Переходим к подготовке необходимых компонентов. На вашем компьютере должен быть установлен Python и среда разработки (в нашем случае это PyCharm).
Установить Python на Windows 10 можно по нашей инструкции, а после скачать PyCharm с сайта разработчика и установить его.
В качестве библиотеки мы будем использовать pyTelegramBotAPI . Установить ее можно, с помощью следующей команды:
pip install pyTelegramBotAPI
Все необходимые компоненты установлены. Переходим к следующему шагу.
Шаг 3. Написание кода
В первую очередь подключите установленную библиотеку и уникальный токен, о котором мы говорили выше, а также импортируйте типы, которые потребуются для работы кнопок (о них расскажем немного позже).
import telebot
botTimeWeb = telebot.TeleBot('Уникальный токен')
from telebot import types
Вместо Уникальный токен укажите токен, который вы получили при регистрации бота. Кавычки необходимо сохранить.
Теперь реализуем так называемые обработчики сообщений. Они отвечают за фильтрацию входящих сообщений бота и вызов указанной функции для этих сообщений.
С помощью кода ниже реализуйте команду /start , которая будет отвечать за запуск бота:
@botTimeWeb.message_handler(commands=['start'])
def startBot(message):
first_mess = f" , привет!\nХочешь расскажу немного о нашей компании?"
markup = types.InlineKeyboardMarkup()
button_yes = types.InlineKeyboardButton(text = 'Да', callback_data='yes')
markup.add(button_yes)
botTimeWeb.send_message(message.chat.id, first_mess, parse_mode='html', reply_markup=markup)
Разберем написанный выше код по порядку.
Первые две строчки объявляют метод обработки входящих сообщений. В нашем случае в качестве параметра передается команда /start .
Далее объявляется переменная first_mess , хранящая указанную строку. Она будет отображаться пользователю после вызова команды /start . Здесь также используется объект Message , необходимый для определения имени ( first_name ) и фамилии ( last_name ) пользователя.
Далее следуют 3 строчки кода, отвечающие за добавление кнопки, которая в будущем будет перенаправлять пользователя на следующее сообщение. Тип данной кнопки — Inline. Это значит, что такая кнопка будет отображаться прямо под сообщением. Для ее создания необходимо использовать метод InlineKeyboardButton . Параметр text отвечает за имя кнопки, а callback_data — за возвращаемую строку при нажатии. Второй параметр понадобится для реализации функционала кнопки.
И наконец, добавляется метод send_message , необходимый для отправки сообщения пользователю. У него указаны 4 параметра:
- message.chat.id отвечает за синхронизацию сообщения с чатом бота;
- first_mess передает ранее указанное сообщение;
- parse_mode необходим для указания режима разметки сообщений;
- reply_markup отвечает за добавление созданной кнопки.
Сейчас кнопка создана, но при ее нажатии ничего не происходит. Необходимо реализовать её функционал. Для этого используем следующий фрагмент кода:
@botTimeWeb.callback_query_handler(func=lambda call:True)
def response(function_call):
if function_call.message:
if function_call.data == "yes":
second_mess = "Мы облачная платформа для разработчиков и бизнеса. Более детально можешь ознакомиться с нами на нашем сайте!"
markup = types.InlineKeyboardMarkup()
markup.add(types.InlineKeyboardButton("Перейти на сайт", url="https://timeweb.cloud/"))
botTimeWeb.send_message(function_call.message.chat.id, second_mess, reply_markup=markup)
botTimeWeb.answer_callback_query(function_call.id)
В начале объявляется метод для обработки запросов обратного вызова. Выполняется проверка на соответствие строки, указанной после == и возвращенной после нажатия кнопки. Так как ранее мы указали значение параметра callback_data = ‘yes’ , то проверка пройдет успешно.
После проверки реализован функционал кнопки. Переменная second_mess хранит текст ответного сообщения. А далее описана реализация кнопки, которая хранит ссылку на сайт компании Timeweb Cloud.
Последним шагом будет указать боту на то, что обработка команды закончена. Для этого указываем команду answer_callback_query .
После всех методов необходимо добавить последнюю строчку, которая отвечает за непрерывное продолжение работы бота:
botTimeWeb.infinity_polling()
Бот создан. Сохраните файл с кодом и переходите к его запуску.
Шаг 4. Запуск бота
Откройте терминал и выполните запуск проекта:
python main.py
Теперь бот запущен, можно переходить в Telegram и тестировать его.
Для дополнительной безопасности и стабильности рекомендуется запускать бота на виртуальном сервере. Арендовать надежный облачный сервер можно на Timeweb Cloud .
Шаг 5. Тестирование бота
Откроем Telegram и перейдем к созданному боту, используя поиск и короткое имя, которое указывалось на первом шаге.
Для начала работы нажмем «Запустить» внизу экрана.
Бот обработает команду и выведет приветственное сообщение.
Для продолжения работы с ботом нажмем кнопку под сообщением.
Бот среагирует на нажатие кнопки и выведет следующее сообщение. Под ним также отображается кнопка, которая содержит ссылку на сайт компании. Проверим ее работоспособность.
В ответ на нажатие кнопки бот предложит перейти по ссылке. Нажимаем «Перейти» и переходим на сайт компании.
Заключение
Мы рассмотрели, как создать бота в Telegram на Python пошагово — от его регистрации до запуска. Вы можете не останавливаться на достигнутом, а подробно изучить возможности используемой библиотеки и продолжить наполнять свой первый бот необходимым функционалом.
Бот в Telegram на Питоне от А до Я
В социальных сетях и мессенджерах огромную популярность набрали так называемые боты. Они пишутся на разных языках программирования, внедряются в ПО и активно применяются на практике.
В данной статье будет рассказано о том, как написать простой бот на Python. А еще – рассмотрены особенности соответствующего ЯП, преимущества и недостатки упомянутого «виджета». Примеры будут приведены на основе Telegram. Здесь bot – это весьма распространенное явление.
Бот – это…
Это специализированный робот-помощник. Он помогает выполнять любые рутинные занятия. Боты способны реализовывать программные коды, которые будут отвечать за активацию разных команд со стороны пользователей.
Переписка с таким ПО осуществляется непосредственно через чат. Клиент дает боту команды, которые он обрабатывает и выполняет в режиме 24/7. Ключевая задача “робота» – дать ответ на вопрос клиента, опираясь на заданную программу. С помощью оных удается экономить не только время, но и остальные ресурсы.
Умения
Бот Телеграмм умеет многое. Сегодня к спектру его навыков относят следующие моменты:
- проведение обучения;
- развлечение публики;
- предложение и запуск «мини-игр»;
- работа с поисковыми системами в пределах Сети;
- скачивание данных – фото, видео, аудио, документов;
- выступать в качестве напоминалки;
- участие в групповых чатах для решения заранее определенного спектра задач (пример – согласование оптимального времени встречи);
- комментирование постов и статей;
- использование функций управления умным домом и другими подобными устройствами.
Bots – это связующее звено между пользователями и интернетом, а также конкретной компанией. Пользоваться ими не очень трудно. Первое, что нужно сделать – это определиться со спектром задач, поручаемых боту. После – написать грамотный код и внедрить его в мессенджер. Это способен сделать даже начинающий разработчик.
Преимущества и недостатки
Как и любое другое ПО, bot – это «виджет», который имеет ряд сильный и слабых сторон. Их предстоит учитывать каждому, кто хочет подключить соответствующего «помощника» в своем чате/диалоге.
Сильные стороны
К преимуществам ботов Телеграм относят:
- круглосуточную помощь – функционирование bots прекратят только в случае аварий на серверах, которые случаются крайне редко;
- удобство и простоту использования – для большинства команд достаточно выбрать из предложенного списка подходящую операцию;
- мгновенное получение ответа;
- отсутствие требований к мощности задействованного устройства – это связано с тем, что для работы ботов используются возможности сторонних серверов;
- высокий уровень безопасности;
- отсутствие необходимости инициализации дополнительного ПО для запуска рассматриваемого вида «помощника».
Ботов применять удобно и интересно. Они упрощают жизнь и владельцу чата/компании, и непосредственным клиентам/участникам диалога.
Слабые стороны
Минусы у такого ПО тоже есть, но они не слишком весомые:
- составлять bot должен программист – тот, кто далек от данной сферы деятельности, будет долго разбираться в принципах коддинга;
- писать бота лучше на одном языке – через Питон;
- нужно заранее хорошо продумать навигационное меню – тем, кто раньше не имел дела с подобным контентом, может потребоваться немало времени для этого.
Бот должен быть полезным, отвечать потребностям ЦА, а также целям владельца чата. Составить его удастся «с нуля» за 15-30 минут. Особенно если придерживаться определенного алгоритма действий.
Почему Питон
Python – универсальный язык программирования с возможностью использования принципов ООП. Он обладает простым и понятным синтаксисом, освоить который еще проще, зная английский.
Бот, написанный на Python, будет отличаться скоростью, безопасностью и стабильностью. Сам ЯП предусматривает следующие преимущества:
- функциональность;
- разделение итоговой кодификации на блоки, что позволяет значительно повысить ее читаемость;
- поддержка длинной арифметики;
- кроссплатформенность;
- огромное количество библиотек, которые смогут выручить в любое время;
- понятный синтаксис.
Это – идеальный вариант для веб-разработки, приложений для мессенджеров и мелких проектов. Крупные и масштабные игры на чистом Python составить не получится. Для этого предстоит подучить Java или C++.
Составление софта
Bot – это просто и удобно. Телеграм позволяет внедрять и искать такие «виджеты» без особого труда. Хорошего бота удастся составить менее чем за час. Главное – придерживаться определенного алгоритма действий.
Принцип
Перед непосредственной разработкой необходимо разобраться в том, как все будет работать. Bot для «Телеги» функционирует по определенным принципам. Пример будет рассмотрен на компьютере и Telegram-клиенте.
Стоит обратить внимание на следующее:
- На компьютере есть интерпретатор Python. Также на устройство необходимо поставить сервер Телеграмма и клиент.
- Внутри интерпретатора будет функционировать программа-бот. Она будет отвечать за весь софт: в оной прописана логика и шаблоны, а также возможные операции.
- Внутри приложения, написанного через Питон, имеется библиотека, отвечающая за связь с сервером Telegram. В нее нужно вшить секретный ключ. Это поможет указать серверу клиента, что программа связана с конкретным ботом.
- Когда клиент с «Телегой» осуществляет запрос гороскопа, bot осуществляет выгрузку на сервер, а сервер – выводит результат на компьютер.
- Запрос будет проходить обработку через утилиту на Python, дает ответ на сервер Телеграмма.
- Сервер передает необходимый результат непосредственному пользователю.
Bot внедряется без особого труда. Описанный принцип действий актуален не только для гороскопов. Он подойдет для bot любого вида в мессенджере.
Краткий план – пошагово
Чтобы bot Телеграм работал, можно представить процедуру его подключения так:
- Провести регистрацию нового бота в мессенджере.
- Установить Питон-библиотеку для работы с Telegram.
- Добавить библиотеку в программу с гороскопом.
- Научить bot реагировать на сообщения в пределах чата.
- Прописать там же кодификацию, которая отвечает за кнопки выбора знака зодиака.
- Сделать так, чтобы при клике по кнопке отображался гороскоп выбранного варианта.
Каждый этап предусматривает собственные нюансы и особенности, о которых должен помнить каждый разраб. Иначе справиться с поставленной задачей не получится.
Регистрация
Для того, чтобы зарегистрировать нового бота в Телеграмме, нужно:
- Открыть соответствующий мессенджер.
- При помощи командной строки найти @BotFather. Он несет ответ за регистрацию нового bot.
- Кликнуть по надписи Start, а также указать команду / newbot.
- Система задаст поочередно вопросы о названии бота и его ника. Имя должно быть уникальным. С первого раза установить его не всегда получается.
На этом первый этап подготовки завершен. Можно двигаться дальше.
Библиотека и ее инициализация
Следующий этап – это установка подходящей библиотеки Python. Работать с «Телегой» можно через telebot. Второй вариант – это инициализация Webhook. Первый вариант проще, поэтому заострим внимание на нем:
- Запустить командную строку от имени администратора на устройстве.
- Набрать команду pip install pytelegrambotapi.
- Подтвердить обработку операции.
- Чтобы приложение понимало бота, в самое начало кода требуется добавить: import telebot;
- Bot = telebot.TeleBot(«токен»);.
- Вместо слова «токен» вставить настоящий токен, выданный @BotFather.
- Открыть программу гороскопа и добавить ее.
Перед тем, как импортировать приложение гороскопа, необходимо его написать. Сделать его требуется на Питоне.
Гороскоп программа
Вот так будет выглядеть код приложения, который отвечает за отображение информации о гороскопах. Создается контент в программной среде Питона:

Сразу после формирования ПО можно приступить к следующему этапу настройки.
Реакции
Bot должен реагировать на слово «Привет». После него будет выдана реакция на соответствующую фразу. Чтобы все работало нормально, необходимо добавить после строчек импорта новый метод. Он отвечает за соответствующую операцию:
@bot.message_handler(content_types=['text']) def get_text_messages(message): if message.text == "Привет": bot.send_message(message.from_user.id, "Привет, сейчас я расскажу тебе гороскоп на сегодня.") elif message.text == "/help": bot.send_message(message.from_user.id, "Напиши Привет") else: bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")

- Добавить после метода строку типа: bot.polling(none_stop=True, interval=0) .
- После ее добавления у бота будет постоянно проверяться наличие новых сообщений.
- Прописать код, который предполагает работу с кнопками. Сначала осуществляется вывод всех знаков зодиака. При клике по конкретной – отображается гороскоп оного.
- Добавить обработчик кнопок. Он будет реагировать на слово zodiac. При написании оного в программе отобразится случайный текст:
# Обработчик нажатий на кнопки @bot.callback_query_handler(func=lambda call: True) def callback_worker(call): # Если нажали на одну из 12 кнопок — выводим гороскоп if call.data == "zodiac": # Формируем гороскоп msg = random.choice(first) + ' ' + random.choice(second) + ' ' + random.choice(second_add) + ' ' + random.choice(third) # Отправляем текст в Телеграм bot.send_message(call.message.chat.id, msg)
- Можно убрать кодификацию, которая ранее отвечала за вывод знаков зодиака в консоли. После очистки получится приложение:


На этом рассматриваемый «помощник» окончен. Теперь все должно нормально работать. Остается запустить его в Телеграме и получить тот или иной результат.
Команды управления
«Помощник» имеет разные функции и команды. Они пишутся через знак «слеш» («/») прямо в сообщении чата. Вот основные операции:
- /start – начать работу помощника;
- /help – вывод помощи на экран;
- /settings – открыть настройки.
Некоторые подобные «дополнения» способны понимать команды на русском языке. Пример – запрос у робота Антона, который «подрабатывает» в Гидрометцентре. Если при общении с ним прописать «Погода Калининград», будет выведен соответствующий результат.
Почему «молчит»
Иногда бывает так, что «помощник» не отвечает. Такое наблюдается при вводе любой команды/выбора подходящего варианта из меню. Данное явление может происходить по нескольким причинам:
- Проблемы и неполадки на сервере. Пример – сбой или полный отказ оного от функционирования.
- Ошибки при написании кодификации. Распространенное явление среди новичков.
- Ввод команды, которую Телеграм бот на Python не понимает. В этом случае можно воспользоваться Google для поиска подходящих операций и их форматов.
Иногда помогает полное отключение и перезапуск «помощника».
Как быстро освоить Python
Питон и его возможности можно выучить в ВУЗе, техникуме или самостоятельно поисках материалы в Сети. Вот видео по боту в «Телеге». Самообразование – один из лучших, но долгих методов обучения.
А чтобы надписи типа examples, def get, main() и другие не доставляли хлопот, стоит пройти дистанционные курсы. Их преимущества:
- Доступность. Обучение можно проводить в любом месте и в любое время, имя под рукой интернет.
- Разнообразие направлений. Есть предложения для новичков и опытных программеров.
- Срок обучения – до 12 месяцев. За это время пользователь сможет освоить даже несколько направлений.
- Хорошо продуманная программа, подпитанная практикой и кураторством опытных разработчиков.
По завершении процесса пользователь получит сертификат, подтверждающий навыки и познания в выбранной области.
