Ваш собственный телеграм-секретарь: делаем вместе

Пошаговая инструкция для тех, кому нужен секретарь.

Ваш собственный телеграм-секретарь: делаем вместе

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

Какую задачу решаем

Проблема: сейчас у нас есть новостная редакция — её сотрудники каждый день читают новости в интернете и отбирают интересные. Но новостей много, а сотрудников мало, поэтому иногда интересные новости проходят мимо нас.

Что можно сделать: сказать всем, что если нашли интересную новость — присылайте её нам напрямую, в личные сообщения в телеграме. Но если новостей окажется слишком много, то у редактора новостей в личке начнётся ад.

Решение: сделать телеграм-бота, которому можно отправить сообщение, а он перешлёт его куда нужно. Чтобы не плодить личные сообщения от бота, можно сделать так:

  1. Сделать внутренний чат новостной редакции
  2. Добавить в него бота
  3. Настроить бота так, чтобы он отправлял сообщения пользователей в этот чат.

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

Сложный вариант — написать своего бота и поставить его на сервер (мы не стали так делать)

Кажется, что если мы — издание про технологии и у нас есть программисты и свои виртуальные серверы, то проще всего будет написать бота на питоне и отправить на сервер. Но на самом деле с таким подходом есть много сложностей:

  • нужно найти программиста на питоне, который сможет написать код;
  • этот код потом нужно поддерживать, если понадобится добавить новые функции;
  • нужно подготовить сервер к постоянной фоновой работе python-кода;
  • следить за тем, чтобы бот работал круглосуточно, а если падал, то сам умел перезапускаться;
  • следить за самим сервером и в случае чего — перезапускать его и все программы на нём.

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

👉 Свой бот на своём сервере — это правильный подход, если у вас в компании уже настроен подобный процесс и есть отдельная команда, которая за это отвечает. В маленькой команде разворачивать всю эту систему ради одного бота — перебор.

Простой вариант — использовать конструктор

Мы уже писали про онлайн-конструкторы ботов и собирали тестового бота в одном из них. С таким подходом мы решаем большинство проблем из первого варианта:

  • не нужно следить за сервером, потому что за это отвечает сервис с конструктором;
  • не нужно искать программиста с необходимой квалификацией;
  • чем меньше кода, тем проще поддерживать готовый продукт.

Но появляются и свои риски и особенности:

  • сервис может закрыться, и бот перестанет работать;
  • если нужно добавить что-то, что не предусмотрено сервисом, то либо это будет сложно и громоздко, либо вообще не получится сделать.

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

Это наш выбор.

Логика проекта

  1. Создаём нового бота и добавляем его в чат.
  2. Получаем нужные параметры для настройки бота.
  3. Создаём бота в конструкторе.
  4. Настраиваем чат для полноценной работы в редакции.

Сделаем всё по очереди.

Создаём нового бота и добавляем его в чат

Регистрируем нового бота через @BotFather — делаем это точно так же, как в материале про бота на питоне. Мы создали бота @Eto_v_Kod_bot и назвали его «Это в Код»:

Создаём нового бота и добавляем его в чат
Мы закрасили токен для управления ботом, он нам понадобится для подключения к конструктору

Теперь создаём публичный чат и добавляем в него бота. Публичный чат нам нужен, чтобы получить ID чата, потом сделаем его приватным. Именно в этот чат бот будет пересылать полученные сообщения.

Создаём нового бота и добавляем его в чат
Чат редакции с добавленным ботом

Узнаём ID чата

В телеграме у каждого чата есть свой ID — уникальный идентификатор, с помощью которого можно отличать один чат от другого. Чтобы наш бот пересылал сообщения в нужный чат, узнаем его ID. Для этого сначала пишем боту любое сообщение (неважно, что он ещё не работает), а затем делаем такую магию — переходим в браузере по адресу

https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates

👉 Перед тем, как это делать, отключите бота от конструктора или выключите его там в настройках, иначе магия не сработает.

Это значит, что мы должны:

  1. Взять наш токен.
  2. Подставить его  вместо <ВАШ_ТОКЕН>. 
  3. Скопировать всё, что получилось.
  4. Вставить результат в адресную строку и перейти по этому адресу.

Например, в нашем случае адрес будет такой:

https://api.telegram.org/bot1738394823:
AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo/getUpdates

Когда мы перейдём по этому адресу, браузер нам напишет что-то такое:

{“update_id”:8393,”message”:{“message_id”:3,”from”:{“id”:7474,”first_name”:”AAA”},”chat”:{“id”-1034423424553:,”title”:”Eto_v_Kod”},”date”:25497,”new_chat_participant”:{“id”:71,”first_name”:”NAME”,”username”:”Eto_v_Kod”_bot”}}}

Нам нужно то, что написано после chat id: -1034423424553 — это и есть ID нашего чата, дефис перед числом тоже важен.

👉 Теперь чат снова можно сделать приватным, на ID это не повлияет.

Собираем бота в конструкторе — стартовый экран

Мы используем конструктор BotMother — мы уже рассказывали, как с ним работать и собрать своего тестового бота. Если что-то по ходу описания будет непонятно, почитайте сначала ту статью.

Стартовый экран — это то, что выполняет бот по команде /start. Сделаем на стартовом экране выбор из двух кнопок: отправить новость и отправить статью:

Собираем бота в конструкторе — стартовый экран
Здесь три компонента: текстовый блок и две кнопки

Теперь нам нужно сделать так, чтобы при нажатии на каждую из этих кнопок бот делал то, что нам нужно. Для этого создаём два экрана: «Предложить новость» и «Предложить статью» и настраиваем действия по кнопкам:

Собираем бота в конструкторе — стартовый экран
Всё, стартовый экран готов, идём к новостям

Собираем экраны «Предложить новость» и «Предложить статью»

Логика экрана будет такой:

  1. Пишем текст с пояснением, что нужно сделать — написать текст новости или дать ссылку на неё.
  2. Сохраняем ответ в отдельной переменной news1.
  3. Отправляем в наш новостной чат сообщение от бота с именем посетителя, который написал новость, и текст самой новости.
  4. Чтобы сообщения не слипались, вдогонку отправляем в тот же чат отбивку — линию-разделитель из нескольких дефисов.
  5. Если мы дошли до последнего пункта и всё прошло без ошибок — показываем посетителю экран «Всё хорошо», а если на каком-то этапе была ошибка — сразу перебрасываем его на экран «Что-то не так».

Сначала посмотрим на готовый экран, а потом разберём его по шагам:

Собираем экраны «Предложить новость» и «Предложить статью»
Первые два экрана соответствуют тому, что мы писали в алгоритме, а два остальных — это и есть наша отправка сообщений в чат

Каждую отправку мы сделали через запрос POST к API телеграма. Когда сервер телеграма получает специальным образом подготовленный запрос, он выполняет какое-то действие — это называется работа по API и про это у нас есть отдельная статья.

В нашем случае все запросы используют метод sendMessage, у которого всегда есть два параметра:

  1. ID получателя.
  2. Текст сообщения.

В общем виде команда выглядит так:

https://api.telegram.org/bot<ТОКЕН_БОТА>/
sendMessage?chat_id=<ID_чата>&text=<Сообщение>

Мы уже знаем токен бота и ID чата, куда хотим отправить сообщение — это ID нашего чата, который мы выяснили до этого. Подставляем эти значения и получаем команду:

https://api.telegram.org/bot1738394823:
AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo
/sendMessage?chat_id=-1034423424553&text=<Сообщение>

Первым сообщением мы отправляем имя того, кто предложил новость, и сам текст новости, поэтому сообщение будет выглядеть так:

Новость, отправил @{{this_user.username}} → {{news1}}

Здесь {{this_user.username}} и {{news1}}  — это переменные. Первая переменная стандартная в конструкторе BotMother, а вторую сделали мы сами на этом же экране. Полный текст запроса выглядит так:

https://api.telegram.org/bot1738394823:
AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo/sendMessage?
chat_id=-1034423424553&text=Новость, отправил
@{{this_user.username}} → {{news1}}

Сделаем по аналогии вторую команду, которая присылает отбивку в чат, чтобы отделить одну новость от другой:

https://api.telegram.org/bot1738394823:
AAF4h6dkgjKH88lKanJ899lpH-Jqkd5k2399sjKo/
sendMessage?chat_id=-1034423424553&text=————

👉 Вместо двух запросов на отправку сообщения можно было использовать функцию API телеграма forvardMessage, которая просто пересылает сообщения. Для этого нам понадобился бы порядковый номер сообщения в переписке. Если бы мы писали бота на питоне, с этим бы не было никаких проблем, но в этом конструкторе проще сделать отправкой, как у нас.

Точно так же собираем экран «Предложить статью»:

Собираем экраны «Предложить новость» и «Предложить статью»
Единственное, что поменялось на этом экране — приветственный текст и имя переменной

Собираем экраны успеха и ошибки

Чтобы было что показывать пользователям в случае успеха и ошибки, соберём два новых экрана. Экран успеха будем показывать только в конце последнего действия — это значит, что всё выполнилось хорошо. Переход на экран ошибки добавим к каждому действию в запросе, которое реагирует на ошибку.

В конце обоих экранов добавим переход на стартовый экран. Так пользователь сможет сразу отправить ещё одну новость или статью без лишних команд боту:

Собираем экраны «Предложить новость» и «Предложить статью»

Финальная схема

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

Финальная схема

Что дальше

Нажимаем кнопку «Сохранить» в конструкторе, и всё — бот готов к работе. Теперь можно добавить картинку и описание.

Текст и редактура:

Михаил Полянин

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
Генератор лабиринтов
Генератор лабиринтов

Рисуем лабиринты любого размера.

hard
Как поклеить обои
Как поклеить обои

Поручим это машине.

easy
Собственный текстовый редактор: делаем красиво
Собственный текстовый редактор: делаем красиво

Самое простое и полезное введение в CSS.

medium
Как с помощью CSS задавать размеры элементов на сайте
Как с помощью CSS задавать размеры элементов на сайте

Шпаргалка по единицам измерения для начинающих верстальщиков

easy
Как сделать свой сайт за 10 минут без программирования
Как сделать свой сайт за 10 минут без программирования

Для некоторых это становится источником постоянного дохода, если подойти к процессу с умом.

easy
Играем со шрифтами на главной странице
Играем со шрифтами на главной странице

Делаем красивый эффект на случайном фоне

easy
Ускоряем работу в Экселе
Ускоряем работу в Экселе

Делаем свой макрос

easy
ReferenceError: math is not defined — что это означает
ReferenceError: math is not defined — что это означает

Противная и неочевидная ошибка, которую очень легко исправить.

medium
Одной строкой: новые CSS-команды для фронтендов
Одной строкой: новые CSS-команды для фронтендов

Что можно сделать в современном вебе.

medium
easy