Bot message handler что это
Перейти к содержимому

Bot message handler что это

  • автор:

Пишем простого бота-администратора для Telegram на Python. Тестируем на жене

Создание своего собственного телеграм-бота является одним из увлекательных и полезных способов практического применения программирования. Я решил создать своего бота как вариант добавления нового увлекательного проекта в свой портфолио, а также для создания комфорта и удобства для пользователей, которые используют телеграм в своей повседневной жизни.

После анализа нескольких библиотек для создания телеграм-ботов, я выбрал библиотеку Telebot, которая предоставляет богатый набор инструментов для разработки функционально-насыщенных ботов.

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

Тестировать бота мы будем с помощью моей жены.

Библиотека Telebot для телеграм ботов на Python предоставляет ряд основных функций:

  1. TeleBot(token) – конструктор класса, который принимает токен вашего бота.
  2. send_message(chat_id, text) – отправляет сообщение пользователю с указанным chatid .
  3. sendphoto(chatid, photo) – отправляет фотографию пользователю с указанным chatid.
  4. send_audio(chat_id, audio) – отправляет аудио файл пользователю с указанным chatid .
  5. senddocument(chatid, document) – отправляет документ пользователю с указанным chatid .
  6. send_video(chat_id, video) – отправляет видео пользователю с указанным chatid .
  7. sendlocation(chatid, latitude, longitude) – отправляет геопозицию пользователю с указанным chatid .
  8. reply_to(message, text) – отправляет ответ на сообщение.
  9. edit_message_text(chat_id, message_id, text) – редактирует текст сообщения.
  10. delete_message(chat_id, message_id) – удаляет сообщение.
  11. get_updates() – получает все обновления.
  12. get_chat_member(chat_id, user_id) – получает информацию о пользователе в конкретном чате.
  13. get_chat(chat_id) – получает информацию о чате.

Начнем с импорта необходимых библиотек.

import telebot # сама библиотека telebot
import time # необходим для cрока /mute и автоматического размута после срока мута

Создаем строчку для вписания токена бота, который можно получить от https://t.me/BotFather и так же создаем сам объект бота

bot = telebot.TeleBot(‘TOKEN’) # в TOKEN мы вводим непосредственно сам полученный токен.

Затем определяем словарь для хранения статистики чата.

Далее идут обработчики команд:

  • команда /start выводит приветственное сообщение.
  • команда /help выводит список доступных команд.

Словарь для хранения статистики:

Обработчик команды /start:

@bot.message_handler(commands=['start']) def start(message): bot.reply_to(message, "Привет! Я бот для управления чатом. Напиши /help, чтобы узнать, что я умею.")

Обработчик команды /help:

@bot.message_handler(commands=['help']) def help(message): bot.reply_to(message, "/kick - кикнуть пользователя\n/mute - замутить пользователя на определенное время\n/unmute - размутить пользователя\n/stats - показать статистику чата\n/selfstat - показать свою статистику")

Обработчик команды /kick:

В обработчике команды /kick проверяется, было ли оно использовано в ответ на сообщение пользователя. Если да, то определяется chat_id (идентификатор чата) и user_id (идентификатор пользователя), на которого нужно накинуть мут. Затем проверяется статус пользователя (администратор или нет). Если пользователь является администратором, то выводится сообщение, что кикнуть его невозможно. В противном случае кик происходит с помощью метода kick_chat_member() и выводится соответствующее сообщение.

@bot.message_handler(commands=['kick']) def kick_user(message): if message.reply_to_message: chat_id = message.chat.id user_id = message.reply_to_message.from_user.id user_status = bot.get_chat_member(chat_id, user_id).status if user_status == 'administrator' or user_status == 'creator': bot.reply_to(message, "Невозможно кикнуть администратора.") else: bot.kick_chat_member(chat_id, user_id) bot.reply_to(message, f"Пользователь был кикнут.") else: bot.reply_to(message, "Эта команда должна быть использована в ответ на сообщение пользователя, которого вы хотите кикнуть.")

Обработчик команды /mute и /unmute:

Обработчик команды /mute ограничивает возможности отправки сообщений выбранного пользователя на определенное количество времени. Эта команда принимает аргумент — время в минутах, на которое нужно замутить (ограничить) пользователя. Если аргумент не указан, то устанавливается значение по умолчанию — 1 минута. Если аргумент был указан, то проверяется его корректность и максимальное значение (не больше 1 дня). Если время указано верно, то с помощью метода restrictchatmember() устанавливается ограничение на отправку сообщений пользователем на заданное время. В случае успеха выводится соответствующее сообщение.

Обработчик команды /unmute снимает мут с выбранного пользователя. При этом с помощью метода restrictchatmember() включаются все возможности пользователя для отправки сообщений. В случае успеха также выводится соответствующее сообщение.

Оба обработчика проверяют, было ли вызвано данная команда в ответ на сообщение пользователя. Если да, то определяются chatid (идентификатор чата) и userid (идентификатор пользователя), на которого нужно накинуть мут. Также проверяется статус пользователя (администратор или нет). Если пользователь является администратором, то выводится сообщение, что замутить его невозможно. Если команда использована без ответа на сообщение пользователя, которого нужно замутить/размутить, то выводится соответствующее сообщение.

Обработчик команды /mute:

@bot.message_handler(commands=['mute']) def mute_user(message): if message.reply_to_message: chat_id = message.chat.id user_id = message.reply_to_message.from_user.id user_status = bot.get_chat_member(chat_id, user_id).status if user_status == 'administrator' or user_status == 'creator': bot.reply_to(message, "Невозможно замутить администратора.") else: duration = 60 # Значение по умолчанию - 1 минута args = message.text.split()[1:] if args: try: duration = int(args[0]) except ValueError: bot.reply_to(message, "Неправильный формат времени.") return if duration < 1: bot.reply_to(message, "Время должно быть положительным числом.") return if duration >1440: bot.reply_to(message, "Максимальное время - 1 день.") return bot.restrict_chat_member(chat_id, user_id, until_date=time.time()+duration*60) bot.reply_to(message, f"Пользователь замучен на минут.") else: bot.reply_to(message, "Эта команда должна быть использована в ответ на сообщение пользователя, которого вы хотите замутить.")

Тест функции /muteРезультат функции для пользователя

Обработчик команды /unmute:

@bot.message_handler(commands=['unmute']) def unmute_user(message): if message.reply_to_message: chat_id = message.chat.id user_id = message.reply_to_message.from_user.id bot.restrict_chat_member(chat_id, user_id, can_send_messages=True, can_send_media_messages=True, can_send_other_messages=True, can_add_web_page_previews=True) bot.reply_to(message, f"Пользователь размучен.") else: bot.reply_to(message, "Эта команда должна быть использована в ответ на сообщение пользователя, которого вы хотите размутить.") 

Тестируем функцию /unmute

3Обработчик команды /stats:

@bot.message_handler(commands=['stats']) def chat_stats(message): chat_id = message.chat.id if chat_id not in stats: bot.reply_to(message, "Статистика чата пуста.") else: total_messages = stats[chat_id]['total_messages'] unique_users = len(stats[chat_id]['users']) bot.reply_to(message, f"Статистика чата:\nВсего сообщений: \nУникальных пользователей: ")

Обработчик команды /selfstat:

@bot.message_handler(commands=['selfstat']) def user_stats(message): chat_id = message.chat.id user_id = message.from_user.id username = message.from_user.username if chat_id not in stats: bot.reply_to(message, "Статистика чата пуста.") else: if user_id not in stats[chat_id]['users']: bot.reply_to(message, "Вы еще не отправляли сообщений в этом чате.") else: user_messages = stats[chat_id]['users'][user_id]['messages'] total_messages = stats[chat_id]['total_messages'] percentage = round(user_messages / total_messages * 100, 2) bot.reply_to(message, f"Статистика для пользователя @:\nВсего сообщений: \nПроцент от общего количества сообщений: %")

Данный код содержит два обработчика команд: /stats и /selfstat для вывода статистики чата и статистики конкретного пользователя соответственно.

Обработчик команды /stats:

Тестируем функцию /stats

  1. Определяется chat_id текущего чата.
  2. Проверяется, есть ли статистика этого чата в словаре stats.
  3. Если статистика отсутствует, сообщается об этом.
  4. Если статистика есть, выводится общее количество сообщений в чате и количество уникальных пользователей по мнению бота.

Обработчик команды /selfstat:

Тестируем функцию /selfstat

  1. Определяется chat_id текущего чата и user_id отправителя сообщения.
  2. Проверяется, есть ли статистика этого чата в словаре stats.
  3. Если статистика отсутствует, сообщается об этом.
  4. Если статистика есть, проверяется, были ли сообщения отправлены пользователем в этом чате.
  5. Если пользователь не отправлял сообщений в чате, сообщается об этом.
  6. Если пользователь есть в статистике, выводится количество сообщений, отправленных данным пользователем в чат и процентное соотношение этого количества к общему количеству сообщений в чате.

