Как сделать таймер в телеграмм боте

Обновлено: 07.07.2024

Представьте, вы работаете на очень ответственной должности в банке: вы принимаете самые важные стратегические решения в компании. Но вы так давно не были в отпуске, ведь каждый день нужно отвечать стольким сотрудникам… Вот бы вас кто-нибудь подменил…

В этом туториале вы напишете телеграм-бота для принятия особо важных стратегических решений:

Перед тем как начать…

Очень советуем не просто читать этот туториал, а проходить его вместе с нами. Копируйте кусочки кода из него и запускайте их по мере прочтения текста. Так вы поймёте происходящее гораздо лучше.

1. Создайте бота

Пользоваться будем библиотекой ptbot . Перейдите в его документацию и следуйте инструкциям в разделе “Как начать пользоваться”.

2. Заставьте бота говорить

Давайте её менять:

3. Научите бота принимать решения

Похоже, этот код с ошибкой! Вот что он выводит:

Это ошибка, на которую часто натыкаются начинающие питонисты. Дело в том, что команда print() принимает любое количество аргументов: сколько вы ей передадите, столько она и выведет. Пример:

Вот что получилось:

4. Соберите код принятия решения в функцию

Теперь ваш бот умеет принимать решения. Но чтобы он это делал, его нужно запускать несколько раз. Жать на зелёную кнопку в Repl – занятие не очень интересное, хорошо бы его автоматизировать. Поможет функция:

После того, как вы объявили функцию, вы можете её вызывать. Так же, как вы делали это с print() , т.е. просто напишите её название и поставьте скобки:

Чтобы создать новую функцию, нужно не так-то много действий. Каждая функция начинается со слова def . Это сокращение от define , т.е. “определить”. Так код понимает разницу между созданием функции и её использованием:

Второе правило: весь код функции пишется с отступом в 4 пробела:

Конечно, не обязательно жать 4 раза на клавишу “пробел”. То же самое делает клавиша TAB на левом крае клавиатуры.

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

То есть всё, что внутри функции, остальному коду недоступно.

Функция – это отдельный кусочек кода, который можно запустить попозже

5. Сделайте выбор неслучайным

Ну давайте поступим по-простому: пусть функция выводит в консоль кто и что спрашивал у бота:

print() понятно, а дальше что. Что в него писать. В функции нет таких переменных… Чтобы они появились, нужно добавить функции аргументы:

Теперь функция получает 2 аргумента: ID пользователя в Telegram и его вопрос. А вот как функцией теперь пользоваться:

Если сделать вот так, по-старинке:

Вы получите ошибку:

Знакомая ошибка! Вы сталкивались с ней в пункте 3 этого туториала. Только теперь вы недодаёте функции аргументов, ведь теперь она принимает сразу 2!

Последний тюнинг: разрешим боту общаться с другими пользователями. Для этого в методе send_message заменим TG_CHAT_ID на chat_id. TG_CHAT_ID – это ваш id, поэтому бот мог писать только вам. Вместо него мы передадим методу chat_id , это id любого, кто пишет боту. Этот id мы передаем при обращении к функции choose:

6. Подключите функцию к боту

Такая функция есть в ptbot :

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

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

Выведется что-то новенькое: . Вы вывели саму функцию принт! Так можно делать с любыми функциями:

Теперь выведется вот такое колдунство:

Название функции – это переменная, в которой лежит функция

Этой переменной можно орудовать как любой другой. Передавать как аргумент в другие функции, или класть в другие переменные:

Теперь в переменной a лежит функция print() и она может делать то же самое, что и print() , стоит лишь подставить круглые скобки справа от неё.

Так вот, вернёмся к нашему коду:

Здесь вы передаёте в метод bot.reply_on_message вашу функцию choose :

