Телеграммбот построения маршрута с использованием общественного транспорта города Киева
Скачать 2.02 Mb.
|
5.5.2 HTTP-запросы Протокол Передачи Гипертекста (HTTP) – это один из известных протоколов стека TCP/IP (Transmission Control Protocol/Internet Protocol), с самого начала он был разработан для размещения и получения HTML (HyperText Markup Language) страниц и на данный момент используется для распределенных информационных систем. HTTP широко используется в Интернете, а именно для передачи информации и представляет собой наиболее используемый прикладной протокол. HTTP это протокол, который определяется типом запрос/ответ. Когда клиент или веб-браузер отправляет сообщения с запросом на сервер, HTTP протокол самостоятельно определяет типы отправленных серверу сообщений, используемых клиентом для запроса на веб-страницу, а также типы сообщений, используемых сервером для ответа. Три наиболее популярных типа сообщений это: GET, POST и PUT. На рисунке 5.5.2.1 представлен пример GET-запроса. Письмо ИТ51.320БАК.002 ПО 22 Изм. Письмо № докум. Подпись Дата Рисунок 5.5.2.1 – HTTP протокол с использованием GET Для того, чтобы отправить сообщения, загружающие данные на веб- сервер используются POST и PUT. Например, когда пользователь вводит данные в форму, находящуюся на веб-странице, POST добавляет эти данные в сообщения и они ссылаются на сервер. PUT загружает эти ресурсы или другой контент на веб-сервер. HTTP протокол является очень гибким, но это не делает его безопасным протоколом. Сообщения POST отправляют данные на сервер в виде обычного текста, который может быть с легкостью перехвачен. Аналогично, ответы, поступающие от сервера, также не зашифрованы. Для того чтобы создать безопасную коммуникацию через Интернет используется безопасный HTTP протокол (HTTPS), он позволяет получать доступ или публиковать информацию на веб сервере. HTTPS позволяет использовать аутентификацию и шифрование, чтобы защитить данные от перехвата при перемещении между клиентом и сервером. HTTPS Письмо ИТ51.320БАК.002 ПО 23 Изм. Письмо № докум. Подпись Дата определяет некоторые правила для прохождения данных между прикладным и транспортным уровнями. 5.5.3 Формат JSON JSON (JavaScript Object Notation) – это формат для обмена данными, комфортный для хранения, чтения и написания как человеком, так и компьютером. Он был основан на подмножестве известного языка программирования JavaScript и определен в стандарте ECMA-262 3rd Edition - December 1999. JSON – представляет собой почти обычный текстовый формат, полностью независимый от языка реализации, но он использует некоторые правила, знакомые программистам C-подобных языков , таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Именно эти свойства делают JSON идеальным языком, который можно использовать для обмена данными. JSON с самого начала был основан на двух структурах данных: а) коллекция пар ключ/значение. Эта концепция в разных языках может быть реализована как объект, запись, структура, словарь, хэш, именуемый список или ассоциативный массив; б) упорядоченный перечень значений. Большинство языков программирования реализуют это в качестве массива, вектора, списка или последовательности. Это универсальные структуры данных. Почти все современные языки программирования могут поддерживать их в любой форме. Достаточно легко предположить, что формат данных, хранящихся в JSON, независим от языка программирования и должен быть основан на структурах, указанных выше. В нотации JSON это выглядит так: а) объект – это неупорядоченный набор пар ключ/значения. Объект начинается с открытой фигурной скобки и оканчивается закрытой фигурной скобкой. Каждое имя в объекте сопровождается двоеточием, а пара ключ/ значения разделяются запятой (рисунок 5.5.3.1); Письмо ИТ51.320БАК.002 ПО 24 Изм. Письмо № докум. Подпись Дата Рисунок 5.5.3.1 – Схематическое представление объекта JSON б) массив – это упорядоченная коллекция, которая может содержать разные значения. Массив начинается с квадратной скобки и заканчивается этой скобкой. Значения в массиве разделяются запятой (рисунок 5.5.3.2); Рисунок 5.5.3.2 – Схематическое представление массива JSON в) значение – может быть числом, строкой в двойных кавычках, true, false, null, объектом или массивом. Эти структуры могут быть вложены (рисунок 5.5.3.3); г) строка – это так называемый набор символов в кодировке Unicode, заключенный в двойные кавычки, или символ, использующий обратный слэш в качестве символа экранирования. Символ представляется как одна символьная строка. Сходный синтаксис используется в языках программирования C и Java (рисунок 5.5.3.4); Число в JSON передается так, как в C или Java, кроме того, что используется только десятичная система счисления (рисунок 5.5.3.5). Письмо ИТ51.320БАК.002 ПО 25 Изм. Письмо № докум. Подпись Дата Рисунок 5.5.3.3 – Схематическое представление значения в JSON Рисунок 5.5.3.4 – Схематическое представление строки в JS Письмо ИТ51.320БАК.002 ПО 26 Изм. Письмо № докум. Подпись Дата Рисунок 5.5.3.5 – Схематическое представление числа в JSON 5.5.4 Платформа Heroku Heroku представляет собой облачную PaaS-платформу, которая поддерживает большое количество языков программирования. С 2010 г. она становится дочерней компанией Salesforce. Heroku, это одна из первых облачных платформ, появившаяся в июне 2007 года и в начальной версии поддерживавшей только один язык программирования Ruby, но на данный момент список поддерживаемых языков расширился и включает в себя Java, Node.js, Scala, Clojure, Python, Go и PHP. Обычно на серверах используются операционные системы Debian или Ubuntu. В 2011 году была введена поддержка Node.js и Clojure. Также платформа может поддерживать такие СУБД, как Cloudant, Membase, MongoDB и Redis, кроме PostgreSQL. Приложения, работающие на данной облачной платформе, используют также DNS- сервер (обычно приложения имеют личное доменное имя, которое выглядит так – название проекта.herokuapp.com). Для всех программ выделяются несколько независимых виртуальных процессов, которые называются dynos. Они размещены по специальной виртуальной сетке, состоящей из нескольких серверов. Одной из особенностей Heroku является то, что у нее есть собственная система контроля версий. Письмо ИТ51.320БАК.002 ПО 27 Изм. Письмо № докум. Подпись Дата 5.5.5 Очередь сообщений Очередь сообщений (message queue, MQ) – это архитектура обмена сообщениями между разными компонентами в программных системах в асинхронном режиме. Это позволяет отправлять сообщения одним компонентом-отправителем системы в одно время, а получить и обработать другим компонентом-получателем в совсем другой. Системы такого типа состоят из producer'а (отправителя) и consumer'a (получателя), взаимодействующих между собой с помощью поставщика (broker), который по-другому можно определить как некоторый MQ-сервер. Очередь – это структура данных с ограниченным доступом к элементам, которую можно описать, как «первый пришел-первый вышел». Ограниченность состоит в том, что элемент можно добавить только в конец очереди, а выбрать элемент только из начала, при удалении элемента из очереди он уничтожается. Особенности использования MQ-архитектуры: а) слабое связывание – создаются неявные интерфейсы, которые обмениваются данными, позволяют процессам быть независимыми друг от друга и позволяют сохранять желаемый формат сообщений; б) избыточность – позволяет избегать нерационального использования ресурсов системы или сети, в свою очередь сохраняя еще необработанную информацию; в) масштабируемость – посредством распределения процессов обработки информации позволяет увеличивать производительность MQ-сервера; г) эластичность и возможность выдерживать пиковые нагрузки – при высокой нагрузке в дополнение, очереди сообщений могут служить так называемым буфером для накопления информации, позволяя изменить скорость обработки информации и, тем самым, снизить общую нагрузку на систему или сеть; Письмо ИТ51.320БАК.002 ПО 28 Изм. Письмо № докум. Подпись Дата д) устойчивость – дает возможность отделить один процесс от друга и получение сообщений, благодаря этому, в случае отказа процесса-обработчика, предоставляется возможность восстановить рабочее состояние системы, откладывая обработку сообщения; е) гарантированная доставка – сообщения в любом случае будут обработаны и доставлены, независимо от рабочего состояния системы отправителя и системы получателя сообщений. Это достигается использованием асинхронной связи и возможностью хранения сообщения на MQ-сервере, пока оно не будет обработано; ж) гарантированный и одноразовый порядок доставки – значительная часть MQ- серверов позволяет доставить данные именно в том порядке, в котором они были отправлены, при этом гарантирует, что после того, как сообщение будет прочитано, оно будет удалено из очереди; з) буферизация – это гарантия доставки сообщений с максимальной эффективностью, которая достигается посредством независимости скорости обработки сообщений от скорости их отправки, это в свою очередь происходит благодаря использованию вышеупомянутой структуры очереди – своеобразного буфера между системой-обработчиком и системой. отправителем. 5.6 Telegram Bot API Bot API представляет собой HTTP-интерфейс для работы с ботами в Telegram. Каждый бот – это специально созданный аккаунт для автоматической обработки и отправки сообщений. Документация Telegram Bot API выделяет два максимально противоположных способа получения обновлений: а) периодические запросы; б) установка веб-хуков. Входящие обновления сохраняются до тех пор, пока сервер не обработает его, но не более 24 часов. В ответ получаем объект Письмо ИТ51.320БАК.002 ПО 29 Изм. Письмо № докум. Подпись Дата Update, который сериализирован в JSON, независимо от способа получения обновлений. Первый и наиболее простой вариант заключается в периодическом опросе серверов Telegram на наличие новой информации. Открывается соединение на непродолжительное время и все обновления сразу отправляются боту, все это осуществляется через связь Long Polling. Этот способ простой, но не очень надежный. Веб-хуки работают несколько иначе. Если в чат приходит сообщение, то Telegram сам говорит об этом, в этом и заключается работа вебхука. Теперь отпадает необходимость периодически опрашивать серверы, тем самым исчезает причина ошибок поисковых роботов. Однако за эту возможность нужно платить необходимостью установки полноценного веб-сервера на то устройство, на котором и планируется запускать поисковых ботов. Так же для корректной работы необходимо иметь собственный сертификат SSL (Secure Sockets Layer), поскольку веб-хуки в Telegram работают только по HTTPS (рисунок 5.6.1). Рисунок 5.6.1 – Принцип работы чат-бота на платформе Telegram Письмо ИТ51.320БАК.002 ПО 30 Изм. Письмо № докум. Подпись Дата Для получения токена необходимо написать специальному боту @BotFather. Ниже описаны примеры доступных методов для API: а) getUpdates – это метод, используемый для получения обновлений по технологии long polling; б) setWebhook – этот способ привязывает к роботу url домена, где содержится текущий запущенный бот; в) sendMessage – метод, отправляющий текстовое сообщение в клиентской части Telegram; г) sendLocation – метод, отправляющий сообщения с координатами местоположения устройства; д) getFile – метод, возвращающий вложенные файлы по их имени. Допускаются POST и GET запросы. Есть 4 метода передачи характеристик в Bot API: а) запрос в URL; б) application/x-www-form-urlencoded; в) application/json; г) multipart/form-data (подходит для загрузки файлов). Для работы с Telegram Bot API была исследована документация, в которой описаны все способы и характеристики, было установлено, что все ответы приходят в JSON-формате. В ходе написания чат-бота были протестированы и использованы следующие методы и типы: Метод getUpdates используется для получения обновлений через long polling. Ответ возвращается посредством массива объектов Update. Параметры метода приведены в таблице 5.6.1. Письмо ИТ51.320БАК.002 ПО 31 Изм. Письмо № докум. Подпись Дата Таблица 5.6.1 – Параметры getUpdates Параметры Offset Тип Integer обязательный Нет Описание Смещение относительно начала массива Update, разрешающее просматривать новые сообщения, игнорируя старые. Ограничивает количество элементов массива Update. Принимает значение от 1 до 100. Таймаут в секундах для продолжительного опроса. По умолчанию 0, то есть так называемый краткий запрос. Limit Integer Нет Timeout Integer Нет Метод setWebhook необходим для задания URL веб-хука, на который бот будет отправлять обновления. Каждый раз при получении обновления по этому адресу будет отправлен HTTPS POST с сериализированным в JSON объектом Update. При ошибке запроса на сервер попытка будет повторена несколько раз. Для большей безопасности рекомендуется включить токен в URL веб-хука, например: https://yourwebhookserver.com/ Таблица 5.6.2 – Параметры setWebhook Параметры url Тип String обязательный Нет Описание HTTPS url для отправки запросов. Sertificate InputFile Нет Загрузка общественного ключа для проверки корневого сертификата. Письмо ИТ51.320БАК.002 ПО 32 Изм. Письмо № докум. Подпись Дата Метод getWebhookInfo включает в себя информацию о текущем состоянии веб- хука. Параметры данного метода приведены в таблице 5.6.3. Таблица 5.6.3 – Настройки возвращаемые getWebhookIn Параметры url has_custom_cer tificate pending_update _count last_error_date Тип String Boolean Описание url веб-хука, может быть пустым. Да, только если веб-хук использует свой самозаверенный сертификат. Количество обновлений, ожидающих своей очереди. Integer Integer Не обязательно. Unix – время последней ошибки доставки обновления на указанный веб-хук. Не обязательно. Описание последней ошибки доставки обновления на указанный веб-хук. last_error_mess String age Метод sendMessage используется для отправки сообщений. Параметры метода приведены в таблице 5.6.5. Таблица 5.6.4 – Параметры sendMessage Параметры chat_id Тип Integer String Обязательный Да Описание Уникальный целевого чата или имени целевого канала. Текст сообщения, необходимо отправить. или идентификатор Text String Да какое Письмо ИТ51.320БАК.002 ПО 33 Изм. Письмо № докум. Подпись Дата Продолжение таблицы 5.6.4. Параметры Тип Обязательный Описание Нужно Markdown или HTML, чтобы приложения Telegram отражали курсивный, фиксированной встроенные сообщении бота. Отключает просмотр сообщении. Отправляет тихо. Пользователи iOS не получат пользователи получат сообщение без звука Идентификатор сообщения. отправить parse_mode String Нет полужирный, текст шириной URL-адреса в с или disable_web_pag e_ preview Boolean Нет предварительный ссылок в сообщение disable_notificati Boolean on Нет сообщение, Android replay_to message_id Integer Нет выходного InlineKeybo ard Markup или ReplyKeybo ard Markup или ReplyKe yboard Hide Расширенные поиска собой объект клавиатуры, пользовательская. возможности интерфейс. Представляет JSON-сериализированный для replay_markup Нет встроенной какая Письмо ИТ51.320БАК.002 ПО 34 Изм. Письмо № докум. Подпись Дата Метод sendPhoto используется для отправки фотографий. Параметры метода приведены в таблице 5.6.5. Таблица 5.6.5 – Настройки sendPhoto Параметры chat_id Тип Integer String Обязательный Да Описание Уникальный идентификатор целевого чата или имя целевого канала. Фото для отправки. Можно передать file_id как строку, чтобы фотографию находится Telegram, скачать фотографию. Описание или InputFile String или Photo Да отправить какая уже на серверах или новую Параметры Тип Обязательный Caption String Нет Тема фотографии от 0 до 200 символов. Идентификатор исходящего сообщения. replay_to message_id Integer Нет Метод editMessageText используется для редактирования текстовых сообщений, отправленных ботом или через бота. Параметры метода приведены в таблице 5.6.6. Письмо ИТ51.320БАК.002 ПО 35 Изм. Письмо № докум. Подпись Дата Продолжение таблицы 5.6.5. Параметры Тип InlineKeyboard Markup or ReplyKeyboard Markup or ReplyKeyboard Hide or ForceкReply Обязательный Описание Расширенные поиск интерфейса. Представляет из себя JSON- сериализированный объект для встроенной клавиатуры, предназначенной пользователя, инструкции используются, сокрытие пользователя принудительного ответа пользователя. возможности Replay_markup Нет для определенные какие для клавиатуры или от Таблица 5.6.6 – Настройки метода editMessageText Параметры Тип Integer String Обязательный Описание Необходим если inline_message_id не указан. идентификатор чата или имени канала. Описание или параметр, chat_id Нет Уникальный целевого Параметры Тип Обязательный Обязательно если chat_id и message_id не указаны. Идентификатор встроенного сообщения inline_message_id String Нет Письмо ИТ51.320БАК.002 ПО 36 Изм. Письмо № докум. Подпись Дата |