Пишем Telegram бота на Python

1802
Пишем Telegram бота на Python
Пишем Telegram бота на Python

Часть 1: Регистрация бота

Проще всего зарегистрировать бота через @BotFather, отправив ему команду /start или /newbot и заполнив поля с названием и коротким именем бота. Затем получите токен бота и сохраните его надежно, так как он необходим для авторизации и взаимодействия с ботом.

Часть 2: Подготовка к написанию кода

Как уже упоминалось в заголовке, мы будем создавать бота на Python. В этой статье мы рассмотрим использование библиотеки PyTelegramBotAPI (Telebot). Если вы еще не установили Python, то необходимо сделать это. В терминале Linux для установки Python нужно ввести…

sudo apt-get install python python-pip

Если вы используете операционную систему Windows, вам нужно скачать Python с официального сайта.

Затем, в случае использования Linux, откройте терминал, а для Windows — командную строку, и введите…

pip install pytelegrambotapi

Часть 3: Получаем сообщения и говорим «Привет»

Откройте свой предпочитаемый текстовый редактор и начните писать код для создания бота! Вначале необходимо импортировать нашу библиотеку и подключить токен бота:

import telebot;
bot = telebot.TeleBot('%ваш токен%');

Теперь создадим функцию для получения текстовых сообщений:

@bot.message_handler(content_types=['text'])
def get_text_messages(message):

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

@bot.message_handler(content_types=['text', 'document', 'audio'])

Код будет реагировать на текстовые сообщения, документы и аудио. Дополнительную информацию можно найти в официальной документации.

Теперь добавим некоторый функционал в наш метод: если пользователь отправит сообщение «Привет», то мы отправим ему ответ «Привет, чем я могу вам помочь?», а если пользователь отправит команду «/help», то мы попросим его отправить сообщение «Привет»:

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)

Теперь наш бот будет постоянно проверять у сервера Telegram, есть ли новые сообщения для нашего бота. Если мы отправим сообщение нашему боту, Telegram передаст его боту. Сохраните файл, и запустите его в консоли.

python bot.py

Где bot.py – имя нашего файла.

Теперь вы можете отправить сообщение боту и посмотреть на результат.

Часть 4: Кнопки и ветки сообщений

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

name = '';
surname = '';
age = 0;
@bot.message_handler(content_types=['text'])
def start(message):
    if message.text == '/reg':
        bot.send_message(message.from_user.id, "Как тебя зовут?");
        bot.register_next_step_handler(message, get_name); #следующий шаг – функция get_name
    else:
        bot.send_message(message.from_user.id, 'Напиши /reg');

def get_name(message): #получаем фамилию
    global name;
    name = message.text;
    bot.send_message(message.from_user.id, 'Какая у тебя фамилия?');
    bot.register_next_step_handler(message, get_surnme);

def get_surname(message):
    global surname;
    surname = message.text;
    bot.send_message('Сколько тебе лет?');
    bot.register_next_step_handler(message, get_age);

def get_age(message):
    global age;
    while age == 0: #проверяем что возраст изменился
        try:
             age = int(message.text) #проверяем, что возраст введен корректно
        except Exception:
             bot.send_message(message.from_user.id, 'Цифрами, пожалуйста');
      bot.send_message(message.from_user.id, 'Тебе '+str(age)+' лет, тебя зовут '+name+' '+surname+'?')

Таким образом, мы сохранили данные пользователя. В этом примере показана очень упрощенная версия сохранения данных, на самом деле данные и состояния пользователя должны храниться в базе данных. Однако, сегодня мы работаем с ботом, а не с базами данных. Последнее дополнение — запросим у пользователя подтверждение того, что все данные введены правильно. Для этого немного изменяем код метода get_age, добавив кнопки:

def get_age(message):
    global age;
    while age == 0: #проверяем что возраст изменился
        try:
             age = int(message.text) #проверяем, что возраст введен корректно
        except Exception:
             bot.send_message(message.from_user.id, 'Цифрами, пожалуйста');
      keyboard = types.InlineKeyboardMarkup(); #наша клавиатура
      key_yes = types.InlineKeyboardButton(text='Да', callback_data='yes'); #кнопка «Да»
      keyboard.add(key_yes); #добавляем кнопку в клавиатуру
      key_no= types.InlineKeyboardButton(text='Нет', callback_data='no');
      keyboard.add(key_no);
      question = 'Тебе '+str(age)+' лет, тебя зовут '+name+' '+surname+'?';
      bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)

Теперь наш бот отправляет клавиатуру, но если пользователь на нее нажмет, то ничего не произойдет. Это происходит потому, что мы не написали метод-обработчик. Давайте создадим его:

@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
    if call.data == "yes": #call.data это callback_data, которую мы указали при объявлении кнопки
        .... #код сохранения данных, или их обработки
        bot.send_message(call.message.chat.id, 'Запомню : )');
    elif call.data == "no":
         ... #переспрашиваем

Теперь нам нужно добавить одну строку в начало файла:

from telebot import types

Теперь сохраняем и запускаем нашего бота.

Еще один альтернативный вариант создания бота Telegram на Python (Видео инструкция)