Метод reply_on_message будет ждать до тех пор, пока боту кто-нибудь не напишет. Как только боту напишет человек, reply_on_message запустит вашу функцию choose , вот так: choose(chat_id, question) . То есть теперь функцию запустят за вас, вам самим её вызывать не нужно.

На гифке ниже можно посмотреть как теперь работает бот. Теперь он отвечает только после того, как вы ему написали:

7. Создайте иллюзию раздумий

Бот отвечает мгновенно, не задумываясь. Люди так не делают, все сразу поймут, что отвечает бот. Пусть бот немного ждёт перед ответом, чтобы все думали, что это вы

В ptbot есть метод, отвечающий за таймеры, с помощью таймера можно сделать эту задержку:

Если запустить такой код, то таймер запустится сразу же, как только вы нажали Run . Когда пройдёт 5 секунд, запустится функция notify . Она выведет в консоль, что 5 секунд прошло.

Вам нужен другой алгоритм:

А вот как это сделать:

Когда боту пишут, он запускает функцию wait . Она ничего никому не пишет, а ставит таймер на 5 секунд.

Когда таймер пройдёт, запустится функция choose . Она запустится потому что мы передали её в метод bot.create_timer(5, choose) .

Запускаем… Опа, ошибка!

Знакомый TypeError , снова функция хотела меньше аргументов, чем получила.

Когда вы передали функцию wait в reply_on_message , он подсунул в неё 2 аргумента: chat_id, question . Нужно указать их при объявлении def wait(): :

Запускаем ещё раз… Теперь бот подождал 5 секунд и снова выдал TypeError :

На этот раз ситуация обратная, у choose есть 2 аргумента, chat_id и question , но их ему никто не передал.

Для этого нужно воспользоваться фичей библиотеки и заставить функцию wait “поделиться” аргументами:

Теперь бот наконец работает!

Напоследок стоит навести красоту, чтобы вас на смущало question=question . Эти аргументы можно переименовать как угодно, вот например:

Называйте аргументы как хотите. Главное, чтобы было понятно

Это было интересно… а что дальше?

Теперь вы можете писать простых ботов. Вы можете реализовать ещё несколько идей с использованием ptbot . Для них нужно знать конструкции if и for , но в остальном они очень простые и потребуют не больше сотни строк:

  • Бот, который каждый год поздравляет вас с Новым годом/Днём рождения или напоминает о годовщине свадьбы.
  • Бот для крестиков-ноликов
  • Бот для игры виселицу

Когда вы перерастёте возможности библиотеки ptbot , можно осваивать её старшего брата: python-telegram-bot. Эта библиотека умеет более крутые фичи и на ней можно писать более сложных ботов. Обращению с ней мы учим в модуле Чат-боты на Python.

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

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

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

Дополнительные фишки

Дополнительные функции

Нажмите на значок календаря

Отсюда, вы можете:

Звук уведомления

Уведомления

Отключение уведомлений

Наверняка вы задумывались, что было бы круто самому настроить напоминания в мессенджере о необходимости выпить воды или покормить питомца. В этой статье мы рассмотрим как легко и быстро создать Телеграмм чат-бота в Node-RED, создать тексты напоминаний и протестировать его.

Что такое Node-RED и как он работает?

Node-RED — браузерный редактор потоков данных, который позволяет легко объединять потоки данных, используя различные ноды , которые собираются в палитры ( node red palette) .

Нода — узел данных; ноды децентрализованной сети контактируют посредством P2P-протоколов для обмена информацией о блоках и транзакциях. Узел является основным строительным блоком потока.

Палитра Node-RED включает набор узлов по умолчанию , которые являются основными строительными блоками для создания потоков.

Узлы можно добавить в рабочую область, перетаскивая их из палитры, используя диалог быстрого добавления или импортируя из библиотеки или буфера обмена.

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

Встроенная библиотека нод позволяет сохранять полезные функции, шаблоны или потоки для повторного использования.

Использование Node-RED — бесплатно , кроме этого Node-RED с помощью API может интегрироваться к чему-угодно .

