Начнем с того, что библиотек для разработки телегам-ботов на Python несколько, я упомяну основные три. В первой части статьи будет небольшой обзор этих библиотек (примеры кода тут будут для красоты, не пугайтесь, ниже будет пошаговый Гайд по одной конкретной библиотеке), потом комментарий о том, какую стоит выбрать для разработки конкретно своего бота и подробное руководство для новичков по разработке бота с разбором каждой строчки кода.
Примечание
Интернет считает, что одной из самых распространенных и простых библиотек является python-telegram-bot (хотя я отдаю предпочтение следующим двум).
Более того, по опыту мне кажется, именно про эту библиотеку написано больше всего статей, гайдов и видео на ютубе - что для начала изучения самое то.
Установите библиотеку Telebot с помощью pip, выполнив команду в командной строке или терминале (ее нужно выполнить только один раз, а не при каждом запуске бота):
pip install pyTelegramBotAPI
Шаг 2: Получите токен доступа для вашего бота
Обратите внимание на галочку!
Создайте нового бота, следуя инструкциям 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: сработает только если в чат придет изображение, аналогично условие со стикером.
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)
Давайте разберем, что делает каждая часть кода, заодно повторим сказанное ранее:
@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)
Примечание
Интернет считает, что одной из самых распространенных и простых библиотек является python-telegram-bot (хотя я отдаю предпочтение следующим двум).
- python-telegram-bot:
- Официальная библиотека от Telegram для разработки ботов на Python.
- Предоставляет простой и удобный интерфейс для работы с Telegram API.
- Поддерживает обработку команд, обновлений, отправку сообщений и многое другое.
- Содержит детализированную документацию и активное сообщество на GitHub.
- Установка:
Пример использования:
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() - aiogram:
- Асинхронная библиотека для работы с Telegram API.
- Предоставляет удобный интерфейс для работы с обновлениями, сообщениями, командами и другими элементами бота.
- Поддерживает интеграцию с базами данных, веб-сервисами и другими внешними ресурсами
- Установка:
Пример использования:
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 разработчики). Для начала пути в разработке ботов эта библиотека подойдет только разработчикам с опытом. - pyTelegramBotAPI:
- Простая библиотека для работы с Telegram Bot API.
- Предоставляет удобные функции для отправки сообщений, обработки команд и других событий.
- Легко использовать и поддерживать.
- Установка:
Пример использования:
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)
Давайте разберем, что делает каждая часть кода, заодно повторим сказанное ранее:
- bot.message_handler(commands=['start']):
Эта строка указывает, что функция handle_start будет обрабатывать сообщения, содержащие команду /start. Таким образом, когда пользователь отправляет боту команду /start, будет вызвана функция handle_start. - def handle_start(message)::
Это объявление функции handle_start, которая принимает один аргумент message. В данном случае, message представляет собой объект, содержащий информацию о входящем сообщении от пользователя. - Создание клавиатуры:
- 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): Кнопки добавляются к клавиатуре.
- Отправка сообщения с клавиатурой:
bot.reply_to(message, 'Привет! Я бот.', reply_markup=keyboard): Бот отправляет ответное сообщение на сообщение пользователя (message). Текст ответа - 'Привет! Я бот.'. Также в этом сообщении используется клавиатура 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)
Итоговый код
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)
Для просмотра ссылки необходимо нажать
Вход или Регистрация