|
Теги. bot теги. Бот создан, настроен, но как его запустить Если сейчас мы перейдём в нашего бота и запустим его, то мы получим Ничего мы и не получим, т к. мы только создали бота
Бот создан, настроен, но как его запустить? Если сейчас мы перейдём в нашего бота и запустим его, то мы получим: Ничего мы и не получим, т.к. мы только создали бота. Для того чтобы бот работал, мы должны написать инструкции - код. Давайте так и сделаем. Сначала копируем токен нашего бота, который мы получили при создании. Также токен можно получить в разделе API Token. Создадим простого бота, отвечающего на команду /start, с помощью этой библиотеки: import telebot bot = telebot.TeleBot('5075350812:AAGy8o0l_qazRaTXtMJJrxzyQ5hCDMIWP-Q') @bot.message_handler(commands=['start']) def start(message): bot.send_message(message.chat.id, 'Как круто, это же мой первый бот!') bot.polling() ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Давайте построчно разберём что происходит: import telebot подключает библиотеку pyTelegramBotAPI Происходит инициализация бота Декоратор @message_handler реагирует на входящие сообщение. В данном случае при отправке боту команды /start запустится функция start(message) Описываем функцию start(message). Message – это объект из Bot API, содержащий в себе информацию о сообщении. Внутри функции start(message) отправляем сообщение 'Как круто, это же мой первый бот!' в чат с особым идентификатором (message.chat.id - идентификатор чата) Функция send_message принимает идентификатор чата (берем его из сообщения) и текст для отправки. bot.polling() - Бот работает и ждёт команд Включим этот скрипт и проверим что будет с нашим ботом. Ничего не происходит, бот не ответил на старое сообщение, отправляем снова команду /start: ------------------------------------------------------------------------------------------------------------------------------------------------------------------ Чтобы получить информацию о пользователе мы можем использовать: Идентификатор чата - message.chat.id Идентификатор пользователя - message.from_user.id Текст сообщения - message.text Имя - message.from_user.first_name Фамилия - message.from_user.last_name Псевдоним - message.from_user.username Тип чата - message.chat.type Идентификатор сообщения - message.id Тип контента сообщения - message.content_type ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Отправка сообщений и ответы на сообщения Для отправки сообщения мы используем метод: bot.send_message(message.chat.id, 'Как круто, это же мой первый бот!') Но что делать если мы хотим ответить на отправленное сообщение? Для этого мы будем отправлять ответ на сообщение, которое к нам пришло: bot.reply_to(message, 'Как круто, это же мой первый бот!') Также в декоратор мы можем добавить свою функцию с проверкой сообщения, например, если мы хотим, чтобы бот отвечал на все сообщения, то мы можем сделать так: @bot.message_handler(func=lambda m: True) def echo_all(message): bot.reply_to(message, message.text) На самом деле он будет отвечать только на все текстовые сообщения. Причина этого будет разобрана в следующем уроке. Если мы хотим, чтобы бот ответил на какое-то определённое сообщение то можем сделать так: @bot.message_handler(func=lambda m: m.text == 'SnorovkaSchool') def echo_all(message): bot.reply_to(message, message.text) bot.polling() Можно придумать любую проверку, которую мы хотим. ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Message handlers Мы уже быстро пробежались по обработчикам, но давайте разберём их более детально. Порядок выполнения Важно: все обработчики проверяются в том порядке, в котором они были объявлены Обработчики выполняются сверху вниз. Если сообщение подходит под условие одного из обработчиков - проверка остановится. Например: @bot.message_handler(commands=['start']) def start(message): bot.send_message(message.chat.id, 'Это /start') #выполняется только верхний хендлер и проверка останавливается @bot.message_handler(func = lambda message: True) def all_messages(message): bot.send_message(message.chat.id, 'Это любое сообщение') /start подходит и к нижнему хендлеру, т.к. он принимает любое сообщение, и к верхнему. Но проверка останавливается на верхнем. Это можно сравнить с if...elif. Если какое-то условие выполнилось - другие проверяться не будут. Обработчики сообщений состоят из одного или нескольких фильтров. Имя функции под обработчиком не имеет никаких ограничений. Любое имя функции разрешено с обработчиками сообщений. Функция должна принимать не более одного аргумента, который будет сообщением. Фильтры обработчиков Фильтры — это список аргументов ключевого слова. Фильтр объявляется следующим образом: имя=аргумент. Один обработчик может иметь несколько фильтров. TeleBot поддерживает следующие фильтры: Имя Аргумент(ы) Условие content_types Список строк True если message.content_type в списке строк. regexp Регулярное выражение как строка True если re.search(regexp_arg) возвращает True и message.content_type == 'text' commands Список строк True если message.content_type == 'text' и message.text начинается с команды, которая есть в списке строк. chat_types Список chat types True если message.chat.type в вашем фильтре func Функция True если функция возвращает True Вот несколько примеров использования обработчиков: import telebot bot = telebot.TeleBot("TOKEN") # обрабатывает все текстовые сообщения, что содержат команды '/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 # Обрабатывает все сообщения, при которых lambda возвращает True @bot.message_handler(func=lambda message: message.document.mime_type == 'text/plain', content_types=['document']) def handle_text_doc(message): pass # Лямбда-функция сверху может быть также заменена следующей функцией: def test_message(message): return message.document.mime_type == 'text/plain' @bot.message_handler(func=test_message, content_types=['document']) def handle_text_doc(message): pass # Также обработчики можно «ставить» друг на друга # Функция выполнится если хотя бы один из обработчиков пройдёт проверку. # В примере снизу функция будет вызвана если текст сообщения будет 1 или будет использована команда /hello @bot.message_handler(func = lambda message: message.text == '1') @bot.message_handler(commands=['hello']) def send_something(message): pass ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- content_types У объекта Message также есть аттрибут content_type, который определяет тип сообщения. content_type может быть одним из следующих: text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message. Можно добавить неколько типов в одну функцию, например: content_types=["text", "sticker", "pinned_message", "photo", "audio"] Пример использования content_types: # Обрабатывает все отправленные документы и аудиофайлы @bot.message_handler(content_types=['document', 'audio']) def handle_docs_audio(message): pass У параметра content_types всегда стоит значение по умолчанию - ["text"], даже если вы его не указывали. То есть если вы написали хендлер из прошлого урока: @bot.message_handler(func=lambda m: True) def echo_all(message): bot.reply_to(message, message.text) то он будет отвечать только на текстовые сообщения. Такой хендлер будет соответствовать следующему: @bot.message_handler(func=lambda m: True, content_types=['text']) def echo_all(message): bot.reply_to(message, message.text) Поэтому если вы хотите реагировать на что-то кроме текстового сообщения - вам в любом случае придётся работать с content_types. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|