Аналоги Node-RED

Chatfuel — полезный инструмент, который позволяет создавать чат-роботов в Facebook. В Chatfuel можно обращаться к внешним источникам данных, с помощью плагинов и создавать своих собственных чат-ботов.

Botsify тоже дает возможность создавать чат-боты на виджете сайта или в Facebook мессенджере без каких-либо знаний в программировании. Botsify интегрирован со многими сервисами, включая WordPress, Shopify, Slack, Alexa, Google Sheets, RSS Feed, JSON API, ZenDesk. Простой в использовании интерфейс позволяет построить логику работы с помощью визуальных инструментов. Botsify — платный инструмент , и его стоимость зависит от количества создаваемых ботов и числа подписчиков ботов.

Недостатки аналогов Node-RED

Основные недостатки Botsify и Chatfuel — данные инструменты предназначаются или для работы только с одним мессенджером, или платные. Поэтому Node-RED является незаменимым инструментом для начала работы и ознакомлением с созданием ботов, так как сочетает в себе удобный интерфейс, функциональность и не требует дополнительных ресурсов.

Создать чат-бота в Телеграм на Node-RED

Для создания бота в Telegram необходимо зайти в приложение и найти @BotFather . После чего вызвать команду /newbot и дать название боту.


После этого генерируется токен, необходимый для подключения бота к Node-RED.

Установка Node-RED

Далее необходимо установить Node-RED на компьютер и запустить сервер с Node-RED на локальной машине. В Terminal на вашем Mac-компьютере выполните следующие команды:


Для устранения этой проблемы чаще всего используется ngrok (защищенные тоннели для передачи информации на localhost) или localtunnel. Ниже мы воспользуемся сервисом ngrok. Для этого нужно перейти по ссылке на сайт ngrok и зарегистрироваться. После ввода всех обязательных данных, необходимо скачать и разархивировать файл.


Далее откройте файл через Terminal компьютера. При регистрации каждому пользователю предоставляется токен авторизации, и чтобы данный использовать сервис необходимо в командной строке Terminal выполнить следующую команду:

[путь к месту где лежит ngrok]/ngrok authtoken [полученный при регистрации токен]


После чего запустите ngrok указав так же порт локальной машины. В данном случае, выполняем запуск с помощью следующей команды:

Настройка логики бота



В конечном итоге наша ссылка имеет следующий вид:



Заполнив все поля нажимаем Done и в верхнем правом углу нажимаем на кнопку Deploy . Кнопка Deploy сохраняет все изменения, которые были внесены во флоу, поэтому перед каждым тестом необходимо ее нажать, если она активна.



Если все описанные выше шаги выполнены верно, будет отображен ответ об успешном подключении со статус-кодом 200.



1. Указываем что именно мы отправляем, а не получаем или обновляем

2. Указываем кто будет “перевозить” наше письмо (разные токены = разные “перевозчики”, “перевозчик” = “бот”)

3. Ну и конечно же необходимо написать само послание и кому мы его отправим

5. Далее необходимо “перевезти” наше письмо. Так как мы указали уже всю информацию выбираем — set by msg. method



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

Для этого используем ноду change , которая позволяет устанавливать значения в параметры





Бот для напоминаний в Телеграм — готов

Без навыков программирования каждый может создать бота для напоминаний, о необходимости пить воду (каждую минуту, час или любой другой промежуток времени).


Кнопки с текстом в Телеграм оглашаются следующим образом:

каждое с [] в keyboard, оглашает новую кнопку, а текст в [] — отвечает за надпись, которая будет выводится на кнопке. Кнопки и текст размещаем в msg.payload, к функции также добавляем msg.method i msg.url.




Выберем, к примеру, первый вариант — Каждые полчаса.


Итого

В этой статье мы разобрались как работает Node-RED и как создать в Телеграмм чат-бота для напоминаний.

