Сегодня я расскажу о хитром механизме аутентификации в Telegram WebApp Bot. Что такое бот Telegram WebApp? Это просто возможность запустить WebView с вашим сайтом внутри Telegram. Вы можете прочитать больше здесь».
Зачем нам здесь авторизация?
Ваш сайт должен открываться только в Telegram WebView. Итак, что, если бы кто-то сделал это в браузере? «Хакеры» могут использовать поддельные пользовательские данные, идентификаторы и так далее. Нам нужно защитить наш API от людей за пределами Telegram.
Как?
Telegram использует HMAC (код аутентификации сообщений на основе хэша). Итак, если вы инициализируете Telegram SDK на своем веб-сайте, вы сможете использовать эти данные для идентификации пользователя. Давайте шаг за шагом создадим механизм аутентификации.
Шаг 1: передача данных через запросы
Telegram SDK устанавливает пользовательские данные в глобальном масштабе вашего приложения. Есть данные о пользователях, их смартфонах, цветовых темах и многом другом. Вы можете найти это здесь:
СОЗДАЕМ упрощенный DURGER KING!!! | WebApp в телеграм!
window.Telegram.WebApp
Итак, есть поле, в котором нам нужно проверять наши сообщения. Telegram предоставляет специальное поле initData. Мы должны использовать это поле для проверки всех запросов от Telegram WebApp к нашему серверу.
const < initData >= window.Telegram.WebApp
Это просто строка, похожая на строку запроса GET, которая содержит несколько полей:
auth_date=user=
Вот и все. Необходимые данные будут в наших запросах.
Шаг 2: создание промежуточного ПО аутентификации
Я использую Nest.js в своем проекте, но способ создания промежуточного ПО почти одинаков в Express.js и Nest.js.
Во-первых, мы должны создать промежуточное ПО с помощью нескольких строк кода:
export function telegramAuthMiddleware(req, res, next) < // take initData from headers const iniData = req.headers[ ‘telegram-data’ ]; // use our helpers (see bellow) to validate string // and get user from it const user = checkAuthorization(iniData); // add uses to the request «context» for the future if (user) < req.user = user; next(); // or if the validation is failed response 401 >else < res.writeHead(401, < ‘content-type’: ‘application/json’ >); res.write(‘unauthorized’); res.end(); > >
Этот код просто берет initData из заголовков и использует вспомогательную функцию для их проверки.
Шаг 3: анализ initData
Я собираюсь описать процесс, а затем покажу вам код.
- Нам нужно разобрать строку initData
- Возьмите поле хэш из этой строки и сохраните его на будущее.
- Отсортируйте остальные поля в алфавитном порядке
- Соедините эти поля с помощью разрыва строки (n). Почему? Да просто так! Телеграм хочет!
Итак, после этих шагов у нас есть две строки: hash, telegramCheckString,и metaData (содержит пользователя, auth_date и query_id)
Давайте посмотрим на код:
function parseAuthString(iniData) < // parse string to get params const searchParams = new URLSearchParams(iniData); // take the hash and remove it from params list const hash = searchParams.get(‘hash’); searchParams.delete(‘hash’); // sort params const restKeys = Array.from(searchParams.entries()); restKeys.sort(([aKey, aValue], [bKey, bValue]) =>aKey.localeCompare(bKey)); // and join it with n const dataCheckString = restKeys.map(([n, v]) => `$=$`).join(‘n’); return < dataCheckString, hash, // get metaData from params metaData: < user: JSON.parse(searchParams.get(‘user’)), auth_date: searchParams.get(‘auth_date’), query_id: searchParams.get(‘query_id’), >, >; >
Шаг 4: проверка хэша
Это последняя глава нашего путешествия. Нам нужно проанализировать initData, используя функцию из предыдущего шага и немного криптографии.
Телеграм бот на Python / #8 – Web Apps. Полноценные веб приложения в Телеграм
Telegram API Bot
Развитие Телеграмм во многом определяется наличием большого числа ботов – небольших сервисных программ-роботов. Их может создать каждый пользователь, знакомый с программированием на среднем уровне. Telegram API Bot – это программный интерфейс, позволяющий программировать собственного бота.
API включает в себя объекты и команды, предназначенные для установки поведения бота Telegram. Используя интерфейс, вы можете создавать собственные программные коды, которые при запуске в Telegram начинают работать как боты.
Элементы управления
В Бот Телеграмм API все элементы управления представляют собой объекты, которые представлены в JSON, то есть в виде строки, заданной по определенным правилам. Это позволяет производить обмен данными по сети максимально быстро и наименее затратно, так как передается не программный код, а набор пар «ключ:значение» в текстовом виде. В таблице приведены все типы API. Большая часть объектов предназначена для создания команд бота. Ключи дадут более расширенное представление о возможностях объекта.
User | Пользователь в Телеграмм | id first_name last_name username |
Chat | Чат | id type title username first_name last_name all_members_are_administrators |
Message | Сообщение | message_id from date chat forward_from forward_date reply_to_message text entities audio document photo sticker video voice caption contact location venue new_chat_member 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 |
MessageEntity | Отдельная сущность в текстовом сообщении (хештег, ссылка и пр.) | type length url offset |
PhotoSize | Изображение заданного размера или превью фото, файла или стикера | file_id width height file_size |
Audio | Аудиозапись | file_id duration performer title mime_type file_size |
Document | Любой файл, не являющийся изображением, аудиозаписью или голосовой записью | file_id thumb file_name mime_type file_size |
Sticker | Стикер | file_id width height thumb file_size |
Video | Видеозапись | file_id width height duration thumb mime_type file_size |
Voice | Голосовое сообщение | file_id duration mime_type file_size |
Contact | Телефонный контакт | phone_number first_name last_name user_id |
Location | Точка на карте | longitude latitude |
Venue | Объект на карте | location title address foursquare_id |
UserProfilePhotos | Фото профиля пользователя | total_count photos |
File | Готовый к загрузке файл | file_id file_size file_path |
ReplyKeyboardMarkup | Клавиатура с возможностью ответа | keyboard resize_keyboard one_time_keyboard selective |
KeyboardButton | Кнопка клавиатуры для ответа | text request_contact request_location |
ReplyKeyboardHide | Заменяет клавиатуру бота на стандартную клавиатуру Telegram | hide_keyboard selective |
InlineKeyboardMarkup | Встроенная клавиатура, появляющаяся под сообщением | inline_keyboard |
InlineKeyboardButton | Одна кнопка на встроенной клавиатуре | text url callback_data switch_inline_query switch_inline_query_current_chat callback_game |
CallbackQuery | Входящий запрос обратной связи для встроенной кнопки с заданным параметром callback_data | id from message inline_message_id data |
ForceReply | Эмулирует действия пользователя: выбор сообщения и нажатия кнопки «Ответить» | force_reply selective |
ResponseParameters | Сообщает, почему запрос не выполнился успешно | migrate_to_chat_id retry_after |
Результирующие строки, которые присылает мессенджер, представлены в виде тех же объектов API.
Обмен сообщениями происходит в виде запросов. В следующей таблице приведены примеры некоторых из них.
getMe | Позволяет получить информацию о пользователе |
sendMessage | Отправляет сообщение |
sendPhoto | Отправляет фото |
sendAudio | Отправляет аудио |
sendDocument | Отправляет документ |
sendVideo | Отправляет видео |
sendContact | Отправляет контакт |
getUpdates | Получает обновления из чата |
Все методы (а их достаточно много) делятся на группы:
- Получение обновлений и информации.
- Работа в чате.
- Отправка различных элементов.
- Работа со стикерами.
- Обновление сообщений.
- Режим inline.
- Платежный функционал.
- Для игр.
Полной документации Telegram Bot API на русском пока не существует. Однако стандартный перевод в браузере Google Chrome прекрасно справляется с задачей.
Языки программирования
Telegram API поддерживается множеством языков программирования. Это дает возможность выбора создателю.
Любители JavaScript могут использовать Node.js Telegram Bot API. Здесь необходимо знание не только языка, но и умение обращаться с этим фреймворком, превратившим клиентский язык в полноценный серверный интерфейс.
Одним из самых популярных для написания ботов с использованием Telegram Bot API является PHP. Этот язык изначально был предназначен для создания серверных web-приложений. Он отличается простотой, логичностью и специализированностью именно для web-среды.
Часто используется Telegram Bot API в Python. Этот язык отличается минимализмом и достаточно прост в изучении. Он очень популярен за счет своей производительности.
Классикой является применение Telegram Bot API в С++. Язык нельзя назвать простым, но он является базой, на которой были созданы все остальные вышеперечисленные ЯП. Соответственно в нем не заложена определенная специализация. Инструменты позволяют создавать любые приложения.
Пример использования
Кроме объектов API имеет набор методов, которые позволяют отправлять сообщения, файл, фото стикеры, редактировать и многое другое. Все эти команды можно найти в описании API на официальном сайте.
Все запросы имеют вид:
https://api.telegram.org/bot/КОМАНДА
Всего существует 4 способа подачи запроса:
- Запрос в URL
- application/x-www-form-urlencoded
- application/json (не подходит для загрузки файлов)
- multipart/form-data (для загрузки файлов)
Доступны как GET, так и POST запросы.
Самый простой способ попробовать команды API – адресная строка в браузере. Зайдите в свой бот в web-версии или с мобильного устройства. Затем в браузере наберите команду:
В результате в окне появится JSON-строка
В браузере появится строка
А в чате Телеграмм вы увидите приветствие от созданного робота.
Как видите, создать с нуля новый элемент для Телеграмм не сложно. Трудности начинаются в момент программирования, но об этом расскажем в других статьях.
Источник: telegramzy.ru
Пишем бота Telegram на PHP
Anton Bagaiev Last updated Aug 3, 2016
Read Time: 9 min
Если вы читаете это, то скорее всего понимаете, что боты для чатов является популярным трендом в 2016 году.
Эволюция ботов заключается не только в искусственном интеллекте. Ботом может быть инструмент в вашем мессенджере с простым интерфейсом, который может быть использован для расширения функционала сайта или сервиса, или использован как отдельное приложение. Боты легки в разработке и установке, и еще один плюс заключается в том, что мессенджеры могут использоваться на любом устройстве: ноутбуках, смартфонах и планшетах. Вот почему все сходят с ума по ботам.
И наиболее популярным мессенджером с открытым API для ботов является Telegram.
Что мы собираемся делать
В этой статье мы создадим простой бот-секундомер для Telegram. Я покажу вам как создавать собственного бота, связываться с аналитикой, напишем немножко кода и в конце добавим своего бота в магазин ботов.
Создаем бота с помощью BotFather
Первым шагом при создании бота нужно зарегистрировать аккаунт для своего бота в Telegram. И для этого есть собственный бот, который называется BotFather. Просто добавьте его в свой контакт лист и вы сможете создавать и настраивать ботов Telegram, просто напечатав команду /newbot и следуя инструкциям от BotFather.
После регистрации вашего нового бота, вы получите сообщение с поздравлением и токен для авторизации. Мы скоро будем использовать этот токен для авторизации бота и отправки запросов к Bot API.
Позднее вы сможете использовать BotFather для добавления описаний и фото к профилям ваших ботов, регенерации токенов, задания списка доступных боту команд, удаления аккаунтов и прочее. Чтобы получить полный список команд, просто напечатайте /help в чате с BotFather.
Соединяемся с Botan Analytics
Не существует никакой встроенной аналитики в Telegrem Bots API, но все равно важно знать, сколько пользователей у вас есть, как они себя ведут и какие команды используют чаще других. Конечно можно собрать такую информацию, используя собственный движок, но если мы собираемся сфокусироваться на функционале самого бота, а не метриках, то нужно использовать решение из коробки.
И для этого уже есть простой инструмент, который называется Botan. Он основан на Yandex AppMetric и абсолютно бесплатный. Используя Botan, можно сегментировать вашу аудиторию, получать информацию о профилях пользователей, получить наиболее часто используемые команды, а так же получить красивые графики прямо в вашем мессенджере:
Для того чтобы начать, нужно зарегистрировать ваше бота в Botan и получить свой токен. И опять же это можно сделать в боте, используя BotanioBot:
Просто нажмите на «Add bot» на вашей клавиатуре в диалоговом окне, введите ник вашего бота, и получите ваш токен для трекинга. Теперь Botanio готов регистрировать события вашего бота, а вы можете получать статистику по пользователям, сессиям и событиям прямо в вашем мессенджере.
Создание и регистрация SSL Webhook
В Telegram есть два способа получения сообщений от пользователей: длинный опрос и webhooks.
Обычно с долгим опросом, вам необходимо запрашивать новые сообщения из API, а с webhooks вы устанавливаете свой обратный вызов, который будет вызван API Telegram, если появится новое сообщение от пользователя. Я предпочитаю использовать webhooks потому что это больше похоже на взаимодействие в реальном времени, так что в этой статье мы так же будем использовать этот способ. Теперь нам нужно выбрать URL для обратного вызова нашего webhook, который будет вызван по HTTPS протоколу, и нужно установить его достаточно безопасным, и расположить свой скрипт в безопасной директории как сказано в руководстве:
Если вы хотите убедится что запрос Webhook действительно исходит от Telegream, мы рекомендуем использовать секретный путь в URL, например: https://www.example.com/ . Так как никто больше не знает токена для вашего бота, то вы можете быть уверены, что запрос идет от нас.
Если у вас подтвержденный SSL сертификат, то все что вам нужно, это открыть ваш URL в браузере:
https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]
Иначе необходимо сгенерировать самоподписанный сертификат. Вот пример команды в Linux для этого:
openssl req -newkey rsa:2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj «/C=IT/ST=state/L=location/O=description/CN=yourdomain.com»
И не забудьте открыть SSL порт:
sudo ufw allow 443/tcp
Чтобы подтвердить ваш сертификат и сделать ваш домен для webhook доверительным, необходимо загрузить свой публичный ключ:
curl
-F «url=https://yourdomain.com/path/to/script.php»
-F «certificate=/path/to/certificate.key»
«https://api.telegram.org/bot[token]/setwebhook»
В итоге вы получите следующий JSON ответ:
«ok»:true,»result»:true,»description»:»Webhook was set»>
В нем сказано что webhook был установлен и мы готовы начать работу с ботом.
Создаем базу данных
Теперь нам нужно создать базу данных для наших таймеров. Что мы собираемся в ней хранить? Когда пользователь дает команду секундомеру начать отсчет, мы будем брать ID чата и сохранять строку с ID чата и текущим временем Unix. Следовательно мы сохраним строку с отметкой времени и ID чата.
Чтобы показывать текущее время секундомера, мы будем брать сохраненную метку времени и сравнивать ее с текущим временем. Разница и будет текущее время в секундах. Если пользователь останавливает секундомер, то мы просто удаляем строчку с данным ID чата.
Итак давайте создадим базу данных и таблицу для хранения информации для секундомера:
CREATE TABLE IF NOT EXISTS `stopwatch` (
`chat_id` int(10) unsigned NOT NULL,
`timestamp` int(10) unsigned NOT NULL,
PRIMARY KEY (`chat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Создание класса Stopwatch
Наконец мы готовы начать писать код. Создадим класс для работы с базой данных в файле stopwatch.php и начнем с конструктора, который устанавливает два приватных свойства, где мы будем хранить ID чата и соединение с MySQL:
class Stopwatch
Источник: code.tutsplus.com