Команды в Telegram python

В этой части я познакомлю вас с «регулярными выражениями», мы подключимся к серверу API для того чтобы сделать запрос и получить ответ от сервера в виде JSON (Java Script Object Notation) , сохраним этот ответ в файл any_file.json . Ну и начнем писать обработчик команды » /lowprice «.

С чего всё начиналось:

Написание телеграм-бота на Python. Часть первая
Vorontsoff 23 сентября 2022
Написание телеграм-бота на Python. Часть вторая
Vorontsoff 24 сентября 2022

Про шаблон структуры телеграмм-бота. Разработка на Python. Часть третья
Vorontsoff 29 сентября 2022

Итак, продолжаем.

Первое, что нам понадобится для дальнейшего написания бота — это ключ для авторизации на сервере hotels.com. Для этого достаточно нажать кнопочку » Sign In» и войти под своим гугл аккаунтом. После того как произведен вход на сайт жмем на менюшку Endpoints:

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

Телеграм бот на Python / #2 – Базовые концепции создания бота

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

Открываем PyCharm (или любой другой редактор), наш шаблон проекта и начинаем править файлы, для начала в корне проекта исправляем файл .env, вписывая туда X-RapidAPI-Key:

У нас уже есть все необходимые коды доступа к серверам телеграмм и hotels.com, они вписаны в нужный файл, бот в свою очередь уже может минимально работать, то есть реагировать на какие то простейшие команды, и конечно же — если он какую-то команду не знает, то он «попугайничает» эхом со стандартным ответом:

Я добавил в пункт меню, соответствующие команды (которые будут, в последствии, использоваться ботом), начнем с обработки команды /lowprice:

как добавить команды в пункт «Меню»

Для того чтобы бот понял команду /lowprice , нужно сделать соответствующие изменения в некоторых файлах структуры нашего бота. Для новых команд я создам новую папку, в папке handlers, там будут лежать все файлы отвечающие за реакцию на команды:
/lowprice
/hiprice
/bestdeal
/history
У каждой команды будет свой файл. При создании новой папки, в ней будет автоматом (у меня именно так) появляться файл __init__.py в котором нужно будет указать все файлы или папки находящиеся в этой директории. Для доступа к ним через точку.

Делается это описанием типа from . import папка_или_файл :

Итак, создаем в папке handlers папку find_hotels (может быть не самое удачное имя для папки я придумал, может стоило выбрать что-то более подходящее). Не забыв при этом ( это важно. ) в файле __init__.py прописать папку find_hotels перед. а не после папки default_handlers . Иначе интерпретатор будет читать файлы в «папке по умолчанию» и не будет реагировать на все наши команды, ибо он будет встречать на своем пути файл echo.py который реагирует на все неизвестные команды и слова.

Telegram бот на python aiogram #2 message_handler команды чат бота

В папке find_hotels создаем файл lowprice.py (щелкнув на папке правой кнопкой мыши и выбрав пункт:

Ну вот у нас есть пустой файл lowprice.py, пропишем все необходимые модули, и минимальный код для реакции на команду /lowprice:

цветными стрелками я описал то за какую строчку кода какой модуль отвечает.

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

Можно запустить нашего бота и он ожидаемо среагирует на нашу команду /lowprice:

Но дальше, у нас нет прописанной реакции на ввод пользователя и ожидаемо выдаст «эхо»:

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

не забываем править файл __init__.py

Попытаюсь более детально разобрать нижеприведенный код:

Городов в мире очень много и, сюрприз, даже Рим может быть не только итальянским, запрос по городам может выдать нам не один населенный пункт с именем, скажем Рим (я буду использовать при написании бота именно Рим).

Следующий шаг, это отправка запроса к серверу hotels.com и получение от него ответа из которого мы сформируем словарь со всеми возможными значениями . И полученный словарь я для наглядности выведу в консоль пайчарма.

Для выполнения следующего шага программы потребуется подключить модуль: from utils.find_destination_id import destination_id

Ну и соответственно создать файл в папке utils с именем find_destination_id , в котором будет функция destination_id , которая сделает запрос к серверу и вернет нам словарь с вариантами городов.

Нам нужно импортировать следующие модули:

  • requests (отвечает за отправку запроса к серверу)
  • json (отвечает за приведение ответу от сервера к иерархическому виду)
  • re (regular expressions поддержка регулярных выражений)
  • from config_data import config (подключение ключа от сервера)

Когда все ключи прописаны, все модули подключены, можно выполнять запрос к серверу. В переменной pattern содержится регулярное выражение которое помогает из текста выбросить всё что нам не потребуется (нам нужны лишь описание населенного пункта и его destination_id ).

Логика примерно такова:

  • создаем строку запроса
  • посылаем запрос к серверу используя все необходимые параметры
  • приняли ответ и его нужно «десериализовать» или предать ему форму. В модуле json есть методы load () и loads () для превращения кодированных данных JSON в объекты Python. Load — для файлов, loads — для трок.
  • дальше я записываю полученные данные в локальный файл, потому как оперировать с локальными данными проще, ну и существует ограничение на сервере для бесплатного пользования их данными (500 запросов в месяц) и когда тестируешь программу можно легко не вложиться в лимит. Поэтому в будущих статьях я не буду использовать сервер, лишь тогда когда мой бот будет на этапе завершения и защиты дипломной работы (да, это моя дипломная работа)
  • с помощью цикла проходимся по полученному десериализованному объекту, выбираем из него только то что нам нужно ( destination_id (key) и caption(value) ) этими данными заполняем наш словарь
  • возвращаем наш словарь туда откуда была вызвана функция
  • вывожу полученный словарь в консоль для понимания что там содержится

На этом очередная часть написания телеграмм-бота на Python подошла к концу. Прошу профессионалов меня строго не судить, может быть код получается корявый но это мой код. Может не всё верно, возможно я сейчас иду не той дорогой. Есть структурное понимание данного бота, но есть еще множество непонятых деталей. И данный текст — попытка уложить все данные по полочкам в своей голове.

А если еще и людям помогу — тогда я красавчик!

На этом всё, как-то так. Всем всех благ, здоровья, счастья и любви!

Источник: dzen.ru

Оцените статью
Добавить комментарий