Процесс создания простого бота Телеграм для отслеживания времени


Таким образом мы подошли к выводу, что телеграм чат-боты довольно удобная и многофункциональная штука. Поэтому в этой статье и пойдет речь о написании простого чат-бота. Для примера я решил сделать трекер времени — простейший пример взаимодействия с telergram api.

Создание простого чат-бота

Для начала нужно создать — зарегистрировать самого бота в telegram. Ищем отца всех ботов @BotFather — тоже бот для регистрации ботов.

Пишем ему, что хотим создать своего чат-бота.

Следующей командой он просит придумать название. Так как мой бот будет трекать время — название соответствующее. Пишу:

Следующим шагом нужно задать юзернейм для бота (будет использоваться для поиска @username). Условие: username должен заканчиваться на bot или _bot. Пишу:

Готово! В ответе нам приходит токен — это значит, что мы зарегистрировали нового чат-бота.

Разработка

Для начала я решил посмотреть какие библиотеки предлагает нам интернет.

Оказалось вариантов не так мало. Тут можно ознакомится со всем списком предлагаемых вариантов.

Мой выбор пал на TelegramBotApiBundle для Symfony.

Бандл поддерживает работу с несколькими ботами одновременно. Кроме того есть вариант отладки (отправка только разработчику) и работа через прокси. Для тестового примера нам много не нужно — убираем все лишнее.


Также я вынес токен в переменную APP_TELEGRAM_TOKEN в .env


Немного теории

Telegram api, можно сказать, работает в двух режимах: можно самим получать обновления с сервера через метод getUpdates(), либо настроить webHook. Первый метод хорош тем, что он предельно прост, но плох тем, что нужно самостоятельно постоянно опрашивать сервер на предмет обновлений. Вариант с webhook же позволяет не думать о том, как получить обновления, а сосредоточится на их обработке. В этом случае telegram будет сам отправлять обновления на url, который мы укажем.

Преимущество второго подхода очевидны)

Для регистрации Webhook делаем следующее:

webhook в значении url — это роут, который мы сделаем немного позже. $botService — это объект сервиса Borsaco\TelegramBotApiBundle\Service\Bot, который можно инжектить в любом месте проекта.

Создаем контроллер. Это будет входная точка для запросов от telegram api, куда будут приходить обновления.


Для удобства я всю логику вынес в сервис MessageProcessor, куда передаю строку, полученную от telegram.

Смысл прост — есть 4 команды: help, start, stop, report.

На каждую команду есть свое поведение.

Также есть 2 ситуации, когда ответ будет говорить пользователю, что данное действие запрещено в данный момент (пока трекер времени не остановлен — нельзя начать новый. Соответственно — пока нет активного, остановить тоже ничего нельзя).

Я добавил такие сущности:

    • User, у которого есть поля name, telegramId и коллекция timeLines,
    • TimeLine, у которой есть дата начала и дата конца: startedAt, stopedAt.

То есть user может иметь несколько timelines (у которых есть время старта и время остановки).

Нам приходит json строка, первое что я делаю — это декодирую строку и получаю объект:

Дальше проверяю есть ли такой пользователь в базе (данные о пользователе, написавшем боту берутся из response->message->from). Если пользователя нет — создаем.

Теперь проверяем полученную команду — входит ли она в список команд, которые мы можем обработать. И теперь на основании того, что нам прислали отправляем ответ.

Если это команды start или stop — создаем TimeLine для этого пользователя или завершаем текущий соответственно и сообщаем пользователю об этом.

Если это report — подсчитываем время во всех timeline за сегодня и отправляем суммарное количество часов и минут пользователю.

Так как это тестовый пример, я ограничился простым switch / case для выбора команд.

Общий вид сервиса:



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


Вывод

Как итог можно смело сказать, что telegram api достаточно функционально и просто в освоении. Большим плюсом является хорошая документация и наличие готовых библиотек для использования.

Читайте также: