Работа с библиотекой pyTelegramBotAPI

Хотелось бы обратить ваше внимание на особенности работы с pyTelegramBotAPI, оберткой, которую мы будем использовать.

Те, кто используют другую обертку или вообще пишут на другом ЯП, могут спокойно прекратить чтение, съесть ещё этих мягких французских булочек и выпить чаю.

Декораторы

В уроке №1 мы создавали так называемого "слушателя", в котором обрабатывали входящее сообщение. Это, несомненно, круто, но как только наш бот начинает расти, это становится проблемой. В огромном количестве конструкций if-elif-else можно легко запутаться. Для решения этой проблемы автор библиотеки написал хэндлеры (или декораторы, кому как проще). Давайте сразу рассмотрим их на примере.

# Обработчик команд '/start' и '/help'.
@bot.message_handler(commands=['start', 'help'])
def handle_start_help(message):
pass
# Обработчик для документов и аудиофайлов
@bot.message_handler(content_types=['document', 'audio'])
def handle_docs_audio(message):
pass
#Обработчик сообщений, подходящих под указанное регулярное выражение
@bot.message_handler(regexp="SOME_REGEXP")
def handle_message(message):
pass
# Обработчик сообщений, содержащих документ с mime_type 'text/plain' (обычный текст)
@bot.message_handler(func=lambda message: message.document.mime_type == 'text/plain', content_types=['document'])
def handle_text_doc(message):
pass

Таким образом, мы можем разнести код по различным функциям и не кучковать его в одном месте, что повышает читабельность. Обратите внимание: декораторы будут проверяться в порядке их следования в коде, по принципу "какой первый подошел, тот и используем". Под "подошел" будем понимать равенство нашей лямбда-функции значению True.

В итоге, код из первого урока можно переписать так:

# -*- coding: utf-8 -*-
import time
import telebot
from lesson_01 import config
bot = telebot.TeleBot(config.token)
@bot.message_handler(func=lambda message: True, content_types=['text'])
def echo_msg(message):
bot.send_message(message.chat.id, message.text)
if __name__ == '__main__':
bot.polling(none_stop=True)

Как видите, не так уж и сложно!

Кастомные клавиатуры

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

from telebot import types
markup = types.ReplyKeyboardMarkup()
markup.row('a', 'v')
markup.row('c', 'd', 'e')
bot.send_message(message.chat.id, "Choose one letter:", reply_markup=markup)
Simple custom keyboard

Создаем объект типа ReplyKeyboardMarkup(), добавляем построчно элементы (или можно сделать автоматическое разделение на строки при помощи аргумента row_width, но это выходит за рамки урока), передаем полученную разметку в метод send_message(). Если же мы хотим убрать кастомную клавиатуру вообще, заменив её на кнопочку [/], то вместо объекта ReplyKeyboardMarkup()надо создать объект ReplyKeyboardRemove() и просто передать его в send_message(). Всё просто!