Как создать свой первый Telegram бот: руководство для начинающих

Этот пост предназначен для простого руководства по созданию простого бота Telegram. Есть несколько документов, но я нашел их не так просто, как хотелось бы. Вот основные ссылки, которые вам нужны для работы с API Telegram Bot, вам не нужно их проверять прямо сейчас, но я сначала отправлю их в качестве ссылки:

Нам нужно два отдельных потока, чтобы получить рабочий бот:
1. Веб-сервер, который обрабатывает сообщение боту и генерирует вывод.
2. Настройка и интеграция ботов телеграмм.

Важно сделать это разделение как можно раньше, потому что, если это будет сделано правильно, мы сможем в будущем изменить ботовую платформу без существенных изменений в нашем коде, например, использовать тот же бот с Slack, GitHub или Facebook.

Быстрые определения:

Что такое Telegram?

Я уверен, что если вы здесь, вы уже знаете, но здесь мы идем … Telegram — платформа для обмена сообщениями с открытым исходным кодом, внешне очень похожая на Whatsapp, но с некоторыми важными отличиями под капотом. Вы можете одновременно войти на несколько устройств, номер вашего мобильного телефона используется для двухфакторной аутентификации, поэтому, когда вы запускаете какой-либо сеанс, код отправляется на ваш мобильный телефон, но это все, после этого каждый сеанс является независимым, и это не имеет значения, если ваш телефон не подключен, вы даже можете использовать телеграмму в качестве быстрого решения для передачи файлов между всеми вашими устройствами. Я упомянул, что это платформа, а не приложение. Разница в том, что платформа позволяет вам строить вокруг нее, в то время как приложение, даже когда доступен API, позволяет вам использовать его или интегрировать в него. Telegram поддерживает боты, платежи, видео и некоторые другие интересные функции, но все идет дорого, и мы поговорим об этом при создании нашего бота.

Что такое телеграм бот?

Чтобы это было очень просто, бот — это некоторый фрагмент кода, который вводит пользовательский ввод и создает автоматизированный выход. Тогда почему это отличается от классической модели сервера? Что ж, для простых ботов это не так, а в другом — подход, обычно боты используются в чатах и инициируются событиями чатов, в то время как ответ сервера запускается из HTTP-событий. Другая связанная концепция, которая может быть добавлена позже, но не обязательна для бота, — это обработка естественного языка, большинство ботов в настоящее время стремятся быть разговорными ботами, но, как я уже говорил, это не является обязательным требованием.

Что такое безсерверная функция?

Это мое определение, для более всеобъемлющего вы, вероятно, должны проверить отличный пост Майка Роберта на серверах без сервера. Безсерверная функция — это сервер на основе HTTP, в первую очередь, но он полностью управляется провайдером PaaS (Platform as a Service), поэтому вы просто подключаете свою функцию, считая, что все в среде уже настроено, и вы получите хорошо отформатированный запрос для создания, хорошо отформатированный ответ, как запрос, так и ответ уже существуют в контексте функции, все, что вам нужно сделать, это использовать их.

Зачем использовать бессерверную функцию?

Это здорово использовать, потому что вам не нужно беспокоиться об инфраструктуре, масштабировании или чем-то еще, вам просто нужно беспокоиться о своей собственной специфической функции обработки. Некоторые могут утверждать, что цена является критерием, и есть некоторые статьи о скрытых затратах с этой архитектурой, о которых я просто должен сказать, что это выходит за рамки этой публикации, но персональный бот, который, например, позволяет вам для управления огнями вашего дома или для отправки на ваш статический сайт из Telegram, количество запросов будет настолько низким, что при большинстве поставщиков услуга будет включена в свободный уровень. Для меня главной причиной выбора этой архитектуры для этой публикации является то, что даже если вы не программист на полный рабочий день, очень легко добиться успеха, не беспокоясь о многих технических деталях.

Серверная часть

Для этой части мы собираемся использовать Google Cloud Platform, нет никаких конкретных критериев для использования Google Cloud, на самом деле, AWS, Azure и большинство провайдеров придерживаются очень близкого потока, и у всех есть отличная документация для начала работы, и именно поэтому я выиграл Больше не копайте, и я просто опишу поток, указанный в этом руководстве.

1. Получите учетную запись Google Cloud и включите выставление счетов.
2. Загрузите и установите gcloud Command-Line Tool.
3. Включить API функций.
4. Создайте свою первую функцию.

Создание Telegram бота

Эта часть является основой сообщения, и я начну с объяснения нескольких вещей о платформе Telegram. Платформа Telegram централизована, мне это не нравится, хотя я понимаю, что это частично из-за проблем конфиденциальности, и я полностью согласен с тем, что это хорошее решение для создания быстрой платформы сообщений с открытым исходным кодом. Давайте немного поговорим об этом, конфиденциальность — это очень важная проблема для любого веб-сервиса и специально для мессенджера, который передает по чувствительной к сети информацию о столь многих пользователей, даже если информация зашифрована, есть много разных компонентов, о которых нужно беспокоиться, и это означает, что многие векторы для атаки и компрометации платформы, которая говорит, хороший способ защиты платформы (и получение некоторого конкурентного преимущества, даже если это платформа с открытым исходным кодом), заключается в том, чтобы установить прокси-сервер между коммуникацией. Важно понимаете, что это не означает цензуру, это просто какой-то промежуточный сервер, поэтому пользователи не говорят напрямую с другими пользователями, и пользователи не могут получить такую ​​информацию о других пользователях или атаковать других пользователей, почему?

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

ОК, поэтому отказ от ответственности теперь, что это означает с точки зрения разработки, состоит в том, что все наши сообщения должны проходить через сервер Telegram, мы получаем сообщения со своего сервера, и мы отправляем ответ им, а не пользователям, теперь давайте вернемся для работы после выполнения руководства по началу работы с облачными функциями Google вам должен быть запущен сервер, даже если он отвечает только текстом Hello World при получении запроса. Мы продолжим оттуда, план того, что мы собираемся сделать, — здесь

Зарегистрируйте ваш телеграм бот с помощью BotFather.

Да, BotFather — бот, и зарегистрировать новых ботов в платформе. Если вы читаете это на своем мобильном телефоне или компьютере, на котором установлен ​​Telegram, откройте окно чата с BotFather, иначе вам придется искать его в Telegram. После этого шага вы будете иметь токен. Это вы будете использовать для связи с сервером Telegram.

2. Зарегистрируйте webhook для получения сообщений об обновлении.

Вы можете получать обновления сообщений двумя различными способами: опросом и веб-узлом. Чтобы это было просто, опрос означает, что вы запрашиваете сервер для сообщений, вам нужно определить интервал для опроса и написать код для этого опроса, webhook означает, что вы регистрируете адрес, который будет получать запрос каждый раз, когда ваш бот получит сообщение , так что это наоборот, Telegram позаботится обо всем и сообщит нам, когда у нас появится сообщение, и именно поэтому мы будем использовать последнее, вы должны иметь в виду, что для настоящего бота некоторые другие технические проблемы в частности, вам, вероятно, потребуется очередь сообщений, балансировщик нагрузки или и то, и другое, чтобы не насыщать ваш сервер запросами (даже если он безсерверный, вы, вероятно, захотите иметь некоторый контроль над этим), так что проще путь будет состоять в опросе.

Для этого шага мы можем использовать curl, Postman или Insomnia, чтобы сделать запрос к конечной точке ‘/ setWebhook’, используя наш токен и зарегистрировать webhook. Мы можем сделать запрос GET и отправить URL-адрес в качестве параметра запроса, называемого url, давайте добавим токен к URL-адресу, который мы зарегистрируем, этот токен должен храниться в секрете и будет объясняться в следующем разделе, что-то вроде «https: // us -central1-my-bot.cloudfunctions.net/helloBot/here-goes-my-secret-token ‘или это’ https://us-central1-my-bot.cloudfunctions.net/helloBot?token=here-goes- мой секретный-токен.

3. Создайте функцию, которая отправит ответ пользователю.

Для этого урока мы будем только приветствовать отправителя сообщения. Вот репозиторий GitHub, в основном мы отправляем запрос POST в конечную точку ‘/ sendMessage’,  в документах Telegram упоминается, что запросы могут быть либо GET, либо POST. Сообщение, которое мы получим, определено в бот-API в разделе Available Types -> Message, мы замечаем, что мы имеем свойство from, возвращающее тип пользователя, и что внутри пользователя мы имеем как свойства имени, так и фамилии, Используйте их, чтобы приветствовать нашего пользователя. Существует также свойство чата с типом чата, и нам нужен идентификатор для отправки сообщения в тот же чат, с которого мы получаем начальное сообщение.

Мы используем axios для отправки запроса на сервер Telegram, но есть несколько альтернатив, включая использование модуля http-узла без какой-либо библиотеки. Наконец, я должен указать две вещи о безопасности, во-первых, что ваша безсерверная функция теперь доступна онлайн для всех, кто знает URL-адрес, поэтому есть два связанных риска, первый из которых сам по себе, его можно вызвать так много и это может означать некоторые расходы, а во-вторых, и тот, о котором мы можем сейчас что-то сделать, любой, у кого есть URL-адрес, может инициировать действие, в нашем случае отправляя сообщения пользователю Telegram. Для этой документации Telegram предлагается добавить токен к конечной точке, в которой работает наше приложение, для объектов goq и объектов resus google имеют те же свойства, что и те, что используются в Express, поэтому мы можем запросить наш секрет несколькими способами в зависимости от того, как мы определяем его:

  • Основной URL-адрес: https://us-central1-my-bot.cloudfunctions.net/helloBot. Он включает имя вашей функции.
  • Ссылка req.path даст оставшийся путь, / here-go-my-secret-token.
  • Параметр req.params создает ассоциативный массив, к которому можно получить доступ в зависимости от позиции относительно URL-адреса, поскольку мы не имеем никакого контроля над этим для этой функции, мы получаем весь оставшийся путь как req.params [0], то есть / здесь -goes-мой секретный-токен.
  • Мы также можем использовать req.query, он возвращает часть запроса URL-адреса, то есть часть после? символ. В этом примере req.query.token = / here-go-my-secret-токен.

Второе соображение касается маркера, который мы получаем от BotFather. Важно никогда не публиковать его, потому что он предоставляет доступ к нашему боту, мы должны помнить, что мы использовали этот токен для регистрации webhook. Поэтому кто-то с доступом к нему может легко удалить наши webhook и перенаправить наш бот-трафик на собственный сервер. Существует несколько разных способов сохранить этот токен в секрете, некоторые хорошие варианты для больших систем используют сервисы Google Cloud, как описано в этом руководстве, или с использованием других служб секретов, секреты в этом контексте обычно используются для токенов или учетных данных, необходимых для аутентификации служб и это не должно быть частью базы кода и не должно быть привязано к репозиторию. Функции Google используют другой файл игнорирования, чем git, .gcloudignore, поэтому мы можем с радостью добавить файл local.js, который экспортирует наш токен и добавляет его в файл .ignore. Используемый git будет автоматически загружен на сервер. Для любого более крупного проекта, пожалуйста, найдите момент, чтобы просмотреть свои политики и стратегии безопасности.

const http = require('http');
const axios = require('axios');
const localconf = require('./local.js');
exports.helloBot = (req, res) => {
  function sendMessage(options) {
    const token = localconf.telegramToken;
    const url = 'https://api.telegram.org/bot${token}/sendMessage';
    axios.post(url, {
      chat_id: options.chatId,
      text: options.greetings
    })
    .then(function (response) {
      console.log(response);
      res.send({ status: ‘OK’});
    })
    .catch(function (error) {
      console.log(error);
      res.sendStatus(500);
    });
  }
  const callToken = req.path;
  if ( callToken !== localconf.webhookToken ) {
    const message = req.body.message;
    const options = {
      greetings: `Hello ${message.from.first_name} ${message.from.last_name}!`,
      chatId: message.chat.id
    };
    sendMessage(options);
  } else {
    res.sendStatus(403);
  }
};


Завершение
телеграм бот