Пишем телеграм-бот

Telegram – широкоизвестный и популярный мессендждер-соцсеть в узких кругах, и этот круг быстро расширяется благодаря стараниям его конкурентов. Под конкурентами я имею ввиду “традиционные” социальные сети, которые внедрением(ужесточением) цензуры отталкивают многих… Но эту статейку я хочу посвятить не свободе слова(или вседозволенности, как ее некоторый называют), а созданию бот-программы.

О Telegram

Он возник как эксперимент П.Дурова с технологией MTProto – методом шифрования, созданным его братом Н.Дуровым. MTProto – криптографический метод проитокол передачи данных, основанный на симметричном шифровании и ряде других приколюх, предназначенных для безопасной передачи данных. Все это значит, что исходящее сообщение могут прочесть только тот, кто его отправил, и тот, кому(те, кому – если это чат или канал) оно было отправлено. Именно эта защищенность от третьих лиц(не дающая возможности точечной модерации) и дает все новые и новые обороты в популярности этого приложения. Что и говорить – даже Трамп, после его изгнания из Twitter`а и прочих заокеанских сетей, создал Telegram-аккаунт!

Бот это что?

Телега имеет два вида API: Telegram API и Telegram Bot API. Первое служит для постройки своего приложения, использующее внутреннюю инфраструктуру(сервера по-сути) Телеграма, эти методы реализует TDLib. Бот – это также программа, но уже размещенная на своем сервере; еще отличие в том, что он(точнее, его интерфейс) может быть во всех программах использующих сервера телеги(в приложении Telegram точно, может быть реализовано в прогах на TDLib).

Итак,можно говорить было бы о Telegram API, но ты пришол сюда, вероятно, узнать о ботах. Первым делом – его возможности:

  • Получайте индивидуальные уведомления и новости
  • Интегрируйте с другими сервисами
  • Принимайте платежи от пользователей Telegram
  • Создавайте собственные инструменты
  • Создавайте одиночные и многопользовательские игры

Да, это то что перечислено в доках телеги – а что ты ожидал?? Я остановлюсь на пункте 4 и создам форму для оформления оформления заказа на сайте(по-сути, можно сказать пункт 2)

Создание бота. Теория

В этом разделе указана теория потому, что здесь я опишу алгоритм образования бота, так сказать – создать общее понимание процессов.

Прежде всего, как и при любой работе с программными интерфейсами, – аутентификация. Здесь не привычной аутентификации вроде получения открытого и закрытого ключей и, в начале каждой сессии, получение временного токена; вместо этого нужно написать боту, который, на основании предоставленных данных, зарегистрирует нового бота и выдаст тебе постоянный токен. После этого, в “диалоге” с ним же, выкатываем ему ввесь список команд, которые должны быть у бота.

Далее, мы должны сообщить адрес на который будут приходить все обновления – все действия с ботом -это вариант №1. Второй вариант – когда прослушка не установлена – все действия сохраняются на сервере мессенджера и, в течении 24 часов, можно получить этот лог. Эти два варианта – два взаимоисключающие методы: если установлена прослушка – лог на сервере вестись не будет и наоборот, но тогда события никуда не будут отправлены.

Создание бот. Практика

На практике всегда стоит использовать готовые, одобренные разрабами телеграма, библиотеками – об этом говорю не только я, но и документация, иначе может последовать бан. Но, дабы лучше понять, как это устроенно и работает – я реализую это нативно(без использования библиотек).

@botFather

Находим @BotFather, начинаем с ним переписку(отправляем команду “/start”). В ответ он перечислит все команды, которые ему доступны,, жмем “/newbot” и пишем слаг создаваемого бота. Если все прошло успешно(выполняется условие уникальности слага) – создается бот и ты получишь его токен; также, выполнив команду “/setcommands” можно указать список нужных команд(команда “/start” будет создана автоматически).

Перейдем непосредственно к программированию сервера нашего бота! Писать я буду на PHP, но разница невелика. Использую метод curl(), поскольку для задания пути нашего “слушателя” нужно отправить публичный ключ ssl-сертификата сервера с бот-программой. “Программного приветствия” нет, вот код для установки слушателя(его также можно установить из CLI)

<?php
    // инициализируем сеанс связи с нашим ботом
	$ch = curl_init( "https://api.telegram.org/bot{bot-token}/setWebhook" );
	// в заголовках сообщаем, что передаем файл
	curl_setopt( $ch, CURLOPT_HTTPHEADER, [ "Content-type: multipart/form-data" ] );
	curl_setopt( $ch, CURLOPT_POST, true );
	curl_setopt( $ch,
		CURLOPT_POSTFIELDS,
		[
			'url'         => 'https://'.$_SERVER['HTTP_HOST'],//  адрес слушателя
			'certificate' => '@' .realpath(__DIR__ . '/public.pem')// путь к публичному ключу
		] );

	curl_exec( $ch );

	curl_close( $ch );

В ответ этому скрипту, если не возникло ошибок, будет возвращена сторка

{"ok":true,"result":true,"description":"Webhook was set"}

но, на самом деле, это еще не показатель правильной установки адреса прослушки. Чтоб проверить правильность перейди по адресу https://api.telegram.org/bot{bot-token}/getWebhookInto, в случаи если все правильно будет

{"ok": true, "result": {"url": " https://xxx.xxx.xxx.xxx", "has_custom_certificate": true, "pending_update_count": 25, "last_error_date": 1484557151, "last_error_message" ":" Время ожидания соединения "," max_connections ": 40}}

В случаи, если интернет провайдер сервера твоего бота не блокирует Телеграм(намек на РФ), на адрес https://xxx.xxx.xxx.xxx будут приходить уведомления от бота. Например, пользователь сделал команду “/start”, на адрес https://xxx.xxx.xxx.xxx/start будет отправлен запрос.

В ответе на обновление от телеги должен содержатся один из “Допустимых типов”.

Погворим о втором варианте – получение обновлений самостоятельно. Прежде всего, нужно удалить прослушку: перейдите по адресу https://api.telegram.org/bot{bot-token}/setWebhook, при этом ты увидишь

{"ok":true,"result":true,"description":"Webhook was deleted"}

далее, любое действие с ботом будет записано и доступно по адресу https://api.telegram.org/bot{bot-token}/getUpdates в виде обьекта Update.

Как я говорил ранее, не делай этот код нативно используй одобренные разрабами библиотеки… все это лишь для понимания того, что происходит “под капотом” у этих библиотек! Оно пригодится…