Как стать автором
Обновить

Учимся создавать простых ботов или туториал по библиотеке TeleBot

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров39K

Начнем с того, что библиотек для разработки телегам-ботов на Python несколько, я упомяну основные три. В первой части статьи будет небольшой обзор этих библиотек (примеры кода тут будут для красоты, не пугайтесь, ниже будет пошаговый Гайд по одной конкретной библиотеке), потом комментарий о том, какую стоит выбрать для разработки конкретно своего бота и подробное руководство для новичков по разработке бота с разбором каждой строчки кода.

Примечание

Пока я писала эту статью, наткнулась на классный гайд от телеграм, где приведен список всех существующих библиотек для разработки ботов для всех языков программирования

Интернет считает, что одной из самых распространенных и простых библиотек является python-telegram-bot (хотя я отдаю предпочтение следующим двум).

  1. python-telegram-bot:

    • Официальная библиотека от Telegram для разработки ботов на Python.

    • Предоставляет простой и удобный интерфейс для работы с Telegram API.

    • Поддерживает обработку команд, обновлений, отправку сообщений и многое другое.

    • Содержит детализированную документацию и активное сообщество на GitHub.

    Установка:

    pip install python-telegram-bot

    Пример использования:

    from telegram import Update
    from telegram.ext import Updater, CommandHandler, CallbackContext
    
    def start(update: Update, context: CallbackContext) -> None:
        update.message.reply_text("Здорова, брат! Я бот. Как сам?")
    
    updater = Updater('YOUR_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('start', start))
    
    updater.start_polling()
    updater.idle()
  2. aiogram:

    • Асинхронная библиотека для работы с Telegram API.

    • Предоставляет удобный интерфейс для работы с обновлениями, сообщениями, командами и другими элементами бота.

    • Поддерживает интеграцию с базами данных, веб-сервисами и другими внешними ресурсами

    Установка:

    pip install aiogram

    Пример использования:

    import logging
    from aiogram import Bot, Dispatcher, types
    from aiogram.types import ParseMode
    
    API_TOKEN = 'YOUR_TOKEN'
    
    logging.basicConfig(level=logging.INFO)
    
    bot = Bot(token=API_TOKEN)
    dp = Dispatcher(bot)
    
    @dp.message_handler(commands=['start'])
    async def send_welcome(message: types.Message):
        await message.reply("Здорова, брат! Я бот. Как сам?")
    
    if __name__ == '__main__':
        from aiogram import executor
        executor.start_polling(dp, skip_updates=True)

    aiogram позволяет создавать крутых, многофункциональных коммерческих ботов, но до нее еще нужно дорасти. Вы уже должны отлично владеть навыками написания кода (что-то большее, чем решение задачек на степике) и понимать, что такое асинхронность (что знают даже не все Junior разработчики). Для начала пути в разработке ботов эта библиотека подойдет только разработчикам с опытом.

  3. pyTelegramBotAPI:

    • Простая библиотека для работы с Telegram Bot API.

    • Предоставляет удобные функции для отправки сообщений, обработки команд и других событий.

    • Легко использовать и поддерживать.

    Установка:

    pip install pyTelegramBotAPI

    Пример использования:

    import telebot
    
    bot = telebot.TeleBot('YOUR_TOKEN')
    
    @bot.message_handler(commands=['start'])
    def handle_start(message):
        bot.send_message(message.chat.id, "Здорова, брат! Я бот. Как сам?")
    
    bot.polling(none_stop=True)
    

Выше вы видите три примера кода, выполняющие одну и туже задачу, но с использованием разных библиотек. Чисто визуально уже можно заметить, что последний код выглядит гораздо проще и это правда. Для старта в разработке и создании простых ботов, и я имею ввиду не просто Привет-Пока, с большой вероятностью если вы разрабатываете бота для себя или даже для своего блога, бизнеса или курсов и он не будет включать в себя авторизацию, функции обработки платежей, работы с огромными базами данных и тысячи пользователей - этой библиотеки вам хватит.

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

Туториал по библиотека TeleBot

Шаг 1: Установка библиотеки Telebot

Установите библиотеку Telebot с помощью pip, выполнив команду в командной строке или терминале (ее нужно выполнить только один раз, а не при каждом запуске бота):

pip install pyTelegramBotAPI

Шаг 2: Получите токен доступа для вашего бота

Откройте приложение Telegram и найдите @BotFather - официального бота для создания новых ботов.

Обратите внимание на галочку!
Обратите внимание на галочку!

Создайте нового бота, следуя инструкциям BotFather.

Получите токен доступа для вашего бота.

нам нужна вот эта строчка из цифр и букв, это и есть токен
нам нужна вот эта строчка из цифр и букв, это и есть токен

Обратите внимание, что в начале последнего сообщения вам еще выдали ссылку на ваш бот - не потеряйте ее.

Шаг 3: Импорт и настройка библиотеки Telebot

Импортируйте библиотеку Telebot в свой код:

import telebot

Создайте объект бота, используя полученный токен:

Вместо 'YOUR_TOKEN' вставляем токен, полученный от BotFather. Так мы свяжем бота, созданного в телеграм с ботом, код которого мы пишем.

bot = telebot.TeleBot('YOUR_TOKEN')

Шаг 4: Создание обработчиков команд и сообщений

Определите функцию-обработчик bot.message_handler для команд и сообщений, которые бот будет получать и обрабатывать (по сути, добавив эту строчку кода над како-либо функцией, мы говорим, что это не просто функция - а специальная функция, которая будет срабатывать когда бот получит какую-то команду, сообщение, стикер, фотографию и тд).

Сейчас мы указали, что данный обработчик будет обрабатывать команду \start (написали в скобках commands = ['start'])и далее описали функцию, которая будет срабатывать при отправке этой команды боту. Наш бот ответит пользователю в чате 'привет-привет! Напиши что-нибудь'.

@bot.message_handler(commands = ['start'])
def start(message):
  bot.send_message(message.chat.id, 'привет-привет! Напиши что-нибудь')

bot.send_message - функция отправки ботом сообщения в чат. А вот в какой чат? Нам нужно отправить в тот же, откуда пришло сообщение от пользователя - для этого мы в скобках первым параметром указываем message.chat.id, по сути передаем айди нужного нам чата. А дальше указываем строку-сообщение, которое отправит бот.

Шаг 5: Запуск бота

Запустите бота, чтобы он начал прослушивать события и реагировать на них:

bot.polling()

Соберем весь код в один и запустим. 

import telebot

bot = telebot.TeleBot('')

@bot.message_handler(commands = ['start'])
def start(message):
  print(message)
  bot.send_message(message.chat.id, 'привет-привет! Напиши что-нибудь')

bot.polling(none_stop = True)

Пока код запущен, отправим нашему боту сообщение в Телеграмм - команду /start

Визуально мы увидим вот такую картину. 

Создадим эхо-бота

Определите функции-обработчики для команд и сообщений, которые бот будет получать и обрабатывать:

@bot.message_handler(commands=['start','help'])
def handle_start(message):
  bot.reply_to(message, 'Привет! Я бот.')

@bot.message_handler(func=lambda message: True)
def handle_message(message):
  bot.reply_to(message, 'Получено сообщение: ' + message.text)

Первому обработчику мы указали, что он будет обрабатывать команды, конкретно две - то есть функция handle_start, написанная ниже, будет срабатывать и на команду start и на команду help

commands=['start','help']

Во втором обработчике написана страшная строчка message_handler(func=lambda message: True) - она взята из документации и вы часто будете ее видеть.

Если разбирать сложно и подробно: эта строка кода представляет собой использование лямбда-функции для определения, должно ли обработаться входящее текстовое сообщение в телеграм-боте. В данном случае, поскольку лямбда всегда возвращает True, это означает, что все входящие текстовые сообщения будут обрабатываться функцией, к которой применяется эта лямбда.

Если разбирать просто и коротко: ставим эту строчку кода, когда хотим обрабатывать все текстовые сообщения от пользователей, ибо так гласит документация.

bot.reply_to - бот отправляет ответное сообщение на то, что пришло (это когда вы в телеграм тыкаете на сообщение и нажимаете кнопку "ответить" на него). Так как бот отвечает на конкретное сообщение, то мы передаем в скобках не айди чата, а по сути просто то сообщение, на которое нужно ответить и что нужно ответить.

message - аргументом каждой функции (в скобках после названия функции) мы видим message - по сути, это принятое от пользователя сообщение, которое мы функции передаем и она уже может делать с ним все, что хочет - достать текст сообщения (message.text), узнать айди чата (message.chat.id) и еще множество параметров: имя и ник пользователя, время, язык и тд. Сообщения, которые мы отправляем боту, несут не только ту информацию, что мы видим, а ОГРОМНОЕ количество данных о нас.

Нужно ли все время писать именно message?

Часто слышу и вижу этот вопрос от новичков. Это общепринято для удобства, но по сути это обычное название переменной и ее можно заменить на любой другое: m, mes, info, answer и тд.

Запустите свой скрипт с ботом.

import telebot

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start','help'])
def handle_start(message):
  bot.reply_to(message, 'Привет! Я бот.')

@bot.message_handler(func=lambda message: True)
def handle_message(message):
  bot.reply_to(message, 'Получено сообщение: ' + message.text)

bot.polling()

Откройте чат с вашим ботом в Telegram.

Отправьте команду "/start" или напишите ему сообщение для проверки обработки сообщений и команд.

Добавим обработку сообщений

Добавим функционал обработки сообщений, для этого нужно указакать, какие сообщения могут приходить боту (или какие мы хотим обрабатывать)

content_types=["text", "sticker", "pinned_message", "photo", "audio"]

import telebot

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def handle_start(message):
  bot.reply_to(message, 'Привет! Я бот.')

@bot.message_handler(content_types=['text', 'photo', 'sticker'])
def handle_message(message):
  
  # Ответ на текстовое сообщение
  if message.text == 'Привет':
      bot.send_message(message.chat.id, 'Привет! Как дела?')
  
  # Ответ на изображение
  if message.photo:
      bot.send_message(message.chat.id, 'Вы отправили изображение.')
  
  # Ответ на стикер
  if message.sticker:
      bot.send_message(message.chat.id, 'Вы отправили стикер.')

bot.polling()

Мы указали, что бот может обрабатывать текстовые сообщения, изображения и стикеры. content_types=['text', 'photo', 'sticker']

С помощью условий (их можно написать сколько угодно) можно обработать любые текстовые сообщения, например if message.text == 'Привет': ваш код.

if message.photo: сработает только если в чат придет изображение, аналогично условие со стикером.

Добавим боту кнопки

Шаг 1: Импорт необходимых классов и модулей (эту строчку нужно добавить в начало кода, чтобы появилась возможность добавлять кнопки)

from telebot import types

Шаг 2: Создание и отправка сообщения с клавиатурой:

@bot.message_handler(commands=['start'])
def handle_start(message):

  # Создание клавиатуры
  keyboard = types.ReplyKeyboardMarkup(row_width=2)
  button1 = types.KeyboardButton('Кнопка 1')
  button2 = types.KeyboardButton('Кнопка 2')
  button3 = types.KeyboardButton('Кнопка 3')
  keyboard.add(button1, button2, button3)

  # Отправка сообщения с клавиатурой
  bot.reply_to(message, 'Привет! Я бот.', reply_markup=keyboard)

Давайте разберем, что делает каждая часть кода, заодно повторим сказанное ранее:

  1. bot.message_handler(commands=['start']):

    Эта строка указывает, что функция handle_start будет обрабатывать сообщения, содержащие команду /start. Таким образом, когда пользователь отправляет боту команду /start, будет вызвана функция handle_start.

  2. def handle_start(message)::

    Это объявление функции handle_start, которая принимает один аргумент message. В данном случае, message представляет собой объект, содержащий информацию о входящем сообщении от пользователя.

  3. Создание клавиатуры:

    • keyboard = types.ReplyKeyboardMarkup(row_width=2): Создается объект клавиатуры ReplyKeyboardMarkup с шириной строки (row_width) равной 2. Это означает, что кнопки будут располагаться в две колонки.

    • button1 = types.KeyboardButton('Кнопка 1'): Создается кнопка с надписью 'Кнопка 1'.

    • button2 = types.KeyboardButton('Кнопка 2'): Создается кнопка с надписью 'Кнопка 2'.

    • button3 = types.KeyboardButton('Кнопка 3'): Создается кнопка с надписью 'Кнопка 3'.

    • keyboard.add(button1, button2, button3): Кнопки добавляются к клавиатуре.

  4. Отправка сообщения с клавиатурой:

    bot.reply_to(message, 'Привет! Я бот.', reply_markup=keyboard): Бот отправляет ответное сообщение на сообщение пользователя (message). Текст ответа - 'Привет! Я бот.'. Также в этом сообщении используется клавиатура keyboard, которую мы создали ранее. Таким образом, пользователю будет отправлено приветственное сообщение с прикрепленной к нему клавиатурой с тремя кнопками.

Шаг 3: Обработка нажатия на кнопку. Нажатие на кнопку обрабатывается точно так же, как и текстовое сообщение. То есть по сути, нажать на кнопку с надписью "Кнопка 1" это тоже самое, что написать и отправить боту сообщение с текстом "Кнопка 1"

@bot.message_handler(func=lambda message: True)
def handle_message(message):

  if message.text == 'Кнопка 1':
      # Действия при нажатии на кнопку 1
      bot.reply_to(message, 'Вы нажали на Кнопку 1')

  elif message.text == 'Кнопка 2':
      # Действия при нажатии на кнопку 2
      bot.reply_to(message, 'Вы нажали на Кнопку 2')

  elif message.text == 'Кнопка 3':
      # Действия при нажатии на кнопку 3
      bot.reply_to(message, 'Вы нажали на Кнопку 3')
  else:
      # Действия при получении другого сообщения
      bot.reply_to(message, 'Получено сообщение: ' + message.text)

Итоговый код

import telebot
from telebot import types

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def handle_start(message):
  # Создание клавиатуры
  keyboard = types.ReplyKeyboardMarkup(row_width=2)
  button1 = types.KeyboardButton('Кнопка 1')
  button2 = types.KeyboardButton('Кнопка 2')
  button3 = types.KeyboardButton('Кнопка 3')
  keyboard.add(button1, button2, button3)

  # Отправка сообщения с клавиатурой
  bot.reply_to(message, 'Привет! Я бот.', reply_markup=keyboard)

@bot.message_handler(func=lambda message: True)
def handle_message(message):
  if message.text == 'Кнопка 1':
      # Действия при нажатии на кнопку 1
      bot.reply_to(message, 'Вы нажали на Кнопку 1')
  elif message.text == 'Кнопка 2':
      # Действия при нажатии на кнопку 2
      bot.reply_to(message, 'Вы нажали на Кнопку 2')
  elif message.text == 'Кнопка 3':
      # Действия при нажатии на кнопку 3
      bot.reply_to(message, 'Вы нажали на Кнопку 3')
  else:
      # Действия при получении другого сообщения
      bot.reply_to(message, 'Получено сообщение: ' + message.text)

bot.polling()

Пока вы не отправите команду start, клавиатура не появится. 

Задание на отработку

Дописать бота для игры в камень-ножницы-бумага

import telebot
import random
from telebot import types


bot = telebot.TeleBot('token')


@bot.message_handler(commands=["start"])
def start(m, res=False):
    # Добавляем кнопки
    markup=types.ReplyKeyboardMarkup(resize_keyboard=True)

    # TODO добавить 3 объекта KeyboardButton для 'Камень','Ножницы','Бумага'

    # TODO добавить кнопки в клавиатуру (markup)
    
    bot.send_message(m.chat.id, 'Нажми кнопку и начни игру ',  reply_markup=markup)
        

@bot.message_handler(content_types=["text"])
def handle_text(message):
    # TODO посылать в чат случайное из списка 'Камень','Ножницы','Бумага'

bot.polling(none_stop=True, interval=0)

Решение опубликую в следующей статье! Удачи в изучении ботов!

Теги:
Хабы:
Всего голосов 6: ↑5 и ↓1+5
Комментарии10

Публикации