Делаем защиту от спама по ключевым словам:

Список запрещенных слов:

bad_words = ['анкета', 'ссылка', 'уникальное предложение']

Функция для проверки наличия запрещенных слов в сообщении:

def check_message(message): for word in bad_words: if word in message.text.lower(): return True return False
@bot.message_handler(func=lambda message: True) def handle_message(message): # проверяем сообщение на наличие запрещенных слов if check_message(message): # если есть хотя бы одно запрещенное слово, кикаем пользователя bot.kick_chat_member(message.chat.id, message.from_user.id) bot.send_message(message.chat.id, f"Пользователь был удален из чата за использование запрещенных слов") else: # если запрещенных слов нет, обрабатываем сообщение дальше print(message.text)

Сначала в переменную badwords заносятся все запрещенные слова, которые будут использоваться для проверки сообщений.

Затем создается функция checkmessage , которая принимает сообщение и проверяет наличие в нем любого из запрещенных слов. Если одно из запрещенных слов есть в сообщении, функция возвращает True, иначе — False.

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

С помощью функции checkmessage проверяется каждое сообщение на наличие запрещенных слов. Если в сообщении есть запрещенное слово, то бот кикает пользователя, отправляет сообщение о причине кика и завершает обработку сообщения. Если запрещенных слов нет, то бот просто выводит сообщение в консоль.

Проверяем работу защиты от спама

И еще одна важная строчка:

Эта строчка запускает бота в бесконечном режиме ожидания новых сообщений от пользователей. Метод bot.infinity_polling() является альтернативой методу bot.polling() и запускает бота в режиме бесконечного ожидания новых сообщений. Это значит, что бот будет постоянно проверять наличие новых сообщений и обрабатывать их. Параметр none_stop=True указывает на то, что бот будет продолжать работать даже в случае ошибок или проблем с подключением. Это важно, чтобы бот всегда был доступен для пользователей и мог обрабатывать их запросы.

Заключение

Бот, созданный в рамках данной статьи, является прекрасным примером простого, но полезного бота для управления чатом в Telegram. Кроме того, такой бот может быть использован для сбора статистических данных и аналитики сообщений в чате. Для этого можно реализовать дополнительную функцию /stats, которая будет отображать различные статистические данные, например, количество сообщений за день/неделю/месяц, наиболее активных пользователей и т.д. Для обработки и анализа данных можно использовать библиотеку Pandas, которая предоставляет мощные инструменты для работы с табличными данными и статистическим анализом.

Введение, простой echo-бот

Приветствую тебя, читатель! Telegram Bot API – это мощный инструмент для вообще чего угодно. Автоматизация действий, работа с пользователями, онлайн-магазины, игры и много чего ещё. В этом учебнике мы научимся писать ботов для Telegram на языке Python.

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

Язык программирования будет Python 3, но это не означает, что любители PHP, Ruby и т.д. в пролёте; все основные принципы совпадают. Я не буду особо останавливаться на описании самого языка, желающие могут ознакомиться с документацией по Python здесь.

Подготовка к запуску

Взаимодействие ботов с людьми основано на HTTP-запросах. Чтобы не мучаться с обработкой «сырых» данных, воспользуемся библиотекой pyTelegramBotAPI, которая берет на себя все нюансы отправки и получения запросов, позволяя сконцентрироваться непосредственно на логике. Установка библиотеки предельно простая:

pip install pytelegrambotapi python3 

Скриншот из терминала с запущенным интерпретатором Python

Обратите внимание: библиотека называется pyTelegramBotAPI , а не telebot . Последнюю ставить не нужно!

Теперь можно выйти из режима Python-консоли (Ctrl+Z или Ctrl+D, или exit() )

Пишем простого echo-бота

Ну, довольно слов, перейдем к делу. В качестве практики к первому уроку, напишем бота, повторяющего присланное текстовое сообщение. Создадим каталог, а внутри него 2 файла: bot.py и config.py . Я рекомендую выносить различные константы и настройки в файл config.py , дабы не загромождать другие. В файл config.py впишем:

# Токен ненастоящий :) Подставьте свой token = '1234567890:AAE_abCDEFghijKLmNOpqRsTuVWxyz' 

Теперь надо научить бота реагировать на сообщения. Напишем обработчик, который будет реагировать на все текстовые сообщения.

@bot.message_handler(content_types=["text"]) def repeat_all_messages(message): # Название функции не играет никакой роли bot.send_message(message.chat.id, message.text) 

У читателя возникнет вопрос: зачем там символ “@”? Что это вообще за message_handler ? Дело в том, что после приёма сообщения от Telegram его надо обработать по-разному в зависимости от того, что это за сообщение: текст “привет” или текст “пока”, может быть, вообще стикер или музыка. Первое, что придёт в голову – написать множество конструкций if-then-else , но такой подход некрасивый и позволяет быстро запутаться.
Для решения этой проблемы автор библиотеки pyTelegramBotAPI реализовал механизм хэндлеров, которые используют питоновские декораторы (пока просто запомним это слово). В хэндлере описывается, в каком случае необходимо выполнять ту или иную функцию. Например, хэндлер @bot.message_handler(content_types=[«text»]) выполнит нижестоящую функцию, если от Telegram придёт текстовое сообщение, а хэндлер @bot.message_handler(commands=[«start»]) сработает при получении команды /start.

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

if __name__ == '__main__': bot.infinity_polling() 

Функция infinity_polling запускает т.н. Long Polling, бот должен стараться не прекращать работу при возникновении каких-либо ошибок. При этом, само собой, за ботом нужно следить, ибо сервера Telegram периодически перестают отвечать на запросы или делают это с большой задержкой приводя к ошибкам 5xx)

Итак, полный код файла bot.py выглядит следующим образом:

import config import telebot bot = telebot.TeleBot(config.token) @bot.message_handler(content_types=["text"]) def repeat_all_messages(message): # Название функции не играет никакой роли bot.send_message(message.chat.id, message.text) if __name__ == '__main__': bot.infinity_polling() 

Готово! Осталось запустить бота: python3 bot.py

Бот работает

На этом первый урок окончен.

Создаем бота в Telegram

В этом статье я покажу как создать Telegram бота с помощью Python, поскольку не нашел хорошей русскоязычной статьи по этой теме.

Создание бота

Бот создается с помощью BotFather через Telegram. После команды /newbot надо просто следовать инструкции.

В конце мы получаем токен для управления ботом и работы с Telegram API.

pyTelegramBotApi

Ссылки на документации всех библиотек будут в конце.

Создадим простого бота, отвечающего на команду /start , с помощью этой библиотеки:

import telebot bot = telebot.TeleBot('1408700689:AAGVqcqscWWK7DnuNHahd0w1eNklfjPEVxE') @bot.message_handler(commands=['start']) def start(message): bot.send_message(message.chat.id, 'It works!') bot.polling()

pyTelegramBotApi является просто обёрткой для всего Telegram Bot API, но здесь разберутся только основные составляющие.
Взаимодействие с ботом происходит через переменную bot (токен надо вставить свой).
Декоратор @message_handler реагирует на входящие сообщение.
Message – это объект из Bot API, содержащий в себе информацию о сообщении. Полезные поля:
message.chat.id – идентификатор чата
message.from.id – идентификатор пользователя
message.text – текст сообщения
Функция send_message принимает идентификатор чата (берем его из сообщения) и текст для отправки.

Примеры функций

Отправка изображений

Можно отправлять фото из локального хранилища, но удобнее это делать по ссылке. Код аналогичен предыдущему:

@bot.message_handler(commands=['start']) def start(message): bot.send_photo(message.chat.id, photo=photo_url, caption='It works!')

Замена клавиатуры

У ботов есть функция замены стандартной клавиатуры на кнопочную. Для этого у всех функций есть опциональный аргумент reply_markup:

from telebot import types @bot.message_handler(commands=['start']) def start(message): markup = types.ReplyKeyboardMarkup() buttonA = types.KeyboardButton('A') buttonB = types.KeyboardButton('B') buttonC = types.KeyboardButton('C') markup.row(buttonA, buttonB) markup.row(buttonC) bot.send_message(message.chat.id, 'It works!', reply_markup=markup)

ReplyKeyboardMarkup – и есть та самая клавиатура. Метод row() создает ряд (максимум 12) из кнопок, передаваемых в качестве аргумента.
Также есть особенная клавиатура types.ReplyMarkupRemove(), которая меняет клавиатуру на стандартную.

Клавиатура для сообщений

Можно создавать клавиатуру для отдельного сообщения. Передавать его нужно так же в аргумент reply_markup:

from telebot import types @bot.message_handler(commands=['start']) def start(message): markup = types.InlineKeyboardMarkup() buttonA = types.InlineKeyboardButton('A', callback_data='a') buttonB = types.InlineKeyboardButton('B', callback_data='b') buttonC = types.InlineKeyboardButton('C', callback_data='c') markup.row(buttonA, buttonB) markup.row(buttonC) bot.send_message(message.chat.id, 'It works!', reply_markup=markup)

У кнопок есть несколько режимов, в зависимости от второго аргумента. Подробнее можно прочитать в официальной документации, но я остановлюсь только на callback_data.
При нажатии на такую кнопку боту придет отдельный CallbackQuery, который нужно обрабатывать подобно сообщению:

@bot.callback_query_handler(func=lambda call: True) def handle(call): bot.send_message(call.message.chat.id, 'Data: <>'.format(str(call.data))) bot.answer_callback_query(call.id)

Для обработки обязательно указать аргумент func для «отсеивания» Callback запросов.
После обработки каждого запроса нужно выполнить команду answer_callback_query, чтобы Telegram понял, что запрос обработан. В поле callback.data хранится информация из callback_data нажатой кнопки.

Изменение сообщений

У ботов есть функция изменения своих сообщений (можно использовать, чтобы сделать перелистывание страниц, например). Для этого нужно воспользоваться методом edit_message_text (edit_message_caption для картинок):

@bot.callback_query_handler(lambda call: True) def handle(call): bot.send_message(chat_id=call.message.chat.id, message_id=call.message.id, text='It works!') bot.answer_callback_query(call.id)

Смысл аргументов понятен из их названия.

Flask

Если запустить бота, то через какое-то время он упадет с ошибкой Connection to api.telegram.org timed out. Чтобы это исправить нужно использовать вебхук:

from flask import Flask, request import telebot token = '1408700689:AAGVqcqscWWK7DnuNHahd0w1eNklfjPEVxE' bot = telebot.TeleBot(token) app = Flask(__name__) @bot.message_handler(commands=['start']) def start(message): bot.send_message(message.chat.id, 'It works!') @app.route("/" + token, methods=['POST']) def getMessage(): bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))]) return "!", 200 bot.remove_webhook() bot.set_webhook('https://test.com/' + token) app.run()

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

P.S. Чтобы работать с длинными диалогами, я хранил для каждого пользователя в базе данных его текущее состояние.

Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

Сегодня будем учиться создавать ботов в Telegram с помощью Python.
Попробуем заставить бота присылать сводку погоды по нашему городу.

Нам потребуется:

  1. Компьютер или ноутбук (При должном усердии можно попробовать на телефоне).
  2. Python 3 (Мы будем работать на версии 3.10).
  3. Редактор кода (Я использую PyCharm).
  4. Соединение с интернетом.

У всех на слуху две библиотеки для разработки telegram-ботов, это:
— telebot (он же pyTelegramBotAPI),
— aiogram.

Мы будем использовать telebot как более простой инструмент для личного пользования. Посмотрим как запустить первого бота, что для этого нужно и на что он способен.

Как и aiogram, telebot является адаптацией API telegram для взаимодействия с ответами от сайта. Со справкой API telegram можно ознакомиться тут https://core.telegram.org/. Там же вы сможете узнать подробнее об ответах API.

Получение токена для Telegram-бота

Чтобы создать нашего первого бота на Python надо обратиться к официальному боту от Telegram — BotFather. Там можно создать бота и получить его токен. Токен – это аналог пароля, который позволит нам управлять ботом изнутри и программировать его ответы.

Переходим в BotFather — https://t.me/BotFather и нажимаем «Запустить»:

Дальше выбираем команду /newbot и следуем всем указанием, и в конце мы получаем токен нашего бота:

Установка библиотеки telebot и знакомство с pyTelegramBotAPI

После получения токена нужно скачать библиотеку telebot:

pip install pyTelegramBotAPI 

если вы на macOS, то:

pip3 install pyTelegramBotAPI

Мы не будем раскладывать проект по модулям, поэтому у нас будет один исполнимый файл main.py. После создания файла надо импортировать библиотеку и наш токен:

import telebot api_token = 'Ваш токен вставлять сюда'

Первым делом следует инициализировать бота, передав в него токен, полученный от BotFather:

bot = telebot.TeleBot(api_token)

Дальше убедимся, что все корректно работает и заставим отправлять полученное сообщение обратно:

@bot.message_handler(content_types=['text']) def echo(message): bot.send_message(message.chat.id, text=f"")

Бот работает за cчёт декораторов, которые указывают, что мы хотим от него. Message handler – это обработчик всех сообщений, которые отправляет пользователь. В списке content_types перечисляем типы сообщений, которые хотим принимать. Можно указать text, audio, image и document.

У объекта bot есть множество методов, частью которых мы будем пользоваться. Основной из них — send message.

Чтобы заставить бота принимать сообщение, в конце файла пропишем:

bot.polling(none_stop=True)

Параметр none_stop указывает, что мы хотим принимать сообщения постоянно.
В стандартном положении параметр равен False, но мы ставим True.

После всех манипуляций получаем свое же сообщение:

Работа с API Яндекс Погоды

Перейдем к добавлению нужных функций — получению данных о погоде.

Для погоды мы будем пользоваться услугами бесплатного API от Яндекс Погоды:
https://yandex.ru/dev/weather/. Следует отметить, что бесплатный API от Яндекса ограничен 50 запросам в сутки. Если вас такое количество не устраивает, можно воспользоваться OpenWeather.

Запрос будет выглядеть так:

https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556

Запрос состоит из местоположения — в данном случае указаны координаты Москвы. Далее можно просить у пользователя геолокацию и присылать ему погоду по его координатам.

Для отправки GET-запроса к API Яндекс.Погоды нам поможет библиотека requests, а для обработки ответа — библиотека json.

pip install requests
pip3 install requests 

Библиотека requests предназначена для работы с GET и POST запросами, которые обычный пользователь делает через браузер. Теперь же мы можем общаться с сервером через python оставляя браузер за скобками. Часто используют requests вместе с BS4 (beautiful soup 4), чтобы удобно получать и анализировать информацию из html кода. Но в наш случае другая задача.

API Яндекс.Погоды отдаёт данные в формате JSON, поэтому библиотека json подойдёт лучше всего. JSON основан на JavaScript объекте и часто используется при обмене данными. Раньше он использовался только на сайтаx для работы с текстовыми данными. Сейчас его используют почти везде для удобного обмена данными. JSON принимают все языки программирования, что является его большим плюсом. В python библиотека json уже установлена и не требует отдельной команды.

Добавляем импорт нужных библиотек:

import requests import json

До этого мы не затрагивали тему, как именно обрабатывать команды через слеш. Для этого у декоратора есть метод message_handlers, внутрь которого мы передаем название команд:

@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']): def get_weather(message): pass

Для удобства выносим токен Яндекс.Погоды и ссылку в отдельные переменные:

url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers =

Отправим себе в Telegram полный ответ от API Яндекс.Погоды и проверим что все работает:

@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text)

После получения ответа сформируем нормальный ответ для пользователя. Сразу сделаем проверку на status_code, чтобы оповестить пользователя, если проблемы на стороне API. После получения ответа от API в текстовом формате, надо перевести его в словарь. Для этого подключаем библиотеку json — в функцию loads мы передаем текст ответа, а на выходе получаем объект типа dict (словарь):

@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API')

Теперь бот отправляет температуру, как она ощущается и какая сейчас погода:

Настройка команд для telegram-бота

Нам осталось сделать реакцию на команду /start. Она будет выводить команду для получения данных о погоде:

@bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather')

Мы обращаемся к информации, которая приходит нам в сообщении пользователя, чтобы получить из нее имя пользователя. Подробнее узнать о сообщениях пользователей можно тут https://core.telegram.org/constructor/message.

Теперь создадим подсказки для пользователей. Библиотека pyTElegramBotAPI не позволяет из кода редактировать подсказки для написания команды. Чтобы это сделать нам потребуется несколько операций в BotFather:

  1. кликаем на меню
  2. выбираем команду /mybots
  3. ищем нашего бота
  4. edit bot
  5. и выбираем edit commands
  6. дальше вводим нашу команду (Пример: команда – описание)

После всех манипуляций у нас появится всплывающая менюшка с командами:

Финальный код Telegram-бота на Python

Мы с вами затронули лишь малу часть того, что можно сделать с помощью python и Telegram. Telebot — не самая лучшая библиотека для создания ботов под большую аудитории. Если вы хотите писать бот для магазинов, вам потребуется более сильные инструменты разработки, которые есть в aiogram.

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

Весь код из урока:

import telebot import requests import json api_token = '5347819163:********lZu1qWQc5f55DPk' url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers = bot = telebot.TeleBot(api_token) @bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather') @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API') bot.polling(none_stop=True)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *