Как работают декораторы

Telegram

Как всё будет работать

В этом проекте три звена: наш компьютер с Python, сервер Телеграма и Телеграм-клиент.

На компьютере работает интерпретатор Python, а внутри интерпретатора крутится наша программа на Python. Она отвечает за весь контент: в неё заложены все шаблоны текста, вся логика, всё поведение.

Внутри программы на Python работает библиотека, которая отвечает за общение с сервером Телеграма. В библиотеку мы вшили секретный ключ, чтобы сервер Телеграма понимал, что наша программа связана с определённым ботом.

Когда клиент с Телеграмом запрашивает у бота расписание, запрос приходит на сервер, а сервер отправляет его на наш компьютер. Запрос обрабатывается программой на Python, ответ идёт на сервер Телеграма, сервер отдаёт ответ клиенту.

 

 

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

 

Что будем делать

Если записать пошагово наш план, то он будет выглядеть так:

  1. Регистрируем бота в Телеграме.
  2. Устанавливаем Python-библиотеку для работы с Телеграмом.
  3. Добавляем библиотеку в программу и учим программу реагировать на сообщения в чате.
  4. Пишем там же код, который покажет кнопки для выбора предметов
  5. Сделаем так, чтобы по кнопкам появлось дз по данному предмету

Теперь по очереди разберём каждый пункт.

Регистрация нового бота

В Телеграме находим канал @BotFather — он отвечает за регистрацию новых ботов:

Первый в списке со специальным значком подтверждения — это он.

Нажимаем Start и пишем команду /newbot. Нас по очереди спросят про название бота и его никнейм

Установка библиотеки

Есть два основных способа работать с телеграмом в Python: через библиотеку telebot и с помощью Webhook. Мы будем использовать библиотеку — так проще и быстрее.

Чтобы её установить, запускаем командную строку от имени администратора (если у вас Windows) и пишем команду pip install pytelegrambotapi

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

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

Подключаем библиотеку и получаем сообщения

 

Чтобы программа на Python умела управлять Телеграм-ботами, нужно в самое начало кода добавить строки:

import telebot;

bot = telebot.TeleBot('токен');

 

Единственное, о чём нужно не забыть — заменить слово «токен» на настоящий токен, который дал нам @BotFather.

Теперь наш бот существует!

Кратко о декораторах

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

@bot.message_handler(content_types=["text"])

 

Что это?

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

Как работают функции

 

Функции как процедуры

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

Функции как объекты первого класса

В Python всё является объектом, а не только объекты, которые вы создаёте из классов. В этом смысле он (Python) полностью соответствует идеям объектно-ориентированного программирования. Это значит, что в Python всё это — объекты:

● числа;

● строки;

● классы (да, даже классы!);

● функции (то, что нас интересует).

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

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

Функциональное программирование — функции высших порядков

В Python используются некоторые концепции из функциональных языков вроде Haskell.

● функции являются объектами первого класса;

● следовательно, язык поддерживает функции высших порядков.

Функции высших порядков — это такие функции, которые могут принимать в качестве аргументов и возвращать другие функции.

Пример

>>> def hello_world():... print('Hello world!')

Мы можем хранить функции в переменных:

>>> hello = hello_world >>> hello() Hello world!

Определять функции внутри других функций:

>>> def wrapper_function():... def hello_world():... print('Hello world!')... hello_world()... >>> wrapper_function() Hello world!

Передавать функции в качестве аргументов и возвращать их из других функций:

>>> def higher_order(func):... print('Получена функция {} в качестве аргумента'.format(func))... func()... return func... >>> higher_order(hello_world) Получена функция <function hello_world at 0x032C7FA8> в качестве аргумента Hello world! <function hello_world at 0x032C7FA8>

Из этих примеров должно стать понятно, насколько функции в Python гибкие. С учётом этого можно переходить к обсуждению декораторов.

Как работают декораторы

Повторим определение декоратора:

Декоратор — это функция, которая позволяет обернуть другую функцию для расширения её функциональности без непосредственного изменения её кода.

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

def decorator_function(func): def wrapper(): print('Функция-обёртка!') print('Оборачиваемая функция: {}'.format(func)) print('Выполняем обёрнутую функцию...') func() print('Выходим из обёртки') return wrapper

Здесь decorator_function() является функцией-декоратором. Как вы могли заметить, она является функцией высшего порядка, так как принимает функцию в качестве аргумента, а также возвращает функцию. Внутри decorator_function() мы определили другую функцию, обёртку, так сказать, которая обёртывает функцию-аргумент и затем изменяет её поведение. Декоратор возвращает эту обёртку. Теперь посмотрим на декоратор в действии:

>>> @decorator_function... def hello_world():... print('Hello world!')... >>> hello_world() Оборачиваемая функция: <function hello_world at 0x032B26A8> Выполняем обёрнутую функцию... Hello world! Выходим из обёртки

Просто добавив @decorator_function перед определением функции hello_world(), мы модифицировали её поведение. Однако как вы уже могли догадаться, выражение с @ является всего лишь синтаксическим сахаром для hello_world = decorator_function(hello_world).

Иными словами, выражение @decorator_function вызывает decorator_function() с hello_world в качестве аргумента и присваивает имени hello_world возвращаемую функцию.

Справочник

 

Отправление сообщений ботом

 

Прием сообщений ботом

 

Кнопки - создание и обработка нажатий на кнопки

 

 

Последнее

И последнее, что нам осталось сделать до запуска, — добавить после метода такую строчку:

bot.polling(none_stop=True, interval=0)

Она скажет программе, чтобы она непрерывно спрашивала у бота, не пришли ли ему какие-то новые сообщения. Запускаем программу и проверяем, как работает наш бот.

 

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

 

Пример Гороскоп

https://thecode.media/python-bot/

Декораторы

https://tproger.ru/translations/demystifying-decorators-in-python/

https://devpractice.ru/python-lesson-19-decorators/

Повторение

https://pythonworld.ru/moduli/modul-datetime.html

Справочник Telegram Api

https://tlgrm.ru/docs/bots/api


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: