Пишем бота для Telegram. Урок 1,5. Работа с библиотекой pyTelegramBotAPI

Прежде, чем мы двинемся вперёд, хотелось бы обратить ваше внимание на особенности работы с pyTelegramBotAPI, оберткой, которую мы будем в дальнейшем использовать.

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

Декораторы

В прошлом уроке мы создавали так называемого “слушателя”, в котором обрабатывали входящее сообщение. Это, несомненно, круто, но как только наш бот начинает расти, это становится проблемой. В огромном количестве конструкций 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(chat_id, "Choose one letter:", reply_markup=markup)
Кастомная клавиатура

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

На этом всё, в следующем уроке мы напишем настоящего бота!


Originally published at groosh-code.tumblr.com.