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

Специальный корреспондент
Собака

Собака

Пресс-служба
Команда форума
Private Club
Регистрация
13/10/15
Сообщения
55.044
Репутация
62.840
Реакции
277.292
RUB
0
Начнем с того, что библиотек для разработки телегам-ботов на 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.

efe3598d391bab39deb9d99e58553f64.png

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

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

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

Шаг 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

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


3ea05233230ef6888f725ba35b633d8d.png

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

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

@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" или напишите ему сообщение для проверки обработки сообщений и команд.

e077ec81451edf1672a94ecae29eccdb.png

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

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

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: сработает только если в чат придет изображение, аналогично условие со стикером.

07e92c3dac5ebb858a5655299e35f313.png

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

Шаг 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)
















 
  • Теги
    telebot
  • Сверху Снизу